diff -u --recursive --new-file v2.4.14/linux/CREDITS linux/CREDITS
--- v2.4.14/linux/CREDITS	Mon Nov  5 15:55:25 2001
+++ linux/CREDITS	Sun Nov 11 10:09:32 2001
@@ -1611,8 +1611,10 @@
 W: http://www.kroah.com/linux-usb/
 D: USB Serial Converter driver framework, USB Handspring Visor driver
 D: ConnectTech WHITEHeat USB driver, Generic USB Serial driver
-D: USB Bluetooth driver
+D: USB I/O Edgeport driver, USB Serial IrDA driver
+D: USB Bluetooth driver, USB Skeleton driver
 D: bits and pieces of USB core code.
+D: PCI Hotplug core, PCI Hotplug Compaq driver modifications
 
 N: Russell Kroll
 E: rkroll@exploits.org
diff -u --recursive --new-file v2.4.14/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v2.4.14/linux/Documentation/Configure.help	Mon Nov  5 15:55:25 2001
+++ linux/Documentation/Configure.help	Tue Nov 13 17:45:27 2001
@@ -1,62 +1,71 @@
-# Maintained by Axel Boldt (axel@uni-paderborn.de)
+# Maintained by:
+#	Eric S. Raymond <mailto:esr@thyrsus.com>
+#	Steven Cole <mailto:elenstev@mesatop.com>
+#
+# Merged version 2.49: Current with 2.4.15-pre1 and 2.4.13-ac8.
 #
 # This version of the Linux kernel configuration help texts
 # corresponds to the kernel versions 2.4.x.
 #
 # Translations of this file available on the WWW:
 #
-#   - Japanese, maintained by the JF Project (JF@linux.or.jp), at
-#     http://www.linux.or.jp/JF/JFdocs/Configure.help/
-#   - Russian, by kaf@linux.nevod.perm.su, at
-#     http://nevod.perm.su/service/linux/doc/kernel/Configure.help
-#   - French, by Pierre Tane (tanep@bigfoot.com), at
-#     http://www.traduc.org/kernelfr
-#   - Spanish, by Carlos Perelló Marín (fperllo@ehome.encis.es), at
-#     http://visar.csustan.edu/~carlos/
-#     XXX: Site has moved, new location has no Configure.help trans.
-#   - Italian, by Alessandro Rubini (rubini@linux.it), at
-#     ftp://ftp-pavia1.linux.it/pub/linux/Configure.help
-#     XXX: ftp-pavia1.linux.it: Non-existent host/domain
-#   - Polish, by Cezar Cichocki (cezar@cs.net.pl), at
-#     http://www.cs.net.pl/~cezar/Kernel
-#   - German, by SuSE, at http://www.suse.de/~ke/kernel . This patch
+#   - Japanese, maintained by the JF Project <mailto:JF@linux.or.jp>, at
+#     <http://www.linux.or.jp/JF/JFdocs/Configure.help/>
+#   - Russian, by <mailto:kaf@linux.nevod.perm.su>, at
+#     <http://nevod.perm.su/service/linux/doc/kernel/Configure.help>
+#   - French, by Pierre Tane <mailto:tanep@bigfoot.com>, at
+#     <http://www.traduc.org/kernelfr>
+#   - Polish, by Dominik Mierzejewski <mailto:dmierzej@elka.pw.edu.pl>, at
+#     <http://home.elka.pw.edu.pl/~dmierzej/linux/kernel/>
+#   - German, by SuSE, at <http://www.suse.de/~ke/kernel>. This patch
 #     also includes infrastructure to support different languages.
 #
 # To access a document on the WWW, you need to have a direct Internet
 # connection and a browser program such as netscape or lynx. If you
 # only have email access, you can still use FTP and WWW servers: send
-# an email to mail-server@rtfm.mit.edu with the text 
-#   send usenet/news.answers/internet-services/access-via-email 
+# an email to <mailto:mail-server@rtfm.mit.edu> with the text
+#   send usenet/news.answers/internet-services/access-via-email
 # in the body of the message.
 #
 # Information about what a kernel is, what it does, how to patch and
 # compile it and much more is contained in the Kernel-HOWTO, available
-# at http://www.linuxdoc.org/docs.html#howto . Before you start
+# at <http://www.linuxdoc.org/docs.html#howto>. Before you start
 # compiling, make sure that you have the necessary versions of all
 # programs and libraries required to compile and run this kernel; they
-# are listed in the file Documentation/Changes. Make sure to read the
+# are listed in the <file:Documentation/Changes>. Make sure to read the
 # toplevel kernel README file as well.
 #
-# Format of this file: description<nl>variable<nl>help text<nl><nl>. If
-# the question being documented is of type "choice", we list only the
-# first occurring config variable. The help texts may contain empty
-# lines, but every non-empty line must be indented two positions.
-# Order of the help texts does not matter, however, no variable should
-# be documented twice: if it is, only the first occurrence will be
-# used by Configure. We try to keep the help texts of related variables
-# close together. Lines starting with `#' are ignored. To be nice to
-# menuconfig, limit your line length to 70 characters. Use emacs'
+# Format of this file: description<nl>variable<nl>help text<nl><nl>.
+# The help texts may contain empty lines, but every non-empty line must
+# be indented two positions.  Order of the help texts does not matter,
+# however, no variable should be documented twice: if it is, only the
+# first occurrence will be used. We try to keep the help texts of related
+# variables close together. Lines starting with `#' are ignored. To be
+# nice to menuconfig, limit your line length to 70 characters. Use emacs'
 # kfill.el to edit and ispell.el to spell check this file or you lose.
 #
+# Comments of the form "# Choice:" followed by a menu name are used
+# internally by the maintainers' consistency-checking tools.
+#
 # If you add a help text to this file, please try to be as gentle as
 # possible. Don't use unexplained acronyms and generally write for the
 # hypothetical ignorant but intelligent user who has just bought a PC,
 # removed Windows, installed Linux and is now recompiling the kernel
-# for the first time. Tell them what to do if they're unsure. Technical 
+# for the first time. Tell them what to do if they're unsure. Technical
 # information should go in a README in the Documentation directory.
+#
 # Mention all the relevant READMEs and HOWTOs in the help text.
+# Make them file URLs relative to the top level of the source tree so
+# that help browsers can turn them into hotlinks.  All URLs ahould be
+# surrounded by <>.
+#
 # Repetitions are fine since the help texts are not meant to be read
-# in sequence.
+# in sequence.  It is good style to include URLs pointing to more
+# detailed technical information, pictures of the hardware, etc.
+#
+# The most important thing to include in a help entry is *motivation*.
+# Explain why someone configuring a kernel might want to select your
+# option.
 #
 # All this was shamelessly stolen from several different sources. Many
 # thanks to all the contributors. Feel free to use these help texts in
@@ -66,21 +75,22 @@
 
 Prompt for development and/or incomplete code/drivers
 CONFIG_EXPERIMENTAL
-  Some of the various things that Linux supports (such as network 
-  drivers, file systems, network protocols, etc.) can be in a state 
-  of development where the functionality, stability, or the level of 
+  Some of the various things that Linux supports (such as network
+  drivers, file systems, network protocols, etc.) can be in a state
+  of development where the functionality, stability, or the level of
   testing is not yet high enough for general use. This is usually
-  known as the "alpha-test" phase amongst developers. If a feature is
-  currently in alpha-test, then the developers usually discourage 
+  known as the "alpha-test" phase among developers. If a feature is
+  currently in alpha-test, then the developers usually discourage
   uninformed widespread use of this feature by the general public to
   avoid "Why doesn't this work?" type mail messages. However, active
   testing and use of these systems is welcomed. Just be aware that it
   may not meet the normal level of reliability or it may fail to work
   in some special cases. Detailed bug reports from people familiar
   with the kernel internals are usually welcomed by the developers
-  (before submitting bug reports, please read the documents README,
-  MAINTAINERS, REPORTING-BUGS, Documentation/BUG-HUNTING, and
-  Documentation/oops-tracing.txt in the kernel source). 
+  (before submitting bug reports, please read the documents
+  <file:README>, <file:MAINTAINERS>, <file:REPORTING-BUGS>,
+  <file:Documentation/BUG-HUNTING>, and
+  <file:Documentation/oops-tracing.txt> in the kernel source).
 
   This option will also make obsoleted drivers available. These are
   drivers that have been replaced by something else, and/or are
@@ -89,11 +99,18 @@
   Unless you intend to help test and develop a feature or driver that
   falls into this category, or you have a situation that requires
   using these features, you should probably say N here, which will
-  cause this configure script to present you with fewer choices. If
+  cause the configurator to present you with fewer choices. If
   you say Y here, you will be offered the choice of using features or
   drivers that are currently considered to be in the alpha-test phase.
 
-Symmetric Multi Processing
+Prompt for drivers for obsolete features and hardware
+CONFIG_OBSOLETE
+  Obsolete drivers have usually been replaced by more recent software
+  that can talk to the same hardware.  Obsolete hardware is things
+  like MGA monitors that you are very unlikely to see on today's
+  systems.
+
+Symmetric Multi-Processing support
 CONFIG_SMP
   This enables support for systems with more than one CPU. If you have
   a system with only one CPU, like most personal computers, say N. If
@@ -114,12 +131,106 @@
   Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
   Management" code will be disabled if you say Y here.
 
-  See also the files Documentation/smp.tex, Documentation/smp.txt,
-  Documentation/i386/IO-APIC.txt, Documentation/nmi_watchdog.txt and the 
-  SMP-FAQ on the WWW at http://www.irisa.fr/prive/mentre/smp-faq/ .
-  
+  See also the <file:Documentation/smp.tex>,
+  <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
+  <file:Documentation/nmi_watchdog.txt> and the SMP-FAQ on the WWW at
+  <http://www.irisa.fr/prive/mentre/smp-faq/>.
+
   If you don't know what to do here, say N.
 
+Intel or compatible 80x86 processor
+CONFIG_X86
+  This is Linux's home port.  Linux was originally native to the Intel
+  386, and runs on all the later x86 processors including the Intel
+  486, 586, Pentiums, and various instruction-set-compatible chips by
+  AMD, Cyrix, and others.
+
+Alpha processor
+CONFIG_ALPHA
+  The Alpha is a 64-bit general-purpose processor designed and
+  marketed by the Digital Equipment Corporation of blessed memory, now
+  Compaq.  Alpha Linux dates from 1995-1996 and was the first non-x86
+  port. The Alpha Linux project has a home page at
+  <http://www.alphalinux.org/>.
+
+32-bit Sun Sparc
+CONFIG_SPARC32
+  SPARC is a family of RISC microprocessors designed and marketed by
+  Sun Microsystems, incorporated.  They are very widely found in Sun
+  workstations and clones. This port covers the original 32-bit SPARC;
+  it is old and stable and usually considered one of the "big three"
+  along with the Intel and Alpha ports.  The UltraLinux project
+  maintains both the SPARC32 and SPARC64 ports; its web page is
+  available at <http://www.ultralinux.org/>.
+
+64-bit Sun Sparc
+CONFIG_SPARC64
+  SPARC is a family of RISC microprocessors designed and marketed by
+  Sun Microsystems, incorporated.  This port covers the newer 64-bit
+  UltraSPARC.  The UltraLinux project maintains both the SPARC32 and
+  SPARC64 ports; its web page is available at
+  <http://www.ultralinux.org/>.
+
+Power PC processor
+CONFIG_PPC
+  The PowerPC is a very capable 32-bit RISC processor from Motorola,
+  the successor to their 68000 and 88000 series.  It powers recent
+  Macintoshes and also a widely-used series of single-board computers
+  from Motorola.  The Linux PowerPC port has a home page at
+  <http://penguinppc.org/>.
+
+Motorola 68K processors
+CONFIG_M68K
+  The Motorola 68K microprocessors are now obsolete, having been
+  superseded by the PowerPC line also from Motorola.  But they powered
+  the first wave of workstation hardware in the 1980s, including Sun
+  workstations; they were also the basis of the original Amiga and
+  later Atari personal computers.  A lot of this hardware is still
+  around.  The m68k project has a home page at
+  <http://www.linux-m68k.org/>.
+
+ARM processors
+CONFIG_ARM
+  The ARM series is a line of low-power-consumption RISC chip designs
+  licensed by ARM ltd and targeted at embedded applications and
+  handhelds such as the Compaq IPAQ.  ARM-based PCs are no longer
+  manufactured, but  legacy ARM-based PC hardware remains popular in
+  Europe.  There is an ARM Linux project with a web page at
+  <http://www.arm.linux.org.uk/>.
+
+SuperH processors
+CONFIG_SUPERH
+  The SuperH is a RISC processor targeted for use in embedded systems
+  and consumer electronics; it was also used in the Sega Dreamcast
+  gaming console.  The SuperH port has a home page at
+  <http://www.sh-linux.org/>.
+
+IA64 processors, including Intel Itanium
+CONFIG_IA64
+  The Itanium is Intel's 64-bit successor to the 32-bit X86 line.  As
+  of early 2001 it is not yet in widespread production use.  The Linux
+  IA-64 project has a home page at <http://www.linuxia64.org/>.
+
+HP PA-RISC processor
+CONFIG_PARISC
+  The PA-RISC microprocessor is a RISC chip designed by
+  Hewlett-Packard and used in their line of workstations.  The PA-RISC
+  Linux project has a home page at <www.parisc-linux.org>.
+
+IBM System/390
+CONFIG_S390
+  Linux now runs on the venerable System/390 mainframe from IBM, in a
+  guest partition under VM.  In fact, over 40,000 simultaneous Linux
+  images have been run on a single mainframe!  The S390 Linux project
+  has a home page at <http://linux.s390.org/>.
+
+Axis Communications ETRAX 100LX embedded network CPU
+CONFIG_CRIS
+  Linux has been ported to run on the Axis Communications ETRAX 100LX
+  CPU and the single-board computers built around it, targeted for
+  network and embedded applications.  For more information see the
+  Axis Communication site, <http://developer.axis.com/>.
+
 Multiquad support for NUMA systems
 CONFIG_MULTIQUAD
   This option is used for getting Linux to run on a (IBM/Sequent) NUMA 
@@ -127,7 +238,7 @@
   and uses Clustered Logical APIC addressing mode instead of Flat Logical.
   You will need a new lynxer.elf file to flash your firmware with - send
   email to Martin.Bligh@us.ibm.com
-  
+
 IO-APIC Support on Uniprocessors
 CONFIG_X86_UP_IOAPIC
   An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an
@@ -160,7 +271,7 @@
   a math coprocessor built in, 486SX and 386 do not, unless you added
   a 487DX or 387, respectively. (The messages during boot time can
   give you some hints here ["man dmesg"].) Everyone needs either a
-  coprocessor or this emulation. 
+  coprocessor or this emulation.
 
   If you don't have a math coprocessor, you need to say Y here; if you
   say Y here even though you have a coprocessor, the coprocessor will
@@ -172,7 +283,7 @@
   intend to use this kernel on different machines.
 
   More information about the internals of the Linux math coprocessor
-  emulation can be found in arch/i386/math-emu/README.
+  emulation can be found in <file:arch/i386/math-emu/README>.
 
   If you are not sure, say Y; apart from resulting in a 66 KB bigger
   kernel, it won't hurt.
@@ -211,12 +322,13 @@
   functions. You may choose to use both, but the Timer LED function
   will overrule the CPU usage LED.
 
-Kernel FP software completion (EXPERIMENTAL)
+Kernel FP software completion
 CONFIG_MATHEMU
   This option is required for IEEE compliant floating point arithmetic
   on the Alpha. The only time you would ever not say Y is to say M in
   order to debug the code. Say Y unless you know what you are doing.
 
+# Choice: himem
 High Memory support
 CONFIG_NOHIGHMEM
   Linux can use up to 64 Gigabytes of physical memory on x86 systems.
@@ -248,23 +360,45 @@
   auto detected or can be forced by using a kernel command line option
   such as "mem=256M". (Try "man bootparam" or see the documentation of
   your boot loader (lilo or loadlin) about how to pass options to the
-  kernel at boot time.) 
+  kernel at boot time.)
 
   If unsure, say "off".
 
+4GB
+CONFIG_HIGHMEM4G
+  Select this if you have a 32-bit processor and between 1 and 4
+  gigabytes of physical RAM.
+
+64GB
+CONFIG_HIGHMEM64G
+  Select this if you have a 32-bit processor and more than 4
+  gigabytes of physical RAM.
+
 Normal PC floppy disk support
 CONFIG_BLK_DEV_FD
   If you want to use the floppy disk drive(s) of your PC under Linux,
   say Y. Information about this driver, especially important for IBM
-  Thinkpad users, is contained in Documentation/floppy.txt. That file
-  also contains the location of the Floppy driver FAQ as well as
-  location of the fdutils package used to configure additional
+  Thinkpad users, is contained in <file:Documentation/floppy.txt>.
+  That file also contains the location of the Floppy driver FAQ as
+  well as location of the fdutils package used to configure additional
   parameters of the driver at run time.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called floppy.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
+
+iSeries Virtual I/O Disk Support
+CONFIG_VIODASD
+  If you are running on an iSeries system and you want to use
+  virtual disks created and managed by OS/400, say Y.
+
+iSeries Virtual I/O Disk IDE Emulation
+CONFIG_VIODASD_IDE
+  This causes the iSeries virtual disks to look like IDE disks.
+  If you have programs or utilities that only support certain
+  kinds of disks, this option will cause iSeries virtual disks
+  to pretend to be IDE disks, which may satisfy the program.
 
 Support for PowerMac floppy
 CONFIG_MAC_FLOPPY
@@ -278,15 +412,15 @@
   write to it and do all the other things that you can do with normal
   block devices (such as hard drives). It is usually used to load and
   store a copy of a minimal root file system off of a floppy into RAM
-  during the initial install of Linux. 
+  during the initial install of Linux.
 
   Note that the kernel command line option "ramdisk=XX" is now
-  obsolete. For details, read Documentation/ramdisk.txt.
+  obsolete. For details, read <file:Documentation/ramdisk.txt>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M and read Documentation/modules.txt. The module will be called
-  rd.o. 
+  say M and read <file:Documentation/modules.txt>. The module will be
+  called rd.o.
 
   Most normal users won't need the RAM disk functionality, and can
   thus say N here.
@@ -301,15 +435,15 @@
   The initial RAM disk is a RAM disk that is loaded by the boot loader
   (loadlin or lilo) and that is mounted as root before the normal boot
   procedure. It is typically used to load modules needed to mount the
-  "real" root file system, etc. See Documentation/initrd.txt for
-  details.
+  "real" root file system, etc. See <file:Documentation/initrd.txt>
+  for details.
 
-Loop device support
+Loopback device support
 CONFIG_BLK_DEV_LOOP
   Saying Y here will allow you to use a regular file as a block
   device; you can then create a file system on that block device and
   mount it just as you would mount other block devices such as hard
-  drive partitions, CDROM drives or floppy drives. The loop devices
+  drive partitions, CD-ROM drives or floppy drives. The loop devices
   are block special device files with major number 7 and typically
   called /dev/loop0, /dev/loop1 etc.
 
@@ -318,7 +452,7 @@
   writing them to floppy. Furthermore, some Linux distributions avoid
   the need for a dedicated Linux partition by keeping their complete
   root file system inside a DOS FAT file using this loop device
-  driver. 
+  driver.
 
   The loop device driver can also be used to "hide" a file system in a
   disk partition, floppy, or regular file, either using encryption
@@ -326,58 +460,58 @@
   bits of, say, a sound file). This is also safe if the file resides
   on a remote file server. If you want to do this, you will first have
   to acquire and install a kernel patch from
-  ftp://ftp.kerneli.org/pub/kerneli/ , and then you need to
+  <ftp://ftp.kerneli.org/pub/kerneli/>, and then you need to
   say Y to this option.
 
   Note that alternative ways to use encrypted file systems are
   provided by the cfs package, which can be gotten from
-  ftp://ftp.kerneli.org/pub/kerneli/net-source/ , and the newer tcfs
-  package, available at http://tcfs.dia.unisa.it/ . You do not need to
-  say Y here if you want to use one of these. However, using cfs
+  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>, and the newer tcfs
+  package, available at <http://tcfs.dia.unisa.it/>. You do not need
+  to say Y here if you want to use one of these. However, using cfs
   requires saying Y to "NFS file system support" below while using
   tcfs requires applying a kernel patch. An alternative steganography
   solution is provided by StegFS, also available from
-  ftp://ftp.kerneli.org/pub/kerneli/net-source/ .
+  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>.
 
   To use the loop device, you need the losetup utility and a recent
   version of the mount program, both contained in the util-linux
   package. The location and current version number of util-linux is
-  contained in the file Documentation/Changes.
+  contained in the file <file:Documentation/Changes>.
 
   Note that this loop device has nothing to do with the loopback
   device used for network connections from the machine to itself.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called loop.o.
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called loop.o.
 
   Most users will answer N here.
 
-Network Block Device support
+Network block device support
 CONFIG_BLK_DEV_NBD
   Saying Y here will allow your computer to be a client for network
   block devices, i.e. it will be able to use block devices exported by
   servers (mount file systems on them etc.). Communication between
   client and server works over TCP/IP networking, but to the client
   program this is hidden: it looks like a regular local file access to
-  a block device special file such as /dev/nd0. 
+  a block device special file such as /dev/nd0.
 
   Network block devices also allows you to run a block-device in
   userland (making server and client physically the same computer,
   communicating using the loopback network device).
-  
-  Read Documentation/nbd.txt for more information, especially about
-  where to find the server code, which runs in user space and does not
-  need special kernel support.
+
+  Read <file:Documentation/nbd.txt> for more information, especially
+  about where to find the server code, which runs in user space and
+  does not need special kernel support.
 
   Note that this has nothing to do with the network file systems NFS
   or Coda; you can say N here even if you intend to use NFS or Coda.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called nbd.o.
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called nbd.o.
 
   If unsure, say N.
 
@@ -385,16 +519,16 @@
 CONFIG_IDE
   If you say Y here, your kernel will be able to manage low cost mass
   storage units such as ATA/(E)IDE and ATAPI units. The most common
-  cases are IDE hard drives and ATAPI CDROM drives.
+  cases are IDE hard drives and ATAPI CD-ROM drives.
 
   If your system is pure SCSI and doesn't use these interfaces, you
   can say N here.
- 
+
   Integrated Disk Electronics (IDE aka ATA-1) is a connecting standard
   for mass storage units such as hard disks. It was designed by
   Western Digital and Compaq Computer in 1984. It was then named
   ST506. Quite a number of disks use the IDE interface.
-	
+
   AT Attachment (ATA) is the superset of the IDE specifications.
   ST506 was also called ATA-1.
 
@@ -407,22 +541,22 @@
   ATA/IDE standards by means of fast DMA controllers.
 
   ATA Packet Interface (ATAPI) is a protocol used by EIDE tape and
-  CDROM drives, similar in many respects to the SCSI protocol.
-  
+  CD-ROM drives, similar in many respects to the SCSI protocol.
+
   SMART IDE (Self Monitoring, Analysis and Reporting Technology) was
   designed in order to prevent data corruption and disk crash by
   detecting pre hardware failure conditions (heat, access time, and
-  the like...). Disks built since June 1995 may follow this
-  standard. The kernel itself don't manage this; however there are
-  quite a number of user programs such as smart that can query the
-  status of SMART parameters disk.
+  the like...). Disks built since June 1995 may follow this standard.
+  The kernel itself don't manage this; however there are quite a
+  number of user programs such as smart that can query the status of
+  SMART parameters disk.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ide.o.
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called ide.o.
 
-  For further information, please read Documentation/ide.txt.
+  For further information, please read <file:Documentation/ide.txt>.
 
   If unsure, say Y.
 
@@ -436,21 +570,21 @@
   Useful information about large (>540 MB) IDE disks, multiple
   interfaces, what to do if ATA/IDE devices are not automatically
   detected, sound card ATA/IDE ports, module support, and other
-  topics, is contained in Documentation/ide.txt. For detailed
+  topics, is contained in <file:Documentation/ide.txt>. For detailed
   information about hard drives, consult the Disk-HOWTO and the
   Multi-Disk-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   To fine-tune ATA/IDE drive/interface parameters for improved
   performance, look for the hdparm package at
-  http://www.ibiblio.org/pub/Linux/system/hardware .
+  <http://www.ibiblio.org/pub/Linux/system/hardware>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt and
-  Documentation/ide.txt. The module will be called ide-mod.o. Do not
-  compile this driver as a module if your root file system (the one
-  containing the directory /) is located on an IDE device.
+  say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/ide.txt>. The module will be called ide-mod.o.
+  Do not compile this driver as a module if your root file system (the
+  one containing the directory /) is located on an IDE device.
 
   If you have one or more IDE drives, say Y or M here. If your system
   has no IDE drives, or if memory requirements are really tight, you
@@ -467,42 +601,42 @@
   since it lacks the enhanced functionality of the new one. This makes
   it a good choice for systems with very tight memory restrictions, or
   for systems with only older MFM/RLL/ESDI drives. Choosing the old
-  driver can save 13 KB or so of kernel memory. 
+  driver can save 13 KB or so of kernel memory.
 
   If you are unsure, then just choose the Enhanced IDE/MFM/RLL driver
   instead of this one. For more detailed information, read the
   Disk-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
 Use old disk-only driver on primary interface
 CONFIG_BLK_DEV_HD_IDE
-  There are two drivers for MFM/RLL/IDE disks. Most people use just
-  the new enhanced driver by itself. This option however installs the
+  There are two drivers for MFM/RLL/IDE disks.  Most people use just
+  the new enhanced driver by itself.  This option however installs the
   old hard disk driver to control the primary IDE/disk interface in
   the system, leaving the new enhanced IDE driver to take care of only
-  the 2nd/3rd/4th IDE interfaces. Doing this will prevent you from
-  having an IDE/ATAPI CDROM or tape drive connected to the primary IDE
-  interface. Choosing this option may be useful for older systems
+  the 2nd/3rd/4th IDE interfaces.  Doing this will prevent you from
+  having an IDE/ATAPI CD-ROM or tape drive connected to the primary
+  IDE interface.  Choosing this option may be useful for older systems
   which have MFM/RLL/ESDI controller+drives at the primary port
   address (0x1f0), along with IDE drives at the secondary/3rd/4th port
-  addresses. 
+  addresses.
 
   Normally, just say N here; you will then use the new driver for all
   4 interfaces.
 
 Include IDE/ATA-2 DISK support
 CONFIG_BLK_DEV_IDEDISK
-  This will include enhanced support for MFM/RLL/IDE hard disks. If
+  This will include enhanced support for MFM/RLL/IDE hard disks.  If
   you have a MFM/RLL/IDE disk, and there is no special reason to use
-  the old hard disk driver instead, say Y. If you have an SCSI-only
+  the old hard disk driver instead, say Y.  If you have an SCSI-only
   system, you can say N here.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ide-disk.o. Do not compile this driver as a module if your
-  root file system (the one containing the directory /) is located on
-  the IDE disk. If unsure, say Y.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-disk.o.  Do not compile this driver as a module
+  if your root file system (the one containing the directory /) is
+  located on the IDE disk. If unsure, say Y.
 
 Use multi-mode by default
 CONFIG_IDEDISK_MULTI_MODE
@@ -513,38 +647,43 @@
 
   If in doubt, say N.
 
-Include IDE/ATAPI CDROM support
+PCMCIA IDE support
+CONFIG_BLK_DEV_IDECS
+  Support for outboard IDE disks, tape drives, and CD-ROM drives
+  connected through a  PCMCIA card.
+
+Include IDE/ATAPI CD-ROM support
 CONFIG_BLK_DEV_IDECD
-  If you have a CDROM drive using the ATAPI protocol, say Y. ATAPI is
-  a newer protocol used by IDE CDROM and TAPE drives, similar to the
-  SCSI protocol. Most new CDROM drives use ATAPI, including the
+  If you have a CD-ROM drive using the ATAPI protocol, say Y. ATAPI is
+  a newer protocol used by IDE CD-ROM and TAPE drives, similar to the
+  SCSI protocol. Most new CD-ROM drives use ATAPI, including the
   NEC-260, Mitsumi FX400, Sony 55E, and just about all non-SCSI
   double(2X) or better speed drives.
 
-  If you say Y here, the CDROM drive will be identified at boot time
+  If you say Y here, the CD-ROM drive will be identified at boot time
   along with other IDE devices, as "hdb" or "hdc", or something
   similar (check the boot messages with dmesg). If this is your only
-  CDROM drive, you can say N to all other CDROM options, but be sure
-  to say Y or M to "ISO 9660 CDROM file system support".
+  CD-ROM drive, you can say N to all other CD-ROM options, but be sure
+  to say Y or M to "ISO 9660 CD-ROM file system support".
 
-  Read the CDROM-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto and the file
-  Documentation/cdrom/ide-cd. Note that older versions of lilo (the
-  Linux boot loader) cannot properly deal with IDE/ATAPI CDROMs, so
-  install lilo-16 or higher, available from
-  ftp://metalab.unc.edu/pub/Linux/system/boot/lilo .
+  Read the CD-ROM-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto> and
+  <file:Documentation/cdrom/ide-cd>. Note that older versions of lilo
+  (the Linux boot loader) cannot properly deal with IDE/ATAPI CD-ROMs,
+  so install lilo-16 or higher, available from
+  <ftp://metalab.unc.edu/pub/Linux/system/boot/lilo>.
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ide-cd.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-cd.o.
 
 Include IDE/ATAPI TAPE support
 CONFIG_BLK_DEV_IDETAPE
   If you have an IDE tape drive using the ATAPI protocol, say Y.
-  ATAPI is a newer protocol used by IDE tape and CDROM drives, similar
-  to the SCSI protocol. If you have an SCSI tape drive however, you
-  can say N here.
+  ATAPI is a newer protocol used by IDE tape and CD-ROM drives,
+  similar to the SCSI protocol.  If you have an SCSI tape drive
+  however, you can say N here.
 
   You should also say Y if you have an OnStream DI-30 tape drive; this
   will not work with the SCSI protocol, until there is support for the
@@ -553,27 +692,27 @@
   If you say Y here, the tape drive will be identified at boot time
   along with other IDE devices, as "hdb" or "hdc", or something
   similar, and will be mapped to a character device such as "ht0"
-  (check the boot messages with dmesg). Be sure to consult the
-  drivers/ide/ide-tape.c and Documentation/ide.txt files for usage
-  information.
+  (check the boot messages with dmesg).  Be sure to consult the
+  <file:drivers/ide/ide-tape.c> and <file:Documentation/ide.txt> files
+  for usage information.
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ide-tape.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-tape.o.
 
 Include IDE/ATAPI FLOPPY support
 CONFIG_BLK_DEV_IDEFLOPPY
   If you have an IDE floppy drive which uses the ATAPI protocol,
-  answer Y. ATAPI is a newer protocol used by IDE CDROM/tape/floppy
-  drives, similar to the SCSI protocol. 
+  answer Y.  ATAPI is a newer protocol used by IDE CD-ROM/tape/floppy
+  drives, similar to the SCSI protocol.
 
   The LS-120 and the IDE/ATAPI Iomega ZIP drive are also supported by
   this driver. For information about jumper settings and the question
   of when a ZIP drive uses a partition table, see
-  http://www.win.tue.nl/~aeb/linux/zip/zip-1.html .
+  <http://www.win.tue.nl/~aeb/linux/zip/zip-1.html>.
   (ATAPI PD-CD/CDR drives are not supported by this driver; support
-  for PD-CD/CDR drives is available if you answer Y to 
+  for PD-CD/CDR drives is available if you answer Y to
   "SCSI emulation support", below).
 
   If you say Y here, the FLOPPY drive will be identified along with
@@ -582,8 +721,8 @@
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ide-floppy.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-floppy.o.
 
 SCSI emulation support
 CONFIG_BLK_DEV_IDESCSI
@@ -625,7 +764,7 @@
   conditions. Say Y here to include code which tries to automatically
   detect and correct the problems under Linux. This option also
   enables access to the secondary IDE ports in some CMD640 based
-  systems. 
+  systems.
 
   This driver will work automatically in PCI based systems (most new
   systems have PCI slots). But if your system uses VESA local bus
@@ -636,15 +775,15 @@
 
   The CMD640 chip is also used on add-in cards by Acculogic, and on
   the "CSA-6400E PCI to IDE controller" that some people have. For
-  details, read Documentation/ide.txt. 
+  details, read <file:Documentation/ide.txt>.
 
 CMD640 enhanced support
 CONFIG_BLK_DEV_CMD640_ENHANCED
   This option includes support for setting/autotuning PIO modes and
-  prefetch on CMD640 IDE interfaces. For details, read
-  Documentation/ide.txt. If you have a CMD640 IDE interface and your
-  BIOS does not already do this for you, then say Y here. Otherwise
-  say N.
+  prefetch on CMD640 IDE interfaces.  For details, read
+  <file:Documentation/ide.txt>. If you have a CMD640 IDE interface
+  and your BIOS does not already do this for you, then say Y here.
+  Otherwise say N.
 
 RZ1000 chipset bugfix/support
 CONFIG_BLK_DEV_RZ1000
@@ -654,14 +793,14 @@
   severe data corruption under many conditions. Say Y here to include
   code which automatically detects and corrects the problem under
   Linux. This may slow disk throughput by a few percent, but at least
-  things will operate 100% reliably. 
+  things will operate 100% reliably.
 
 Generic PCI IDE chipset support
 CONFIG_BLK_DEV_IDEPCI
   Say Y here for PCI systems which use IDE drive(s).
   This option helps the IDE driver to automatically detect and
   configure all PCI-based IDE interfaces in your system.
-  
+
 Support for sharing PCI IDE interrupts
 CONFIG_IDEPCI_SHARE_IRQ
   Some ATA/IDE chipsets have hardware support which allows for
@@ -681,14 +820,14 @@
   for these drives, but you can change that by saying Y to the
   following question "Use DMA by default when available". You can get
   the latest version of the hdparm utility from
-  ftp://metalab.unc.edu/pub/Linux/system/hardware/ .
+  <ftp://metalab.unc.edu/pub/Linux/system/hardware/>.
 
-  Read the comments at the beginning of drivers/ide/ide-dma.c and
-  the file Documentation/ide.txt for more information.
+  Read the comments at the beginning of <file:drivers/ide/ide-dma.c>
+  and the file <file:Documentation/ide.txt> for more information.
 
   It is safe to say Y to this question.
 
-Good-Bad DMA Model-Firmware (EXPERIMENTAL)
+Good-Bad DMA Model-Firmware (WIP)
 CONFIG_IDEDMA_NEW_DRIVE_LISTINGS
   If you say Y here, the model and firmware revision of your drive
   will be compared against a blacklist of buggy drives that claim to
@@ -701,6 +840,16 @@
 
   If in doubt, say N.
 
+Attempt to HACK around Chipsets that TIMEOUT (WIP)
+CONFIG_BLK_DEV_IDEDMA_TIMEOUT
+  If you say Y here, this is a NASTY UGLY HACK!
+
+  We have to issue an abort and requeue the request DMA engine got
+  turned off by a goofy ASIC, and we have to clean up the mess, and
+  here is as good as any.  Do it globally for all chipsets.
+
+  If in doubt, say N.
+
 Boot off-board chipsets first support
 CONFIG_BLK_DEV_OFFBOARD
   Normally, IDE controllers built into the motherboard (on-board
@@ -722,7 +871,7 @@
 
   If in doubt, say N.
 
-Use DMA by default when available
+Use PCI DMA by default when available
 CONFIG_IDEDMA_PCI_AUTO
   Prior to kernel version 2.1.112, Linux used to automatically use
   DMA for IDE drives and chipsets which support it. Due to concerns
@@ -738,29 +887,39 @@
 
 IGNORE word93 Validation BITS
 CONFIG_IDEDMA_IVB
-  Since various rules were applied and created ... et al. as it relates
-  the detection of valid cable signals.  This is a result of unclear terms
-  in ATA-4 and ATA-5 standards.
+  Since various rules were applied and created ... et al. as it
+  relates the detection of valid cable signals.  This is a result of
+  unclear terms in ATA-4 and ATA-5 standards.
 
   It is normally safe to answer Y; however, the default is N.
 
-Various ATA, Work(s) In Progress (EXPERIMENTAL)
+ATA Work(s) In Progress (EXPERIMENTAL)‹
 CONFIG_IDEDMA_PCI_WIP
   If you enable this you will be able to use and test highly
-  developmental projects. If you say N, this configure script will
+  developmental projects. If you say N, the configurator will
   simply skip those options.
 
   It is SAFEST to say N to this question.
 
+Asyncronious DMA support (EXPERIMENTAL)
+CONFIG_BLK_DEV_ADMA
+  Please read the comments at the top of
+  <file:drivers/ide/ide-adma.c>.
+
+Pacific Digital A-DMA support (EXPERIMENTAL)
+CONFIG_BLK_DEV_PDC_ADMA
+  Please read the comments at the top of <file:drivers/ide/pdcadma.c>.
+
 3ware Hardware ATA-RAID support
 CONFIG_BLK_DEV_3W_XXXX_RAID
   3ware is the only hardware ATA-Raid product in Linux to date.
   This card is 2,4, or 8 channel master mode support only.
   SCSI support required!!!
 
-  http://www.3ware.com/
+  <http://www.3ware.com/>
 
-  Please read the comments at the top of drivers/scsi/3w-xxxx.c  
+  Please read the comments at the top of
+  <file:drivers/scsi/3w-xxxx.c>.
 
 AEC62XX chipset support
 CONFIG_BLK_DEV_AEC62XX
@@ -774,13 +933,13 @@
   The ATP860 is an UltraDMA 66 chipset base.
   The ATP860M(acintosh) version is an UltraDMA 66 chipset base.
 
-  Please read the comments at the top of drivers/ide/aec62xx.c
-  If you say Y here, then say Y to "Use DMA by default when available" as
-  well.
+  Please read the comments at the top of <file:drivers/ide/aec62xx.c>.
+  If you say Y here, then say Y to "Use DMA by default when available"
+  as well.
 
 AEC62XX Tuning support
 CONFIG_AEC62XX_TUNING
-  Please read the comments at the top of drivers/ide/aec62xx.c  
+  Please read the comments at the top of <file:drivers/ide/aec62xx.c>.
   If unsure, say N.
 
 ALI M15x3 chipset support
@@ -790,8 +949,8 @@
   normal dual channel support.
 
   If you say Y here, you also need to say Y to "Use DMA by default
-  when available", above.
-  Please read the comments at the top of drivers/ide/alim15x3.c
+  when available", above.  Please read the comments at the top of
+  <file:drivers/ide/alim15x3.c>.
 
   If unsure, say N.
 
@@ -806,20 +965,21 @@
   Using this option can allow WDC drives to run at ATA-4/5 transfer
   rates with only an ATA-2 support structure.
 
-  SAY NO!
+  SAY N!
 
-AMD7409 chipset support
-CONFIG_BLK_DEV_AMD7409
-  This driver ensures (U)DMA support for the AMD756 Viper chipset.
+AMD Viper support
+CONFIG_BLK_DEV_AMD74XX
+  This driver ensures (U)DMA support for the AMD756/760 Viper
+  chipsets.
 
   If you say Y here, you also need to say Y to "Use DMA by default
   when available", above.
-  Please read the comments at the top of drivers/ide/amd7409.c
+  Please read the comments at the top of <file:drivers/ide/amd74xx.c>.
 
   If unsure, say N.
 
-AMD Viper ATA-66 Override support (WIP)
-CONFIG_AMD7409_OVERRIDE
+AMD Viper ATA-66 Override (WIP)
+CONFIG_AMD74XX_OVERRIDE
   This option auto-forces the ata66 flag.
   This effect can be also invoked by calling "idex=ata66"
   If unsure, say N.
@@ -858,8 +1018,8 @@
 HPT34X AUTODMA support (WIP)
 CONFIG_HPT34X_AUTODMA
   This is a dangerous thing to attempt currently! Please read the
-  comments at the top of drivers/ide/hpt34x.c If you say Y here,
-  then say Y to "Use DMA by default when available" as well.
+  comments at the top of <file:drivers/ide/hpt34x.c>.  If you say Y
+  here, then say Y to "Use DMA by default when available" as well.
 
   If unsure, say N.
 
@@ -868,9 +1028,9 @@
   HPT366 is an Ultra DMA chipset for ATA-66.
   HPT368 is an Ultra DMA chipset for ATA-66 RAID Based.
   HPT370 is an Ultra DMA chipset for ATA-100.
- 
+
   This driver adds up to 4 more EIDE devices sharing a single
-  interrupt. 
+  interrupt.
 
   The HPT366 chipset in its current form is bootable. One solution
   for this problem are special LILO commands for redirecting the
@@ -884,21 +1044,22 @@
   ide-probe at boot. It is reported to support DVD II drives, by the
   manufacturer.
 
-NS87415 support (EXPERIMENTAL)
+NS87415 chipset support (EXPERIMENTAL)
 CONFIG_BLK_DEV_NS87415
   This driver adds detection and support for the NS87415 chip
   (used in SPARC64, among others).
 
-  Please read the comments at the top of drivers/ide/ns87415.c.
+  Please read the comments at the top of <file:drivers/ide/ns87415.c>.
 
-OPTi 82C621 enhanced support (EXPERIMENTAL)
+OPTi 82C621 chipset enhanced support (EXPERIMENTAL)
 CONFIG_BLK_DEV_OPTI621
   This is a driver for the OPTi 82C621 EIDE controller.
-  Please read the comments at the top of drivers/ide/opti621.c.
+  Please read the comments at the top of <file:drivers/ide/opti621.c>.
 
-ServerWorks OSB4 chipset support (EXPERIMENTAL)
-CONFIG_BLK_DEV_OSB4
-  This driver adds PIO/DMA support for the Serverworks OSB4 chipset
+ServerWorks OSB4/CSB5 chipset support
+CONFIG_BLK_DEV_SVWKS
+  This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5
+  chipsets.
 
 Intel PIIXn chipsets support
 CONFIG_BLK_DEV_PIIX
@@ -907,7 +1068,7 @@
   PIO 0-4 mode settings, this allows dynamic tuning of the chipset
   via the standard end-user tool 'hdparm'.
 
-  Please read the comments at the top of drivers/ide/piix.c.
+  Please read the comments at the top of <file:drivers/ide/piix.c>.
 
   If you say Y here, you should also say Y to "PIIXn Tuning support",
   below.
@@ -926,29 +1087,30 @@
 
   If unsure, say N.
 
-PROMISE PDC20246/PDC20262/PDC20267 support
+PROMISE PDC20246/PDC20262/PDC20265/PDC20267/PDC20268 support
 CONFIG_BLK_DEV_PDC202XX
   Promise Ultra33 or PDC20246
   Promise Ultra66 or PDC20262
-  Promise Ultra100 or PDC20265/PDC20267
+  Promise Ultra100 or PDC20265/PDC20267/PDC20268
 
   This driver adds up to 4 more EIDE devices sharing a single
   interrupt. This add-on card is a bootable PCI UDMA controller. Since
   multiple cards can be installed and there are BIOS ROM problems that
   happen if the BIOS revisions of all installed cards (three-max) do
   not match, the driver attempts to do dynamic tuning of the chipset
-  at boot-time for max-speed. Ultra33 BIOS 1.25 or newer is required
+  at boot-time for max-speed.  Ultra33 BIOS 1.25 or newer is required
   for more than one card. This card may require that you say Y to
-  "Special UDMA Feature (EXPERIMENTAL)".
+  "Special UDMA Feature".
 
   If you say Y here, you need to say Y to "Use DMA by default when
   available" as well.
 
-  Please read the comments at the top of drivers/ide/pdc202xx.c
+  Please read the comments at the top of
+  <file:drivers/ide/pdc202xx.c>.
 
   If unsure, say N.
 
-Special UDMA Feature (EXPERIMENTAL)
+Special UDMA Feature
 CONFIG_PDC202XX_BURST
   For PDC20246, PDC20262, PDC20265 and PDC20267 Ultra DMA chipsets.
   Designed originally for PDC20246/Ultra33 that has BIOS setup
@@ -956,10 +1118,15 @@
 
   Unknown for PDC20265/PDC20267 Ultra DMA 100.
 
-  Please read the comments at the top of drivers/ide/pdc202xx.c
+  Please read the comments at the top of
+  <file:drivers/ide/pdc202xx.c>.
 
   If unsure, say N.
 
+Special FastTrak Feature
+CONFIG_PDC202XX_FORCE
+  For FastTrak enable overriding BIOS.
+
 SiS5513 chipset support
 CONFIG_BLK_DEV_SIS5513
   This driver ensures (U)DMA support for SIS5513 chipset based
@@ -969,20 +1136,21 @@
   If you say Y here, you need to say Y to "Use DMA by default when
   available" as well.
 
-  Please read the comments at the top of drivers/ide/sis5513.c
+  Please read the comments at the top of <file:drivers/ide/sis5513.c>.
 
 SLC90E66 chipset support
 CONFIG_BLK_DEV_SLC90E66
   This driver ensures (U)DMA support for Victroy66 SouthBridges for
   SMsC with Intel NorthBridges.  This is an Ultra66 based chipset.
   The nice thing about it is that you can mix Ultra/DMA/PIO devices
-  and it will handle timing cycles.  Since this is an improved look-a-like
-  to the PIIX4 it should be a nice addition.
+  and it will handle timing cycles.  Since this is an improved
+  look-a-like to the PIIX4 it should be a nice addition.
 
   If you say Y here, you need to say Y to "Use DMA by default when
   available" as well.
 
-  Please read the comments at the top of drivers/ide/slc90e66.c
+  Please read the comments at the top of
+  <file:drivers/ide/slc90e66.c>.
 
 Winbond SL82c105 support
 CONFIG_BLK_DEV_SL82C105
@@ -990,35 +1158,34 @@
   special configuration for this chip. This is common on various CHRP
   motherboards, but could be used elsewhere. If in doubt, say Y.
 
-Tekram TRM290 chipset support (EXPERIMENTAL)
+Tekram TRM290 chipset support
 CONFIG_BLK_DEV_TRM290
   This driver adds support for bus master DMA transfers
   using the Tekram TRM290 PCI IDE chip. Volunteers are
   needed for further tweaking and development.
-  Please read the comments at the top of drivers/ide/trm290.c.
+  Please read the comments at the top of <file:drivers/ide/trm290.c>.
 
 VIA82CXXX chipset support
 CONFIG_BLK_DEV_VIA82CXXX
   This allows you to configure your chipset for a better use while
-  running (U)DMA: it will allow you to enable efficiently the second
-  channel dma usage, as it may not be set by BIOS. It allows you to
-  pass a kernel command line at boot time in order to set fifo
-  config. If no command line is provided, it will try to set fifo
-  configuration at its best. It will allow you to get information from
-  /proc/ide/via provided you enabled "proc" support.
+  running PIO/(U)DMA, it will allow you to enable efficiently the
+  second channel dma usage, as it may not be set by BIOS.  It will try
+  to set fifo configuration at its best.  It will allow you to get
+  information from /proc/ide/via provided you enabled "/proc file
+  system" support.
 
-  Please read the comments at the top of drivers/ide/via82cxxx.c
+  Please read the comments at the top of
+  <file:drivers/ide/via82cxxx.c>.
 
   If you say Y here, then say Y to "Use DMA by default when available"
   as well.
 
   If unsure, say N.
 
-VIA82CXXX Tuning support (WIP)
-CONFIG_VIA82CXXX_TUNING
-  Please read the comments at the top of drivers/ide/via82cxxx.c
-
-  If unsure, say N.
+RapIDE interface support
+CONFIG_BLK_DEV_IDE_RAPIDE
+  Say Y here if you want to support the Yellowstone RapIDE controller
+  manufactured for use with Acorn computers.
 
 Other IDE chipset support
 CONFIG_IDE_CHIPSETS
@@ -1030,9 +1197,9 @@
   setting of higher speed I/O rates to improve system performance with
   these chipsets. Most of these also require special kernel boot
   parameters to actually turn on the support at runtime; you can find
-  a list of these in the file Documentation/ide.txt.
-  
-  People with SCSI-only systems can say N here. 
+  a list of these in the file <file:Documentation/ide.txt>.
+
+  People with SCSI-only systems can say N here.
 
 Generic 4 drives/port support
 CONFIG_BLK_DEV_4DRIVES
@@ -1045,53 +1212,64 @@
 ALI M14xx support
 CONFIG_BLK_DEV_ALI14XX
   This driver is enabled at runtime using the "ide0=ali14xx" kernel
-  boot parameter. It enables support for the secondary IDE interface
+  boot parameter.  It enables support for the secondary IDE interface
   of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
-  I/O speeds to be set as well. See the files Documentation/ide.txt
-  and drivers/ide/ali14xx.c for more info.
+  I/O speeds to be set as well.  See the files
+  <file:Documentation/ide.txt> and <file:drivers/ide/ali14xx.c> for
+  more info.
 
 DTC-2278 support
 CONFIG_BLK_DEV_DTC2278
   This driver is enabled at runtime using the "ide0=dtc2278" kernel
   boot parameter. It enables support for the secondary IDE interface
   of the DTC-2278 card, and permits faster I/O speeds to be set as
-  well. See the Documentation/ide.txt and drivers/ide/dtc2278.c
-  files for more info.
+  well. See the <file:Documentation/ide.txt> and
+  <file:drivers/ide/dtc2278.c> files for more info.
 
 Holtek HT6560B support
 CONFIG_BLK_DEV_HT6560B
   This driver is enabled at runtime using the "ide0=ht6560b" kernel
   boot parameter. It enables support for the secondary IDE interface
   of the Holtek card, and permits faster I/O speeds to be set as well.
-  See the Documentation/ide.txt and drivers/ide/ht6560b.c files for
-  more info.
+  See the <file:Documentation/ide.txt> and
+  <file:drivers/ide/ht6560b.c> files for more info.
 
 PROMISE DC4030 support (EXPERIMENTAL)
 CONFIG_BLK_DEV_PDC4030
   This driver provides support for the secondary IDE interface and
-  cache of Promise IDE chipsets, e.g. DC4030 and DC5030. This driver
+  cache of Promise IDE chipsets, e.g. DC4030 and DC5030.  This driver
   is known to incur timeouts/retries during heavy I/O to drives
-  attached to the secondary interface. CDROM and TAPE devices are not
-  supported yet. This driver is enabled at runtime using the
-  "ide0=dc4030" kernel boot parameter. See the Documentation/ide.txt
-  and drivers/ide/pdc4030.c files for more info.
+  attached to the secondary interface.  CD-ROM and TAPE devices are
+  not supported yet.  This driver is enabled at runtime using the
+  "ide0=dc4030" kernel boot parameter.  See the
+  <file:Documentation/ide.txt> and <file:drivers/ide/pdc4030.c> files
+  for more info.
 
+# This is for Linus's tree.
 QDI QD6580 support
 CONFIG_BLK_DEV_QD6580
   This driver is enabled at runtime using the "ide0=qd6580" kernel
-  boot parameter. It permits faster I/O speeds to be set. See the
-  files Documentation/ide.txt and drivers/ide/qd6580.c for more
-  info.
+  boot parameter.  It permits faster I/O speeds to be set.  See the
+  <file:Documentation/ide.txt> and <file:drivers/ide/qd6580.c> for
+  more info.
+
+# This is for Alan's tree.  Note the name difference.
+QDI QD65XX support
+CONFIG_BLK_DEV_QD65XX
+  This driver is enabled at runtime using the "ide0=qd65xx" kernel
+  boot parameter.  It permits faster I/O speeds to be set.  See the
+  <file:Documentation/ide.txt> and <file:drivers/ide/qd65xx.c> for
+  more info.
 
 UMC 8672 support
 CONFIG_BLK_DEV_UMC8672
   This driver is enabled at runtime using the "ide0=umc8672" kernel
   boot parameter. It enables support for the secondary IDE interface
   of the UMC-8672, and permits faster I/O speeds to be set as well.
-  See the files Documentation/ide.txt and drivers/ide/umc8672.c for
-  more info.
+  See the files <file:Documentation/ide.txt> and
+  <file:drivers/ide/umc8672.c> for more info.
 
-Amiga builtin Gayle IDE interface support
+Amiga Gayle IDE interface support
 CONFIG_BLK_DEV_GAYLE
   This is the IDE driver for the builtin IDE interface on some Amiga
   models. It supports both the `A1200 style' (used in A600 and A1200)
@@ -1107,11 +1285,11 @@
   disks, CD-ROM drives, etc.) that are connected to the builtin IDE
   interface.
 
-Amiga Buddha/Catweasel IDE interface support (EXPERIMENTAL)
+Amiga Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)
 CONFIG_BLK_DEV_BUDDHA
-  This is the IDE driver for the IDE interfaces on the Buddha and
-  Catweasel expansion boards.  It supports up to two interfaces on the
-  Buddha and three on the Catweasel.
+  This is the IDE driver for the IDE interfaces on the Buddha, 
+  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
+  on the Buddha, three on the Catweasel and two on the X-Surf.
 
   Say Y if you have a Buddha or Catweasel expansion board and want to
   use IDE devices (hard disks, CD-ROM drives, etc.) that are connected
@@ -1131,10 +1309,16 @@
   Say Y if you have an IDE doubler.  The driver is enabled at kernel
   runtime using the "ide=doubler" kernel boot parameter.
 
-Support for PowerMac IDE devices (must also enable IDE)
+WarpEngine SCSI support
+CONFIG_WARPENGINE_SCSI
+  Support for MacroSystem Development's WarpEngine Amiga SCSI-2
+  controller. Info at
+  <http://www.lysator.liu.se/amiga/ar/guide/ar310.guide?FEATURE5>.
+
+Builtin PowerMac IDE support
 CONFIG_BLK_DEV_IDE_PMAC
-  This driver provides support for the built-in IDE controller on most
-  of the recent Apple Power Macintoshes and PowerBooks.
+  This driver provides support for the built-in IDE controller on
+  most of the recent Apple Power Macintoshes and PowerBooks.
   If unsure, say Y.
 
 PowerMac IDE DMA support
@@ -1164,29 +1348,6 @@
   devices (hard disks, CD-ROM drives, etc.) that are connected to the
   builtin IDE interface.
 
-MPC8xx IDE support
-CONFIG_BLK_DEV_MPC8xx_IDE
-  This option provides support for IDE on Motorola MPC8xx Systems.
-  Please see 'Type of MPC8xx IDE interface' for details.
-
-  If unsure, say N.
-
-Type of MPC8xx IDE interface
-CONFIG_IDE_8xx_PCCARD
-  Select how the IDE devices are connected to the MPC8xx system:
-
-  8xx_PCCARD uses the 8xx internal PCMCIA interface in combination
-             with a PC Card (e.g. ARGOSY portable Hard Disk Adapter),
-             ATA PC Card HDDs or ATA PC Flash Cards (example: TQM8xxL
-             systems)
-
-  8xx_DIRECT is used for directly connected IDE devices using the 8xx
-             internal PCMCIA interface (example: IVMS8 systems)
-
-  EXT_DIRECT is used for IDE devices directly connected to the 8xx
-             bus using some glue logic, but _not_ the 8xx internal
-             PCMCIA interface (example: IDIF860 systems)
-
 ICS IDE interface support
 CONFIG_BLK_DEV_IDE_ICSIDE
   On Acorn systems, say Y here if you wish to use the ICS IDE
@@ -1212,12 +1373,12 @@
 XT hard disk support
 CONFIG_BLK_DEV_XD
   Very old 8 bit hard disk controllers used in the IBM XT computer
-  will be supported if you say Y here. 
+  will be supported if you say Y here.
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called xd.o. 
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called xd.o.
 
   It's pretty unlikely that you have one of these: say N.
 
@@ -1225,23 +1386,23 @@
 CONFIG_BLK_DEV_PS2
   Say Y here if you have a PS/2 machine with a MCA bus and an ESDI
   hard disk.
-  
+
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ps2esdi.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ps2esdi.o.
 
 Mylex DAC960/DAC1100 PCI RAID Controller support
 CONFIG_BLK_DEV_DAC960
   This driver adds support for the Mylex DAC960, AcceleRAID, and
-  eXtremeRAID PCI RAID controllers. See the file
-  Documentation/README.DAC960 for further information about this
-  driver.
+  eXtremeRAID PCI RAID controllers.  See the file
+  <file:Documentation/README.DAC960> for further information about
+  this driver.
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt.  The module will be
-  called DAC960.o. 
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called DAC960.o.
 
 Parallel port IDE device support
 CONFIG_PARIDE
@@ -1249,7 +1410,7 @@
   your computer's parallel port. Most of them are actually IDE devices
   using a parallel port IDE adapter. This option enables the PARIDE
   subsystem which contains drivers for many of these external drives.
-  Read Documentation/paride.txt for more information.
+  Read <file:Documentation/paride.txt> for more information.
 
   If you have said Y to the "Parallel-port support" configuration
   option, you may share a single port between your printer and other
@@ -1270,13 +1431,13 @@
 
 Parallel port IDE disks
 CONFIG_PARIDE_PD
-  This option enables the high-level driver for IDE-type disk devices 
-  connected through a parallel port. If you chose to build PARIDE 
-  support into your kernel, you may answer Y here to build in the 
-  parallel port IDE driver, otherwise you should answer M to build 
-  it as a loadable module. The module will be called pd.o. You 
-  must also have at least one parallel port protocol driver in your 
-  system. Among the devices supported by this driver are the SyQuest 
+  This option enables the high-level driver for IDE-type disk devices
+  connected through a parallel port. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  parallel port IDE driver, otherwise you should answer M to build
+  it as a loadable module. The module will be called pd.o. You
+  must also have at least one parallel port protocol driver in your
+  system. Among the devices supported by this driver are the SyQuest
   EZ-135, EZ-230 and SparQ drives, the Avatar Shark and the backpack
   hard drives from MicroSolutions.
 
@@ -1291,8 +1452,8 @@
   system. Among the devices supported by this driver are the
   MicroSolutions backpack CD-ROM drives and the Freecom Power CD. If
   you have such a CD-ROM drive, you should also say Y or M to "ISO
-  9660 CDROM file system support" below, because that's the file
-  system used on CDROMs.
+  9660 CD-ROM file system support" below, because that's the file
+  system used on CD-ROMs.
 
 Parallel port ATAPI disks
 CONFIG_PARIDE_PF
@@ -1322,7 +1483,7 @@
   This option enables a special high-level driver for generic ATAPI
   devices connected through a parallel port. The driver allows user
   programs, such as cdrecord, to send ATAPI commands directly to a
-  device. 
+  device.
 
   If you chose to build PARIDE support into your kernel, you may
   answer Y here to build in the parallel port generic ATAPI driver,
@@ -1333,10 +1494,10 @@
   your system.
 
   This driver implements an API loosely related to the generic SCSI
-  driver. See include/linux/pg.h for details.
+  driver. See <file:include/linux/pg.h>. for details.
 
   You can obtain the most recent version of cdrecord from
-  ftp://ftp.fokus.gmd.de/pub/unix/cdrecord/ . Versions 1.6.1a3 and
+  <ftp://ftp.fokus.gmd.de/pub/unix/cdrecord/>. Versions 1.6.1a3 and
   later fully support this driver.
 
 ATEN EH-100 protocol
@@ -1352,39 +1513,40 @@
 
 Micro Solutions BACKPACK Series 5 protocol
 CONFIG_PARIDE_BPCK
-  This option enables support for the Micro Solutions BACKPACK parallel
-  port Series 5 IDE protocol. (Most BACKPACK drives made before 1999 were 
-  Series 5) Series 5 drives will NOT always have the Series noted on the
-  bottom of the drive. Series 6 drivers will. 
+  This option enables support for the Micro Solutions BACKPACK
+  parallel port Series 5 IDE protocol.  (Most BACKPACK drives made
+  before 1999 were Series 5) Series 5 drives will NOT always have the
+  Series noted on the bottom of the drive. Series 6 drivers will.
 
   In other words, if your BACKPACK drive dosen't say "Series 6" on the
   bottom, enable this option.
 
-  If you chose to build PARIDE support into your kernel, you may answer Y
-  here to build in the protocol driver, otherwise you should answer M to
-  build it as a loadable module. The module will be called bpck.o. You
-  must also have a high-level driver for the type of device that you want
-  to support.
+  If you chose to build PARIDE support into your kernel, you may
+  answer Y here to build in the protocol driver, otherwise you should
+  answer M to build it as a loadable module.  The module will be
+  called bpck.o.  You must also have a high-level driver for the type
+  of device that you want to support.
 
 Micro Solutions BACKPACK Series 6 protocol
 CONFIG_PARIDE_BPCK6
-  This option enables support for the Micro Solutions BACKPACK parallel
-  port Series 6 IDE protocol. (Most BACKPACK drives made after 1999 were 
-  Series 6) Series 6 drives will have the Series noted on the bottom of
-  the drive. Series 5 drivers don't always have it noted. 
+  This option enables support for the Micro Solutions BACKPACK
+  parallel port Series 6 IDE protocol.  (Most BACKPACK drives made
+  after 1999 were Series 6) Series 6 drives will have the Series noted
+  on the bottom of the drive.  Series 5 drivers don't always have it
+  noted.
 
-  In other words, if your BACKPACK drive says "Series 6" on the bottom,
-  enable this option.
+  In other words, if your BACKPACK drive says "Series 6" on the
+  bottom, enable this option.
 
-  If you chose to build PARIDE support into your kernel, you may answer Y
-  here to build in the protocol driver, otherwise you should answer M to
-  build it as a loadable module. The module will be called bpck6.o. You
-  must also have a high-level driver for the type of device that you want
-  to support.
+  If you chose to build PARIDE support into your kernel, you may
+  answer Y here to build in the protocol driver, otherwise you should
+  answer M to build it as a loadable module.  The module will be
+  called bpck6.o.  You must also have a high-level driver for the type
+  of device that you want to support.
 
 DataStor Commuter protocol
 CONFIG_PARIDE_COMM
-  This option enables support for the Commuter parallel port IDE 
+  This option enables support for the Commuter parallel port IDE
   protocol from DataStor. If you chose to build PARIDE support
   into your kernel, you may answer Y here to build in the protocol
   driver, otherwise you should answer M to build it as a loadable
@@ -1393,7 +1555,7 @@
 
 DataStor EP-2000 protocol
 CONFIG_PARIDE_DSTR
-  This option enables support for the EP-2000 parallel port IDE 
+  This option enables support for the EP-2000 parallel port IDE
   protocol from DataStor. If you chose to build PARIDE support
   into your kernel, you may answer Y here to build in the protocol
   driver, otherwise you should answer M to build it as a loadable
@@ -1412,7 +1574,7 @@
   have a high-level driver for the type of device that you want to
   support.
 
-Shuttle EPAT c7/c8 extension 
+Shuttle EPAT c7/c8 extension
 CONFIG_PARIDE_EPATC8
   This option enables support for the newer Shuttle EP1284 (aka c7 and
   c8) chip. You need this if you are using any recent Imation SuperDisk
@@ -1453,12 +1615,12 @@
 Freecom IQ ASIC-2 protocol
 CONFIG_PARIDE_FRIQ
   This option enables support for version 2 of the Freecom IQ parallel
-  port IDE adapter.  This adapter is used by the Maxell Superdisk 
+  port IDE adapter.  This adapter is used by the Maxell Superdisk
   drive.  If you chose to build PARIDE support into your kernel, you
   may answer Y here to build in the protocol driver, otherwise you
   should answer M to build it as a loadable module. The module will be
   called friq.o. You must also have a high-level driver for the type
-  of device that you want to support. 
+  of device that you want to support.
 
 FreeCom power protocol
 CONFIG_PARIDE_FRPW
@@ -1493,12 +1655,12 @@
 
 OnSpec 90c20 protocol
 CONFIG_PARIDE_ON20
-  This option enables support for the (obsolete) 90c20 parallel port 
+  This option enables support for the (obsolete) 90c20 parallel port
   IDE protocol from OnSpec (often marketed under the ValuStore brand
-  name). If you chose to build PARIDE support into your kernel, you 
-  may answer Y here to build in the protocol driver, otherwise you 
-  should answer M to build it as a loadable module. The module will 
-  be called on20.o. You must also have a high-level driver for the 
+  name). If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will
+  be called on20.o. You must also have a high-level driver for the
   type of device that you want to support.
 
 OnSpec 90c26 protocol
@@ -1522,13 +1684,19 @@
   to new capacity needs.  Logical volumes are accessed as block
   devices named /dev/VolumeGroupName/LogicalVolumeName.
 
-  For details see Documentation/LVM-HOWTO. You will need supporting
-  user space software; location is in Documentation/Changes.
+  For details see <file:Documentation/LVM-HOWTO>.  You will need
+  supporting user space software; location is in
+  <file:Documentation/Changes>.
 
   If you want to compile this support as a module ( = code which can
   be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called lvm-mod.o.
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called lvm-mod.o.
+
+Multiple devices driver support (RAID and LVM)
+CONFIG_MD
+  Support multiple physical spindles through a single logical device.
+  Required for RAID and logical volume management (LVM).
 
 Multiple devices driver support
 CONFIG_BLK_DEV_MD
@@ -1543,7 +1711,7 @@
 
   More information about Software RAID on Linux is contained in the
   Software-RAID mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . There you will also
+  <http://www.linuxdoc.org/docs.html#howto>. There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If unsure, say N.
@@ -1552,12 +1720,12 @@
 CONFIG_MD_LINEAR
   If you say Y here, then your multiple devices driver will be able to
   use the so-called linear mode, i.e. it will combine the hard disk
-  partitions by simply appending one to the other. 
+  partitions by simply appending one to the other.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called linear.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called linear.o.
 
   If unsure, say Y.
 
@@ -1567,40 +1735,40 @@
   use the so-called raid0 mode, i.e. it will combine the hard disk
   partitions into one logical device in such a fashion as to fill them
   up evenly, one chunk here and one chunk there. This will increase
-  the throughput rate if the partitions reside on distinct disks. 
+  the throughput rate if the partitions reside on distinct disks.
 
   Information about Software RAID on Linux is contained in the
   Software-RAID mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . There you will also
+  <http://www.linuxdoc.org/docs.html#howto>. There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called raid0.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called raid0.o.
 
   If unsure, say Y.
 
 RAID-1 (mirroring) mode
 CONFIG_MD_RAID1
   A RAID-1 set consists of several disk drives which are exact copies
-  of each other. In the event of a mirror failure, the RAID driver
+  of each other.  In the event of a mirror failure, the RAID driver
   will continue to use the operational mirrors in the set, providing
   an error free MD (multiple device) to the higher levels of the
-  kernel. In a set with N drives, the available space is the capacity
+  kernel.  In a set with N drives, the available space is the capacity
   of a single drive, and the set protects against a failure of (N - 1)
-  drives. 
+  drives.
 
   Information about Software RAID on Linux is contained in the
   Software-RAID mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . There you will also
+  <http://www.linuxdoc.org/docs.html#howto>.  There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If you want to use such a RAID-1 set, say Y. This code is also
   available as a module called raid1.o ( = code which can be inserted
-  in and removed from the running kernel whenever you want). If you
+  in and removed from the running kernel whenever you want).  If you
   want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
   If unsure, say Y.
 
@@ -1616,41 +1784,92 @@
 
   Information about Software RAID on Linux is contained in the
   Software-RAID mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . There you will also
+  <http://www.linuxdoc.org/docs.html#howto>. There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If you want to use such a RAID-4/RAID-5 set, say Y. This code is
   also available as a module called raid5.o ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
   If unsure, say Y.
 
+Multipath I/O support
+CONFIG_MD_MULTIPATH
+  Multipath-IO is the ability of certain devices to address the same
+  physical disk over multiple 'IO paths'. The code ensures that such
+  paths can be defined and handled at runtime, and ensures that a
+  transparent failover to the backup path(s) happens if a IO errors
+  arrives on the primary path.
+
+  If unsure, say N.
+
+# AC tree only
+Support for IDE Raid controllers
+CONFIG_BLK_DEV_ATARAID
+  Say Y or M if you have an IDE Raid controller and want linux
+  to use its softwareraid feature.  You must also select an
+  appropriate for your board low-level driver below.
+
+  Note, that Linux does not use the Raid implemetation in BIOS, and
+  the main purpose for this feature is to retain compatibility and
+  data integrity with other OS-es, using the same disk array. Linux
+  has its own Raid drivers, which you should use if you need better
+  performance.
+
+# AC tree only
+Support Promise software RAID (Fasttrak(tm))
+CONFIG_BLK_DEV_ATARAID_PDC
+  Say Y or M if you have a Promise Fasttrak (tm) Raid controller
+  and want linux to use the softwareraid feature of this card.
+  This driver uses /dev/ataraid/dXpY (X and Y numbers) as device
+  names.
+
+  If you choose to compile this as a module, the module will be called
+  pdcraid.o.
+
+# AC tree only
+Highpoint 370 software RAID
+CONFIG_BLK_DEV_ATARAID_HPT
+  Say Y or M if you have a Highpoint HPT 370 Raid controller
+  and want linux to use the softwareraid feature of this card.
+  This driver uses /dev/ataraid/dXpY (X and Y numbers) as device
+  names.
+
+  If you choose to compile this as a module, the module will be called
+  hptraid.o.
+
 Support for Acer PICA 1 chipset
 CONFIG_ACER_PICA_61
   This is a machine with a R4400 133/150 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://oss.sgi.com/mips .
+  <http://oss.sgi.com/mips>.
 
 Support for Algorithmics P4032 (EXPERIMENTAL)
 CONFIG_ALGOR_P4032
-  This is an evaluation board of the British company Algorithmics. The
-  board uses the R4300 and a R5230 CPUs. For more information about
-  this board see http://www.algor.co.uk .
+  This is an evaluation board of the British company Algorithmics.
+  The board uses the R4300 and a R5230 CPUs.  For more information
+  about this board see <http://www.algor.co.uk>.
 
 Support for BAGET MIPS series
 CONFIG_BAGET_MIPS
-  This enables support for the Baget, a Russian embedded system.  For 
-  more details about the Baget see the Linux/MIPS FAQ on 
-  http://oss.sgi.com/mips .
+  This enables support for the Baget, a Russian embedded system.  For
+  more details about the Baget see the Linux/MIPS FAQ on
+  <http://oss.sgi.com/mips>.
+
+Baget AMD LANCE support
+CONFIG_BAGETLANCE
+  Say Y to enable kernel support for AMD Lance Ethernet cards on the
+  MIPS-32-based Baget embedded system.  This chipset is better known
+  via the NE2100 cards.
 
 Support for DECstations
 CONFIG_DECSTATION
   This enables support for DEC's MIPS based workstations.  For details
-  see the Linux/MIPS FAQ on http://oss.sgi.com/mips and the 
-  DECstation porting pages on http://decstation.unix-ag.org .
+  see the Linux/MIPS FAQ on <http://oss.sgi.com/mips> and the
+  DECstation porting pages on <http://decstation.unix-ag.org>.
 
   If you have one of the following DECstation Models you definitely
   want to choose R4xx0 for the CPU Type:
@@ -1662,6 +1881,25 @@
 
   otherwise choose R3000.
 
+Support for Cobalt Micro Server
+CONFIG_COBALT_MICRO_SERVER
+  Support for MIPS-based Cobalt boxes (they have been bought by Sun
+  and are now the "Server Appliance Business Unit") including the 2700
+  series -- versions 1 of the Qube and Raq.  To compile a Linux kernel
+  for this hardware, say Y here.
+
+Support for Cobalt 2800
+CONFIG_COBALT_28
+  Support for the second generation of MIPS-based Cobalt boxes (they
+  have been bought by Sun and are now the "Server Appliance Business
+  Unit") including the 2800 series -- versions 2 of the Qube and Raq.
+  To compile a Linux kernel for this hardware, say Y here.
+
+Support for the Momentum Computer Ocelot SBC
+CONFIG_MOMENCO_OCELOT
+  The Ocelot is a MIPS-based Single Board Computer (SBC) made by
+  Momentum Computer <http://www.momenco.com>.
+
 Support for NEC DDB Vrc-5074
 CONFIG_DDB5074
   This enables support for the VR5000-based NEC DDB Vrc-5074
@@ -1673,10 +1911,18 @@
   evaluation board.
 
   Features : kernel debugging, serial terminal, NFS root fs, on-board
-  ether port (with a patch to tulip driver), IDE controller, PS2 keyboard
-  PS2 mouse, etc.
+  ether port (Need an additional patch at <http://linux.junsun.net>),
+  USB, AC97, PCI, PCI VGA card & framebuffer console, IDE controller,
+  PS2 keyboard, PS2 mouse, etc.
+
+Support for NEC DDB Vrc-5477
+CONFIG_DDB5477
+  This enables support for the R5432-based NEC DDB Vrc-5477
+  evaluation board.
 
-  TODO : USB, Compact-PCI interface.
+  Features : kernel debugging, serial terminal, NFS root fs, on-board
+  ether port (Need an additional patch at <http://linux.junsun.net>),
+  USB, AC97, PCI, etc.
 
 Support for MIPS Atlas board
 CONFIG_MIPS_ATLAS
@@ -1688,19 +1934,39 @@
   This enables support for the VR5000-based MIPS Malta evaluation
   board.
 
+Support for Galileo Evaluation board or CoSine Orion
+CONFIG_ORION
+  Say Y if configuring for the Galileo evaluation board
+  or CoSine Orion.  More information is available at
+  <http://tochna.technion.ac.il/project/linux/html/linux.html>.
+
+  Otherwise, say N.
+
 Support for Mips Magnum 4000
 CONFIG_MIPS_MAGNUM_4000
   This is a machine with a R4000 100 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://oss.sgi.com/mips.
+  <http://oss.sgi.com/mips>.
+
+Enable Qtronix 990P Keyboard Support
+CONFIG_QTRONIX_KEYBOARD
+  Images of Qtronix keyboards are at
+  <http://www.qtronix.com/keyboard.html>.
 
 Support for Olivetti M700
 CONFIG_OLIVETTI_M700
   This is a machine with a R4000 100 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://oss.sgi.com/mips.
+  <http://oss.sgi.com/mips>.
+
+Support for SNI RM200 PCI
+CONFIG_SNI_RM200_PCI
+  The SNI RM200 PCI was a MIPS-based platform manufactured by Siemens
+  Nixdorf Informationssysteme (SNI), parent company of Pyramid
+  Technology and now in turn merged with Fujitsu.  Say Y here to
+  support this machine type.
 
 Support for SGI IP22
 CONFIG_SGI_IP22
@@ -1709,6 +1975,7 @@
   that runs on these, say Y here.
 
 Support for SGI IP27
+CONFIG_SGI_IP27
   This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics
   workstations.  To compile a Linux kernel that runs on these, say Y
   here.
@@ -1731,11 +1998,49 @@
   4000, Acer PICA, Olivetti M700-10 and a few other identical OEM
   systems.
 
+MIPS GT96100 support
+CONFIG_MIPS_GT96100
+  Say Y here to support the Galileo Technology GT96100 communications
+  controller card.  There is a web page at <http://www.galileot.com/>.
+
+MIPS GT96100 Ethernet support
+CONFIG_MIPS_GT96100ETH
+  Say Y here to support the Ethernet subsystem on your GT96100 card.
+
+Zalon SCSI support
+CONFIG_SCSI_ZALON
+  The Zalon is an interface chip that sits between the PA-RISC
+  processor and the NCR 53c720 SCSI controller on K-series PA-RISC
+  boards (these are used, among other places, on some HP 780
+  workstations).  Say Y here to make sure it gets initialized
+  correctly before the Linux kernel tries to talk to the controller.
+
 Kernel floating-point instruction emulation
 CONFIG_MIPS_FPU_EMULATOR
-  This option enables the MIPS software floatingpoint support.  Due to the
-  way floatingpoint works you should always enable this option unless
-  you exactly know what you're doing.
+  This option enables the MIPS software floatingpoint support.  Due to
+  the way floating point works you should always enable this option
+  unless you exactly know what you're doing.
+
+SGI PROM Console Support
+CONFIG_SGI_PROM_CONSOLE
+  Say Y here to set up the boot console on serial port 0.
+
+DZ11 Serial Support
+CONFIG_DZ
+  DZ11-family serial controllers for VAXstations, including the
+  DC7085, M7814, and M7819.
+
+
+TURBOchannel support
+CONFIG_TC
+  TurboChannel is a DEC (now Compaq) bus for Alpha and MIPS processors.
+  Documentation on writing device drivers for TurboChannel is available at:
+  <http://www.cs.arizona.edu/computer.help/policy/DIGITAL_unix/AA-PS3HD-TET1_html/TITLE.html>.
+
+Z85C30 Serial Support
+CONFIG_ZS
+  Documentation on the Zilog 85C350 serial communications controller
+  is downloadable at <http://www.zilog.com/pdfs/serial/z85c30.pdf>.
 
 PCMCIA SCSI adapter support
 CONFIG_SCSI_PCMCIA
@@ -1744,9 +2049,30 @@
   size devices often used with laptops.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions PCMCIA SCSI host adapters.
 
+Adaptec APA1480 CardBus support
+CONFIG_PCMCIA_APA1480
+  Say Y here if you intend to attach this type of CardBus SCSI host
+  adapter to your computer.
+
+  This driver is also available as a module called apa1480_cb.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support
+CONFIG_PCMCIA_NINJA_SCSI
+  If you intend to attach this type of PCMCIA SCSI host adapter to
+  your computer, say Y here and read
+  <file:Documentation/README.nsp_cs>.
+
+  This driver is also available as a module called nsp_cs.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
 Adaptec AHA152X PCMCIA support
 CONFIG_PCMCIA_AHA152X
   Say Y here if you intend to attach this type of PCMCIA SCSI host
@@ -1755,7 +2081,7 @@
   This driver is also available as a module called aha152x_cs.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Qlogic PCMCIA support
 CONFIG_PCMCIA_QLOGIC
@@ -1764,8 +2090,8 @@
 
   This driver is also available as a module called qlogic_cs.o ( =
   code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 Future Domain PCMCIA support
 CONFIG_PCMCIA_FDOMAIN
@@ -1774,27 +2100,96 @@
 
   This driver is also available as a module called fdomain_cs.o ( =
   code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
-
-Adaptec APA1480 CardBus support
-CONFIG_PCMCIA_APA1480
-  Say Y here if you intend to attach this type of CardBus SCSI host
-  adapter to your computer.
-
-  This driver is also available as a module called apa1480_cb.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
+# Choice: mipstype
 CPU type
 CONFIG_CPU_R3000
   Please make sure to pick the right CPU type. Linux/MIPS is not
   designed to be generic, i.e. Kernels compiled for R3000 CPUs will
-  *not* work on R4000 Machines and vice versa.
-  However, since most the supported Machines have an R4000 (or 
-  similar) CPU, R4xx0 might be a safe bet.
-  If the resulting Kernel does not work try to recompile with R3000.
+  *not* work on R4000 machines and vice versa.  However, since most
+  of the supported machines have an R4000 (or similar) CPU, R4x00
+  might be a safe bet.  If the resulting kernel does not work,
+  try to recompile with R3000.
+
+  R3000    MIPS Technologies R3000-series processors,
+           including the 3041, 3051, and 3081.
+
+  R6000    MIPS Technologies R6000-series processors,
+           including the 64474, 64475, 64574 and 64575.
+
+  R4300    MIPS Technologies R4300-series processors.
+
+  R4x00    MIPS Technologies R4000-series processors other than 4300,
+           including the 4640, 4650, and 4700.
+
+  R5000    MIPS Technologies R5000-series processors other than the
+           Nevada.
+
+  R52xx    MIPS Technologies R52xx-series ("Nevada") processors.
+
+  R10000   MIPS Technologies R10000-series processors.
+
+R6000
+CONFIG_CPU_R6000
+  MIPS Technologies R6000-series processors, including the 64474,
+  64475, 64574 and 64575.
+
+R4300
+CONFIG_CPU_R4300
+  MIPS Technologies R4300-series processors.
+
+R4x00
+CONFIG_CPU_R4X00
+  MIPS Technologies R4000-series processors other than 4300, including
+  the 4640, 4650, and 4700.
+
+R5000
+CONFIG_CPU_R5000
+  MIPS Technologies R5000-series processors other than the Nevada.
+
+R52x0
+CONFIG_CPU_NEVADA
+  MIPS Technologies R52x0-series ("Nevada") processors.
+
+R8000
+CONFIG_CPU_R8000
+  MIPS Technologies R8000-series processors.
+
+R10000
+CONFIG_CPU_R10000
+  MIPS Technologies R10000-series processors.
+
+Discontiguous Memory Support
+CONFIG_DISCONTIGMEM
+  Say Y to upport efficient handling of discontiguous physical memory,
+  for architectures which are either NUMA (Non-Uniform Memory Access)
+  or have huge holes in the physical address space for other reasons.
+  See <file:Documentation/vm/numa> for more.
+
+Mapped kernel support
+CONFIG_MAPPED_KERNEL
+  Change the way a Linux kernel is loaded unto memory on a MIPS64
+  machine.  This is required in order to support text replication and
+  NUMA.  If you need to undersatand it, read the source code.
+
+Kernel text replication support
+CONFIG_REPLICATE_KTEXT
+  Say Y here to enable replicating the kernel text across multiple
+  nodes in a NUMA cluster.  This trades memory for speed.
+
+Exception handler replication support
+CONFIG_REPLICATE_EXHANDLERS
+  Say Y here to enable replicating the kernel exception handlers
+  across multiple nodes in a NUMA cluster. This trades memory for
+  speed.
+
+NUMA support?
+CONFIG_NUMA
+  Say Y to compile the kernel to support NUMA (Non-Uniform Memory
+  Access).  This option is for configuring high-end multiprocessor
+  server machines.  If in doubt, say N.
 
 CPU type
 CONFIG_CPU_VR41XX
@@ -1805,14 +2200,18 @@
 
 CPU feature configuration
 CONFIG_CPU_ADVANCED
-  Saying yes here allows you to select support for various features your
-  CPU may or may not have.  Most people should say N here.
+  Saying yes here allows you to select support for various features
+  your CPU may or may not have.  Most people should say N here.
 
-ll and sc instructions
+ll/sc Instructions available
 CONFIG_CPU_HAS_LLSC
-  Say Y here if your CPU has the ll and sc instructions.  Say Y here for
-  better performance, N if you don't know.  You must say Y here for
-  multiprocessor machines.
+  MIPS R4000 series and later provide the Load Linked (ll)
+  and Store Conditional (sc) instructions. More information is
+  available at <http://www.go-ecs.com/mips/miptek1.htm>.
+
+  Say Y here if your CPU has the ll and sc instructions.  Say Y here
+  for better performance, N if you don't know.  You must say Y here
+  for multiprocessor machines.
 
 lld and scd instructions
 CONFIG_CPU_HAS_LLDSCD
@@ -1820,7 +2219,7 @@
   equivalents of ll and sc.  Say Y here for better performance, N if
   you don't know.  You must say Y here for multiprocessor machines.
 
-Support for writebuffer flushing
+Writeback Buffer available
 CONFIG_CPU_HAS_WB
   Say N here for slightly better performance.  You must say Y here for
   machines which require flushing of write buffers in software.  Saying
@@ -1840,6 +2239,12 @@
   byte order. These modes require different kernels. Say Y if your
   machine is little endian, N if it's a big endian machine.
 
+Use power LED as a heartbeat
+CONFIG_HEARTBEAT
+  Use the power-on LED on your machine as a load meter.  The exact
+  behavior is platform-dependent, but normally the flash frequency is
+  a hyperbolic function of the 5-minute load average.
+
 Networking support
 CONFIG_NET
   Unless you really know what you are doing, you should say Y here.
@@ -1849,27 +2254,28 @@
   should consider updating your networking tools too because changes
   in the kernel and the tools often go hand in hand. The tools are
   contained in the package net-tools, the location and version number
-  of which are given in Documentation/Changes.
+  of which are given in <file:Documentation/Changes>.
 
   For a general introduction to Linux networking, it is highly
   recommended to read the NET-3-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
 Socket filtering
 CONFIG_FILTER
   The Linux Socket Filter is derived from the Berkeley Packet Filter.
   If you say Y here, user-space programs can attach a filter to any
   socket and thereby tell the kernel that it should allow or disallow
-  certain types of data to get through the socket. Linux Socket
-  Filtering works on all socket types except TCP for now. See the text
-  file Documentation/networking/filter.txt for more information.
+  certain types of data to get through the socket.  Linux Socket
+  Filtering works on all socket types except TCP for now.  See the
+  text file <file:Documentation/networking/filter.txt> for more
+  information.
 
   You need to say Y here if you want to use PPP packet filtering
   (see the CONFIG_PPP_FILTER option below).
 
   If unsure, say N.
 
-Network packet filtering
+Network packet filtering (replaces ipchains)
 CONFIG_NETFILTER
   Netfilter is a framework for filtering and mangling network packets
   that pass through your Linux box.
@@ -1912,21 +2318,21 @@
   Various modules exist for netfilter which replace the previous
   masquerading (ipmasqadm), packet filtering (ipchains), transparent
   proxying, and portforwarding mechanisms. Please see
-  Documentation/Changes under "iptables" for the location of these
-  packages.
- 
+  <file:Documentation/Changes> under "iptables" for the location of
+  these packages.
+
   Make sure to say N to "Fast switching" below if you intend to say Y
   here, as Fast switching currently bypasses netfilter.
- 
+
   Chances are that you should say Y here if you compile a kernel which
   will run as a router and N for regular hosts. If unsure, say N.
- 
+
 Network packet filtering debugging
 CONFIG_NETFILTER_DEBUG
   You can say Y here if you want to get additional messages useful in
-  debugging the netfilter code. 
+  debugging the netfilter code.
 
-IP: connection tracking (required for masq/NAT)
+Connection tracking (required for masq/NAT)
 CONFIG_IP_NF_CONNTRACK
   Connection tracking keeps a record of what packets have passed
   through your machine, in order to figure out how they are related
@@ -1938,7 +2344,7 @@
   below).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 IRC Send/Chat support
 CONFIG_IP_NF_IRC
@@ -1961,17 +2367,17 @@
   of Network Address Translation on them.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `Y'.
+  <file:Documentation/modules.txt>.  If unsure, say `Y'.
 
-IP: user space queueing via NETLINK (EXPERIMENTAL)
+User space queueing via NETLINK
 CONFIG_IP_NF_QUEUE
   Netfilter has the ability to queue packets to user space: the
   netlink device can be used to access them using this driver.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-IP: ip tables support (required for filtering/masq/NAT)
+IP tables support (required for filtering/masq/NAT)
 CONFIG_IP_NF_IPTABLES
   iptables is a general, extensible packet identification framework.
   The packet filtering and full NAT (masquerading, port forwarding,
@@ -1979,41 +2385,7 @@
   either of those.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-CONFIG_IP6_NF_MATCH_LIMIT
-  limit matching allows you to control the rate at which a rule can be
-  matched: mainly useful in combination with the LOG target ("LOG
-  target support", below) and to avoid some Denial of Service attacks.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-MAC address match support
-CONFIG_IP6_NF_MATCH_MAC
-  mac matching allows you to match packets based on the source
-  ethernet address of the packet.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-Multiple port match support
-CONFIG_IP6_NF_MATCH_MULTIPORT
-  Multiport matching allows you to match TCP or UDP packets based on
-  a series of source or destination ports: normally a rule can only
-  match a single range of ports.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-Owner match support (EXPERIMENTAL)
-CONFIG_IP6_NF_MATCH_OWNER
-  Packet owner matching allows you to match locally-generated packets
-  based on who created them: the user, group, process or session.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 limit match support
 CONFIG_IP_NF_MATCH_LIMIT
@@ -2022,24 +2394,24 @@
   target support", below) and to avoid some Denial of Service attacks.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 MAC address match support
 CONFIG_IP_NF_MATCH_MAC
-  mac matching allows you to match packets based on the source
-  ethernet address of the packet.
+  MAC matching allows you to match packets based on the source
+  Ethernet address of the packet.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-netfilter mark match support
+Netfilter MARK match support
 CONFIG_IP_NF_MATCH_MARK
   Netfilter mark matching allows you to match packets based on the
   `nfmark' value in the packet.  This can be set by the MARK target
   (see below).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Multiple port match support
 CONFIG_IP_NF_MATCH_MULTIPORT
@@ -2048,7 +2420,7 @@
   match a single range of ports.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 TTL match support
 CONFIG_IP_NF_MATCH_TTL
@@ -2064,7 +2436,7 @@
   specific value or range of values.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 TOS match support
 CONFIG_IP_NF_MATCH_TOS
@@ -2072,7 +2444,7 @@
   Service fields of the IP packet.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Connection state match support
 CONFIG_IP_NF_MATCH_STATE
@@ -2081,23 +2453,23 @@
   is a powerful tool for packet classification.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-Unclean match support (EXPERIMENTAL)
+Unclean match support
 CONFIG_IP_NF_MATCH_UNCLEAN
   Unclean packet matching matches any strange or invalid packets, by
   looking at a series of fields in the IP, TCP, UDP and ICMP headers.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-Owner match support (EXPERIMENTAL)
+Owner match support
 CONFIG_IP_NF_MATCH_OWNER
   Packet owner matching allows you to match locally-generated packets
   based on who created them: the user, group, process or session.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Packet filtering
 CONFIG_IP_NF_FILTER
@@ -2106,7 +2478,7 @@
   local output.  See the man page for iptables(8).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 REJECT target support
 CONFIG_IP_NF_TARGET_REJECT
@@ -2115,24 +2487,24 @@
   than silently being dropped.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-MIRROR target support (EXPERIMENTAL)
+MIRROR target support
 CONFIG_IP_NF_TARGET_MIRROR
   The MIRROR target allows a filtering rule to specify that an
   incoming packet should be bounced back to the sender.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-Full NAT
+Full NAT (Network Address Translation)
 CONFIG_IP_NF_NAT
   The Full NAT option allows masquerading, port forwarding and other
   forms of full Network Address Port Translation.  It is controlled by
   the `nat' table in iptables: see the man page for iptables(8).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 MASQUERADE target support
 CONFIG_IP_NF_TARGET_MASQUERADE
@@ -2143,21 +2515,21 @@
   address will be different on next dialup).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Basic SNMP-ALG support
 CONFIG_IP_NF_NAT_SNMP_BASIC
 
-  This module implements an Application Layer Gateway (ALG) for 
-  SNMP payloads.  In conjunction with NAT, it allows a network 
-  management system to access multiple private networks with 
-  conflicting addresses.  It works by modifying IP addresses 
+  This module implements an Application Layer Gateway (ALG) for
+  SNMP payloads.  In conjunction with NAT, it allows a network
+  management system to access multiple private networks with
+  conflicting addresses.  It works by modifying IP addresses
   inside SNMP payloads to match IP-layer NAT mapping.
-  
+
   This is the "basic" form of SNMP-ALG, as described in RFC 2962
-  
+
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 REDIRECT target support
 CONFIG_IP_NF_TARGET_REDIRECT
@@ -2167,7 +2539,7 @@
   useful for transparent proxies.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Packet mangling
 CONFIG_IP_NF_MANGLE
@@ -2176,7 +2548,7 @@
   which can effect how the packet is routed.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 TOS target support
 CONFIG_IP_NF_TARGET_TOS
@@ -2185,19 +2557,19 @@
   packet prior to routing.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 MARK target support
 CONFIG_IP_NF_TARGET_MARK
   This option adds a `MARK' target, which allows you to create rules
   in the `mangle' table which alter the netfilter mark (nfmark) field
-  associated with the packet packet prior to routing. This can change
-  the routing method (see `IP: use netfilter MARK value as routing
+  associated with the packet prior to routing. This can change
+  the routing method (see `Use netfilter MARK value as routing
   key') and can also be used by other subsystems to change their
   behavior.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 TCPMSS target support
 CONFIG_IP_NF_TARGET_TCPMSS
@@ -2222,16 +2594,16 @@
 		 -j TCPMSS --clamp-mss-to-pmtu
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-tcpmss match support
+TCPMSS match support
 CONFIG_IP_NF_MATCH_TCPMSS
   This option adds a `tcpmss' match, which allows you to examine the
   MSS value of TCP SYN packets, which control the maximum packet size
   for that connection.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 LOG target support
 CONFIG_IP_NF_TARGET_LOG
@@ -2239,7 +2611,7 @@
   any iptables table which records the packet header to the syslog.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 ipchains (2.2-style) support
 CONFIG_IP_NF_COMPAT_IPCHAINS
@@ -2250,7 +2622,7 @@
   the ipchains tool exactly as in 2.2 kernels.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 ipfwadm (2.0-style) support
 CONFIG_IP_NF_COMPAT_IPFWADM
@@ -2261,51 +2633,24 @@
   the ipfwadm tool exactly as in 2.0 kernels.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-IP6 tables support (required for filtering/masq/NAT)
-CONFIG_IP6_NF_IPTABLES
-  ip6tables is a general, extensible packet identification framework.
-  Currently only the packet filtering and packet mangling subsystem
-  for IPv6 use this, but connection tracking is going to follow.
-  Say 'Y' or 'M' here if you want to use either of those.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-IPv6 limit match support
-CONFIG_IP6_NF_MATCH_LIMIT
-  limit matching allows you to control the rate at which a rule can be
-  matched: mainly useful in combination with the LOG target ("LOG
-  target support", below) and to avoid some Denial of Service attacks.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 MAC address match support
 CONFIG_IP6_NF_MATCH_MAC
   mac matching allows you to match packets based on the source
-  ethernet address of the packet.
+  Ethernet address of the packet.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-netfilter mark match support
+Netfilter MARK match support
 CONFIG_IP6_NF_MATCH_MARK
   Netfilter mark matching allows you to match packets based on the
   `nfmark' value in the packet.  This can be set by the MARK target
   (see below).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-LOG target support
-CONFIG_IP6_NF_TARGET_LOG
-  This option adds a `LOG' target, which allows you to create rules in
-  any ip6tables table which records the packet header to the syslog.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Packet filtering
 CONFIG_IP6_NF_FILTER
@@ -2314,7 +2659,7 @@
   local output.  See the man page for iptables(8).
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 Packet mangling
 CONFIG_IP6_NF_MANGLE
@@ -2323,38 +2668,38 @@
   which can effect how the packet is routed.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 MARK target support
 CONFIG_IP6_NF_TARGET_MARK
   This option adds a `MARK' target, which allows you to create rules
   in the `mangle' table which alter the netfilter mark (nfmark) field
   associated with the packet packet prior to routing. This can change
-  the routing method (see `IP: use netfilter MARK value as routing
+  the routing method (see `Use netfilter MARK value as routing
   key') and can also be used by other subsystems to change their
   behavior.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 TCP Explicit Congestion Notification support
 CONFIG_INET_ECN
   Explicit Congestion Notification (ECN) allows routers to notify
   clients about network congestion, resulting in fewer dropped packets
-  and increased network performance. This option adds ECN support to the
-  Linux kernel, as well as a sysctl (/proc/sys/net/ipv4/tcp_ecn) which
-  allows ECN support to be disabled at runtime.
+  and increased network performance.  This option adds ECN support to
+  the Linux kernel, as well as a sysctl (/proc/sys/net/ipv4/tcp_ecn)
+  which allows ECN support to be disabled at runtime.
 
   Note that, on the Internet, there are many broken firewalls which
   refuse connections from ECN-enabled machines, and it may be a while
-  before these firewalls are fixed. Until then, to access a site behind
-  such a firewall (some of which are major sites, at the time of this
-  writing) you will have to disable this option, either by saying N now
-  or by using the sysctl.
+  before these firewalls are fixed.  Until then, to access a site
+  behind such a firewall (some of which are major sites, at the time
+  of this writing) you will have to disable this option, either by
+  saying N now or by using the sysctl.
 
   If in doubt, say N.
 
-IP6 tables support (required for filtering/masq/NAT)
+IPv6 tables support (required for filtering/masq/NAT)
 CONFIG_IP6_NF_IPTABLES
   ip6tables is a general, extensible packet identification framework.
   Currently only the packet filtering and packet mangling subsystem
@@ -2362,7 +2707,7 @@
   Say 'Y' or 'M' here if you want to use either of those.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 IPv6 limit match support
 CONFIG_IP6_NF_MATCH_LIMIT
@@ -2371,54 +2716,7 @@
   target support", below) and to avoid some Denial of Service attacks.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-MAC address match support
-CONFIG_IP6_NF_MATCH_MAC
-  mac matching allows you to match packets based on the source
-  ethernet address of the packet.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-netfilter mark match support
-CONFIG_IP6_NF_MATCH_MARK
-  Netfilter mark matching allows you to match packets based on the
-  `nfmark' value in the packet.  This can be set by the MARK target
-  (see below).
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-Packet filtering
-CONFIG_IP6_NF_FILTER
-  Packet filtering defines a table `filter', which has a series of
-  rules for simple packet filtering at local input, forwarding and
-  local output.  See the man page for iptables(8).
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-Packet mangling
-CONFIG_IP6_NF_MANGLE
-  This option adds a `mangle' table to iptables: see the man page for
-  iptables(8).  This table is used for various packet alterations
-  which can effect how the packet is routed.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-MARK target support
-CONFIG_IP6_NF_TARGET_MARK
-  This option adds a `MARK' target, which allows you to create rules
-  in the `mangle' table which alter the netfilter mark (nfmark) field
-  associated with the packet packet prior to routing. This can change
-  the routing method (see `IP: use netfilter MARK value as routing
-  key') and can also be used by other subsystems to change their
-  behavior.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
 
 SYN flood protection
 CONFIG_SYN_COOKIES
@@ -2434,8 +2732,7 @@
   continue to connect, even when your machine is under attack. There
   is no need for the legitimate users to change their TCP/IP software;
   SYN cookies work transparently to them. For technical information
-  about SYN cookies, check out
-  ftp://koobera.math.uic.edu/syncookies.html .
+  about SYN cookies, check out <http://cr.yp.to/syncookies.html>.
 
   If you are SYN flooded, the source address reported by the kernel is
   likely to have been forged by the attacker; it is only reported as
@@ -2450,12 +2747,21 @@
   you can enable them by saying Y to "/proc file system support" and
   "Sysctl support" below and executing the command
 
-    echo 1 >/proc/sys/net/ipv4/tcp_syncookies 
+    echo 1 >/proc/sys/net/ipv4/tcp_syncookies
 
   at boot time after the /proc file system has been mounted.
-  
-  If unsure, say Y.
 
+  If unsure, say N.
+
+HCI EMU (virtual device) driver
+CONFIG_BLUEZ_HCIEMU
+  Bluetooth Virtual HCI device driver.
+  This driver is required if you want to use HCI Emulation software.
+
+  Say Y here to compile support for Virtual HCI devices into the
+  kernel or say M to compile it as module (hci_usb.o).
+
+# Choice: alphatype
 Alpha system type
 CONFIG_ALPHA_GENERIC
   This is the system type of your hardware.  A "generic" kernel will
@@ -2464,7 +2770,7 @@
 
   To find out what type of Alpha system you have, you may want to
   check out the Linux/Alpha FAQ, accessible on the WWW from
-  http://www.alphalinux.org . In summary:
+  <http://www.alphalinux.org>. In summary:
 
   Alcor/Alpha-XLT     AS 600
   Alpha-XL            XL-233, XL-266
@@ -2476,7 +2782,7 @@
   EB64+               EB64+ 21064 evaluation board
   EB66                EB66 21066 evaluation board
   EB66+               EB66+ 21066 evaluation board
-  Jensen              DECpc 150, DEC 2000 model 300, 
+  Jensen              DECpc 150, DEC 2000 model 300,
                       DEC 2000 model 500
   LX164               AlphaPC164-LX
   Miata               Personal Workstation 433a, 433au, 500a,
@@ -2496,21 +2802,160 @@
 
   If you don't know what to do, choose "generic".
 
-EV5 CPU daughtercard
+# Most of the information on these variants is from
+# <http://www.alphalinux.org/docs/alpha-howto.html>
+Alcor/Alpha-XLT
+CONFIG_ALPHA_ALCOR
+  For systems using the Digital ALCOR chipset: 5 chips (4, 64-bit data
+  slices (Data Switch, DSW) - 208-pin PQFP and 1 control (Control, I/O
+  Address, CIA) - a 383 pin plastic PGA).  It provides a DRAM
+  controller (256-bit memory bus) and a PCI interface.  It also does
+  all the work required to support an external Bcache and to maintain
+  memory coherence when a PCI device DMAs into (or out of) memory.
+
+Alpha-XL
+CONFIG_ALPHA_XL
+  XL-233 and XL-266-based Alpha systems.
+
+AlphaBook1
+CONFIG_ALPHA_BOOK1
+  Dec AlphaBook1/Burns Alpha-based laptops.
+
+Avanti
+CONFIG_ALPHA_AVANTI
+  Avanti AS 200, AS 205, AS 250, AS 255, AS 300, and AS 400-based
+  Alphas. Info at
+  <http://www.unix-ag.org/Linux-Alpha/Architectures/Avanti.html>.
+
+Cabriolet
+CONFIG_ALPHA_CABRIOLET
+  Cabriolet AlphaPC64, AlphaPCI64 systems.  Derived from EB64+ but now
+  baby-AT with Flash boot ROM, no on-board SCSI or Ethernet. 3 ISA
+  slots, 4 PCI slots (one pair are on a shared slot), uses plug-in
+  Bcache SIMMs.  Requires power supply with 3.3V output.
+
+DP264
+CONFIG_ALPHA_DP264
+  Various 21264 systems with the tsunami core logic chipset.
+  API Networks: 264DP, UP2000(+), CS20;
+  Compaq: DS10(E,L), XP900, XP1000, DS20(E), ES40.
+
+EB164
+CONFIG_ALPHA_EB164
+  EB164 21164 evaluation board from DEC.  Uses 21164 and ALCOR.  Has
+  ISA and PCI expansion (3 ISA slots, 2 64-bit PCI slots (one is
+  shared with an ISA slot) and 2 32-bit PCI slots.  Uses plus-in
+  Bcache SIMMs. I/O sub-system provides SuperI/O (2S, 1P, FD), KBD,
+  MOUSE (PS2 style), RTC/NVRAM.  Boot ROM is Flash.  PC-AT-sized
+  motherboard.  Requires power supply with 3.3V output.
+
+EB64+
+CONFIG_ALPHA_EB64P
+  Uses 21064 or 21064A and APECs.  Has ISA and PCI expansion (3 ISA,
+  2 PCI, one pair are on a shared slot). Supports 36-bit DRAM SIMs.
+  ISA bus generated by Intel SaturnI/O PCI-ISA bridge. On-board SCSI
+  (NCR 810 on PCI) Ethernet (Digital 21040), KBD, MOUSE (PS2 style),
+  SuperI/O (2S, 1P, FD), RTC/NVRAM. Boot ROM is EPROM.  PC-AT size.
+  Runs from standard PC power supply.
+
+EB66
+CONFIG_ALPHA_EB66
+  A Digital DS group board.  Uses 21066 or 21066A.  I/O sub-system is
+  identical to EB64+.  Baby PC-AT size.  Runs from standard PC power
+  supply.  The EB66 schematic was published as a marketing poster
+  advertising the 21066 as "the first microprocessor in the world with
+  embedded PCI".
+
+EB66+
+CONFIG_ALPHA_EB66P
+  Later variant of the EB66 board.
+
+Eiger
+CONFIG_ALPHA_EIGER
+  Apparently an obscure OEM single-board computer based on the
+  Typhoon/Tsunami chipset family. Information on it is scanty.
+
+Jensen
+CONFIG_ALPHA_JENSEN
+  DEC PC 150 AXP (aka Jensen): This is a very old Digital system - one
+  of the first-generation Alpha systems. A number of these systems
+  seem to be available on the second- hand market. The Jensen is a
+  floor-standing tower system which originally used a 150MHz 21064 It
+  used programmable logic to interface a 486 EISA I/O bridge to the
+  CPU.
+
+LX164
+CONFIG_ALPHA_LX164
+  A technical overview of this board is available at
+  <http://www.unix-ag.org/Linux-Alpha/Architectures/LX164.html>.
+
+Miata
+CONFIG_ALPHA_MIATA
+  The Digital PersonalWorkStation (PWS 433a, 433au, 500a, 500au, 600a,
+  or 600au).  There is an Installation HOWTO for this hardware at
+  <http://members.brabant.chello.nl/~s.vandereijk/miata.html>.
+
+Mikasa
+CONFIG_ALPHA_MIKASA
+  AlphaServer 1000-based Alpha systems.
+
+Nautilus
+CONFIG_ALPHA_NAUTILUS
+  Alpha systems based on the AMD 751 & ALI 1543C chipsets.
+
+Noname
+CONFIG_ALPHA_NONAME
+  The AXPpci33 (aka NoName), is based on the EB66 (includes the Multia
+  UDB).  This design was produced by Digital's Technical OEM (TOEM)
+  group. It uses the 21066 processor running at 166MHz or 233MHz. It
+  is a baby-AT size, and runs from a standard PC power supply. It has
+  5 ISA slots and 3 PCI slots (one pair are a shared slot). There are
+  2 versions, with either PS/2 or large DIN connectors for the
+  keyboard.
+
+Noritake
+CONFIG_ALPHA_NORITAKE
+  AlphaServer 1000A, AlphaServer 600A, and AlphaServer 800-based
+  systems.
+
+Rawhide
+CONFIG_ALPHA_RAWHIDE
+  AlphaServer 1200, AlphaServer 4000 and AlphaServer 4100 machines.
+  See HOWTO at
+  <http://www.alphalinux.org/docs/rawhide/4100_install.shtml>.
+
+Ruffian
+CONFIG_ALPHA_RUFFIAN
+  Samsung APC164UX.  There is a page on known problems and workarounds
+  at <http://www.alphalinux.org/faq/FAQ-11.html>.
+
+Sable
+CONFIG_ALPHA_SABLE
+  Digital AlphaServer 2000 and 2100-based systems.
+
+Takara
+CONFIG_ALPHA_TAKARA
+  Alpha 11164-based OEM single-board computer.
+
+Wildfire
+CONFIG_ALPHA_WILDFIRE
+  AlphaServer GS 40/80/160/320 SMP based on the EV67 core.
+
+EV5 CPU daughtercard (model 5/xxx)
 CONFIG_ALPHA_PRIMO
   Say Y if you have an AS 1000 5/xxx or an AS 1000A 5/xxx.
 
-EV5 CPU(s)
+EV5 CPU(s) (model 5/xxx)
 CONFIG_ALPHA_GAMMA
   Say Y if you have an AS 2000 5/xxx or an AS 2100 5/xxx.
 
-Using SRM as bootloader
+Use SRM as bootloader
 CONFIG_ALPHA_SRM
   There are two different types of booting firmware on Alphas: SRM,
   which is command line driven, and ARC, which uses menus and arrow
   keys. Details about the Linux/Alpha booting process are contained in
   the Linux/Alpha FAQ, accessible on the WWW from
-  http://www.alphalinux.org .
+  <http://www.alphalinux.org>.
 
   The usual way to load Linux on an Alpha machine is to use MILO
   (a bootloader that lets you pass command line parameters to the
@@ -2521,7 +2966,7 @@
   here. If MILO doesn't work on your system (true for Jensen
   motherboards), you can bypass it altogether and boot Linux directly
   from an SRM console; say Y here in order to do that. Note that you
-  won't be able to boot from an IDE disk using SRM. 
+  won't be able to boot from an IDE disk using SRM.
 
   If unsure, say N.
 
@@ -2530,20 +2975,20 @@
   The 2.4 kernel changed the kernel start address from 0x310000
   to 0x810000 to make room for the Wildfire's larger SRM console.
 
-  If you're using aboot 0.7 or later, the bootloader will examine
-  the ELF headers to determine where to transfer control.  Unfortunately,
-  most older bootloaders -- APB or MILO -- hardcoded the kernel
-  start address rather than examining the ELF headers, and the result
-  is a hard lockup.
+  If you're using aboot 0.7 or later, the bootloader will examine the
+  ELF headers to determine where to transfer control. Unfortunately,
+  most older bootloaders -- APB or MILO -- hardcoded the kernel start
+  address rather than examining the ELF headers, and the result is a
+  hard lockup.
 
-  Say Y if you have a broken bootloader.  Say N if you do not, or
-  if you wish to run on Wildfire.
+  Say Y if you have a broken bootloader.  Say N if you do not, or if
+  you wish to run on Wildfire.
 
 Large VMALLOC support
 CONFIG_ALPHA_LARGE_VMALLOC
-  Process creation and other aspects of virtual memory management
-  can be streamlined if we restrict the kernel to one PGD for all
-  vmalloc allocations.  This equates to about 8GB.
+  Process creation and other aspects of virtual memory management can
+  be streamlined if we restrict the kernel to one PGD for all vmalloc
+  allocations.  This equates to about 8GB.
 
   Under normal circumstances, this is so far and above what is needed
   as to be laughable.  However, there are certain applications (such
@@ -2559,11 +3004,11 @@
   This includes intelligent serial boards such as Cyclades,
   Digiboards, etc. These are usually used for systems that need many
   serial ports because they serve many terminals or dial-in
-  connections. 
+  connections.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
-  the questions about non-standard serial boards. 
+  kernel: saying N will just cause the configurator to skip all
+  the questions about non-standard serial boards.
 
   Most people can say N here.
 
@@ -2572,10 +3017,10 @@
   If you wish to use any non-standard features of the standard "dumb"
   driver, say Y here. This includes HUB6 support, shared serial
   interrupts, special multiport support, support for more than the
-  four COM 1/2/3/4 boards, etc. 
+  four COM 1/2/3/4 boards, etc.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about serial driver options. If unsure, say N.
 
 Support more than 4 serial ports
@@ -2583,22 +3028,30 @@
   Say Y here if you have dumb serial boards other than the four
   standard COM 1/2/3/4 ports. This may happen if you have an AST
   FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto ), or other custom
+  from <http://www.linuxdoc.org/docs.html#howto>), or other custom
   serial port hardware which acts similar to standard serial port
   hardware. If you only use the standard COM 1/2/3/4 ports, you can
   say N here to save some memory. You can also say Y if you have an
   "intelligent" multiport card such as Cyclades, Digiboards, etc.
 
+Support for serial ports defined by ACPI tables
+CONFIG_SERIAL_ACPI
+  Legacy free machines may not have serial ports at the legacy COM1, 
+  COM2 etc addresses. Serial ports on such machines are described by
+  the ACPI tables SPCR (Serial Port Console Redirection) table and 
+  DBGP (Debug Port) table. Say Y here if you want to include support
+  for these serial ports.
+
 Support for sharing serial interrupts
 CONFIG_SERIAL_SHARE_IRQ
   Some serial boards have hardware support which allows multiple dumb
   serial ports on the same board to share a single IRQ. To enable
   support for this in the serial driver, say Y here.
 
-Auto detect IRQ on standard ports (unsafe)
+Auto-detect IRQ on standard ports (unsafe)
 CONFIG_SERIAL_DETECT_IRQ
   Say Y here if you want the kernel to try to guess which IRQ
-  to use for your serial port. 
+  to use for your serial port.
 
   This is considered unsafe; it is far better to configure the IRQ in
   a boot script using the setserial command.
@@ -2612,16 +3065,12 @@
   servicing. Say Y here to enable the serial driver to take advantage
   of those special I/O ports.
 
-SGI PROM Console Support
-CONFIG_ARC_CONSOLE
-  Say Y here if you want to use the PROMs for console I/O.
-
 SGI Zilog85C30 serial support
 CONFIG_SGI_SERIAL
   If you want to use your SGI's built-in serial ports under Linux,
   answer Y.
 
-SGI Newport Graphics support (EXPERIMENTAL)
+SGI Newport Graphics support
 CONFIG_SGI_NEWPORT_GFX
   If you have an SGI machine and you want to compile the graphics
   drivers, say Y here. This will include the code for the
@@ -2651,14 +3100,14 @@
 CONFIG_PCMCIA_SERIAL_CS
   Say Y here to enable support for 16-bit PCMCIA serial devices,
   including serial port cards, modems, and the modem functions of
-  multi-function ethernet/modem cards. (PCMCIA- or PC-cards are
+  multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are
   credit-card size devices often used with laptops.)
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called serial_cs.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called serial_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 ACP Modem (Mwave) support
 CONFIG_MWAVE
@@ -2685,17 +3134,14 @@
   The module will be called mwave.o. If you want to compile it as
   a module, say M here and read Documentation/modules.txt.
 
-/dev/agpgart (AGP Support) (EXPERIMENTAL)
+/dev/agpgart (AGP Support)
 CONFIG_AGP
   AGP (Accelerated Graphics Port) is a bus system mainly used to
-  connect graphics cards to the rest of the system. 
+  connect graphics cards to the rest of the system.
 
   If you have an AGP system and you say Y here, it will be possible to
   use the AGP features of your 3D rendering video card. This code acts
-  as a sort of "AGP driver" for the motherboard's chipset. The glx
-  module will then be able to program the GART (graphics aperture
-  relocation table) registers with appropriate values to transfer
-  commands to the card.
+  as a sort of "AGP driver" for the motherboard's chipset.
 
   If you need more texture memory than you can get with the AGP GART
   (theoretically up to 256 MB, but in practice usually 64 or 128 MB
@@ -2706,47 +3152,42 @@
   write-combining with MTRR support on the AGP bus. Without it, OpenGL
   direct rendering will be a lot slower but still faster than PIO.
 
-  For the moment, you should probably say N, unless you want to test
-  the GLX component for XFree86 3.3.6, which can be downloaded from
-  http://utah-glx.sourceforge.net/ , or need to use the 810 Xserver in
-  XFree 3.3.6.
-
-  This driver is available as a module. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. The module
-  will be called agpgart.o.
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+  This driver is available as a module.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  The
+  module will be called agpgart.o.
 
-Intel 440LX/BX/GX/815/830M/840/850 support
+Intel 440LX/BX/GX/815/820/830/840/845/850/860 support
 CONFIG_AGP_INTEL
   This option gives you AGP support for the GLX component of the
-  XFree86 4.x on Intel 440LX/BX/GX, 815, 830M, 840 and 850 chipsets.
+  XFree86 4.x on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850 and 860 chipsets.
 
-  For the moment, you should probably say N, unless you want to test
-  the GLX component for XFree86 3.3.6, which can be downloaded from
-  http://utah-glx.sourceforge.net/ .
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
 
-Intel I810/I810 DC100/I810e support
+Intel I810/I815 DC100/I810e support
 CONFIG_AGP_I810
-  This option gives you AGP support for the Xserver on the Intel 810,
-  830M and 815 chipset boards for their on-board integrated graphics.
-  This is required to do any useful video modes with these boards.
+  This option gives you AGP support for the Xserver on the Intel 810
+  815 and 830m chipset boards for their on-board integrated graphics. This
+  is required to do any useful video modes with these boards.
 
 VIA chipset support
 CONFIG_AGP_VIA
   This option gives you AGP support for the GLX component of the
   XFree86 4.x on VIA MPV3/Apollo Pro chipsets.
 
-  For the moment, you should probably say N, unless you want to test
-  the GLX component for XFree86 3.3.6, which can be downloaded from
-  http://utah-glx.sourceforge.net/ .
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
 
 AMD Irongate, 761, and 762 support
 CONFIG_AGP_AMD
   This option gives you AGP support for the GLX component of the
   XFree86 4.x on AMD Irongate, 761, and 762 chipsets.
 
-  For the moment, you should probably say N, unless you want to test
-  the GLX component for XFree86 3.3.6, which can be downloaded from
-  http://utah-glx.sourceforge.net/ .
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
 
 Generic SiS support
 CONFIG_AGP_SIS
@@ -2756,33 +3197,47 @@
 
   Note that 5591/5592 AGP chipsets are NOT supported.
 
-  For the moment, you should probably say N, unless you want to test
-  the GLX component for XFree86 3.3.6, which can be downloaded from
-  http://utah-glx.sourceforge.net/ .
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
 
-ALI M1541 support
+Serverworks LE/HE support
+CONFIG_AGP_SWORKS
+  Say Y here to support the Serverworks AGP card.  See 
+  <http://www.serverworks.com/> for product descriptions and images.
+
+ALI chipset support
 CONFIG_AGP_ALI
   This option gives you AGP support for the GLX component of the
-  XFree86 4.x on the ALi M1541 chipset.
+  XFree86 4.x on the following ALi chipsets.  The supported chipsets
+  include M1541, M1621, M1631, M1632, M1641,M1647,and M1651.
+  For the ALi-chipset question, ALi suggests you refer to
+  <http://www.ali.com.tw/eng/support/index.shtml>.
 
-  This chipset can do AGP 1x and 2x, but note that there is an
+  The M1541 chipset can do AGP 1x and 2x, but note that there is an
   acknowledged incompatibility with Matrox G200 cards. Due to
   timing issues, this chipset cannot do AGP 2x with the G200.
   This is a hardware limitation. AGP 1x seems to be fine, though.
 
-  For the moment, you should probably say N, unless you want to test
-  the GLX component for XFree86 3.3.6, which can be downloaded from
-  http://utah-glx.sourceforge.net/ .
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
 
-PCI support
+Support for ISA-bus hardware
+CONFIG_ISA
+  Find out whether you have ISA slots on your motherboard.  ISA is the
+  name of a bus system, i.e. the way the CPU talks to the other stuff
+  inside your box.  Other bus systems are PCI, EISA, MicroChannel
+  (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
+  newer boards don't support it.  If you have ISA, say Y, otherwise N.
+
+Support for PCI bus hardware
 CONFIG_PCI
   Find out whether you have a PCI motherboard. PCI is the name of a
   bus system, i.e. the way the CPU talks to the other stuff inside
-  your box. Other bus systems are ISA, EISA, Microchannel (MCA) or
-  VESA. If you have PCI, say Y, otherwise N. 
+  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
+  VESA. If you have PCI, say Y, otherwise N.
 
   The PCI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , contains valuable
+  <http://www.linuxdoc.org/docs.html#howto>, contains valuable
   information about which PCI hardware does work under Linux and which
   doesn't.
 
@@ -2790,11 +3245,11 @@
 CONFIG_PCI_INTEGRATOR
   Find out whether you have a PCI motherboard. PCI is the name of a
   bus system, i.e. the way the CPU talks to the other stuff inside
-  your box. Other bus systems are ISA, EISA, Microchannel (MCA) or
-  VESA. If you have PCI, say Y, otherwise N. 
+  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
+  VESA. If you have PCI, say Y, otherwise N.
 
   The PCI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , contains valuable
+  <http://www.linuxdoc.org/docs.html#howto>, contains valuable
   information about which PCI hardware does work under Linux and which
   doesn't.
 
@@ -2802,14 +3257,15 @@
 CONFIG_PCI_QSPAN
   Find out whether you have a PCI motherboard. PCI is the name of a
   bus system, i.e. the way the CPU talks to the other stuff inside
-  your box. Other bus systems are ISA, EISA, Microchannel (MCA) or
-  VESA. If you have PCI, say Y, otherwise N. 
+  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
+  VESA. If you have PCI, say Y, otherwise N.
 
   The PCI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , contains valuable
+  <http://www.linuxdoc.org/docs.html#howto>, contains valuable
   information about which PCI hardware does work under Linux and which
   doesn't.
 
+# Choice: pci_access
 PCI access mode
 CONFIG_PCI_GOBIOS
   On PCI systems, the BIOS can be used to detect the PCI devices and
@@ -2838,22 +3294,56 @@
 
   When in doubt, say Y.
 
+PCI Hotplug support
+CONFIG_HOTPLUG_PCI
+  Say Y here if you have a motherboard with a PCI Hotplug controller.
+  This allows you to add and remove PCI cards while the machine is
+  powered up and running.  The file system pcihpfs must be mounted
+  in order to interact with any PCI Hotplug controllers.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pci_hotplug.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  When in doubt, say N.
+
+PCI Compaq Hotplug controller
+CONFIG_HOTPLUG_PCI_COMPAQ
+  Say Y here if you have a motherboard with a Compaq PCI Hotplug
+  controller.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cpqphp.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  When in doubt, say N.
+
+PCI Compaq Hotplug controller NVRAM support
+CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM
+  Say Y here if you have a Compaq server that has a PCI Hotplug
+  controller.  This will allow the PCI Hotplug driver to store the PCI
+  system configuration options in NVRAM.
+
+  When in doubt, say N.
+
 MCA support
 CONFIG_MCA
   MicroChannel Architecture is found in some IBM PS/2 machines and
-  laptops. It is a bus system similar to PCI or ISA. See
-  Documentation/mca.txt (and especially the web page given there)
-  before attempting to build an MCA bus kernel.
+  laptops.  It is a bus system similar to PCI or ISA. See
+  <file:Documentation/mca.txt> (and especially the web page given
+  there) before attempting to build an MCA bus kernel.
 
-EISA support
+Support for EISA-bus hardware
 CONFIG_EISA
   The Extended Industry Standard Architecture (EISA) bus was
   developed as an open alternative to the IBM MicroChannel bus.
 
   The EISA bus provided some of the features of the IBM MicroChannel
   bus while maintaining backward compatibility with cards made for
-  the older ISA bus. The EISA bus saw limited use between 1988 and 1995
-  when it was made obsolete by the PCI bus.
+  the older ISA bus.  The EISA bus saw limited use between 1988 and
+  1995 when it was made obsolete by the PCI bus.
 
   Say Y here if you are building a kernel for an EISA-based machine.
 
@@ -2866,7 +3356,7 @@
   Say Y here to create a kernel to run on the SGI 320 or 540.
   A kernel compiled for the Visual Workstation will not run on other
   PC boards and vice versa.
-  See Documentation/sgi-visws.txt for more.
+  See <file:Documentation/sgi-visws.txt> for more.
 
 SGI Visual Workstation framebuffer support
 CONFIG_FB_SGIVW
@@ -2891,8 +3381,8 @@
   This support is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. You will get modules called i2o_core.o
-  and i2o_config.o. 
+  <file:Documentation/modules.txt>.  You will get modules called
+  i2o_core.o and i2o_config.o.
 
   If unsure, say N.
 
@@ -2904,7 +3394,7 @@
   This support is also available as a module called i2o_pci.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 I2O Block OSM
 CONFIG_I2O_BLOCK
@@ -2914,7 +3404,7 @@
   This support is also available as a module called i2o_block.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 I2O LAN OSM
 CONFIG_I2O_LAN
@@ -2925,7 +3415,7 @@
   This support is also available as a module called i2o_lan.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 I2O SCSI OSM
 CONFIG_I2O_SCSI
@@ -2936,7 +3426,7 @@
   This support is also available as a module called i2o_scsi.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 I2O /proc support
 CONFIG_I2O_PROC
@@ -2947,7 +3437,7 @@
   This support is also available as a module called i2o_proc.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Plug and Play support
 CONFIG_PNP
@@ -2959,24 +3449,41 @@
 
   Say Y here if you would like Linux to configure your Plug and Play
   devices. You should then also say Y to "ISA Plug and Play support",
-  below. Alternatively, you can say N here and configure your PnP 
+  below. Alternatively, you can say N here and configure your PnP
   devices using the user space utilities contained in the isapnptools
   package.
-  
+
   This support is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 ISA Plug and Play support
 CONFIG_ISAPNP
   Say Y here if you would like support for ISA Plug and Play devices.
-  Some information is in Documentation/isapnp.txt.
- 
+  Some information is in <file:Documentation/isapnp.txt>.
+
   This support is also available as a module called isapnp.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
+
+  If unsure, say Y.
+
+PNPBIOS support
+CONFIG_PNPBIOS
+  Linux uses the PNPBIOS as defined in "Plug and Play BIOS
+  Specification Version 1.0A May 5, 1994" to autodetect built-in
+  mainboard resources (e.g. parallel port resources).
+
+  Other features (e.g. change resources, ESCD, event notification,
+  Docking station information, ISAPNP services) are not used.
+
+  Note: ACPI is expected to supersede PNPBIOS some day, currently it
+  co-exists nicely.
+
+  See latest pcmcia-cs (stand-alone package) for a nice "lspnp" tools,
+  or have a look at /proc/bus/pnp.
 
   If unsure, say Y.
 
@@ -2992,50 +3499,55 @@
   example, used on modern desktops as well as laptops, is USB.
 
   Enable HOTPLUG and KMOD, and build a modular kernel.  Get agent
-  software (at http://linux-hotplug.sourceforge.net) and install it.
+  software (at <http://linux-hotplug.sourceforge.net>) and install it.
   Then your kernel will automatically call out to a user mode "policy
   agent" (/sbin/hotplug) to load modules and set up software needed
   to use devices as you hotplug them.
 
-PCMCIA/Cardbus support
+PCMCIA/CardBus support
 CONFIG_PCMCIA
   Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
-  computer. These are credit-card size devices such as network cards,
-  modems or hard drives often used with laptops computers. There are
+  computer.  These are credit-card size devices such as network cards,
+  modems or hard drives often used with laptops computers.  There are
   actually two varieties of these cards: the older 16 bit PCMCIA cards
-  and the newer 32 bit CardBus cards. If you want to use CardBus
+  and the newer 32 bit CardBus cards.  If you want to use CardBus
   cards, you need to say Y here and also to "CardBus support" below.
 
-  To use your PC-cards, you will need supporting software from David 
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for 
-  location). Please also read the PCMCIA-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  Please also read the PCMCIA-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   When compiled this way, there will be modules called pcmcia_core.o
   and ds.o.  If you want to compile it as a module, say M here and
-  read Documentation/modules.txt.
+  read <file:Documentation/modules.txt>.
 
-CardBus support
+CardBus card and (Yenta) bridge support
 CONFIG_CARDBUS
-  CardBus is a bus mastering architecture for PC-cards, which allows 
-  for 32 bit PC-cards (the original PCMCIA standard specifies only 
+  CardBus is a bus mastering architecture for PC-cards, which allows
+  for 32 bit PC-cards (the original PCMCIA standard specifies only
   a 16 bit wide bus). Many newer PC-cards are actually CardBus cards.
 
-  To use your PC-cards, you will need supporting software from David 
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for 
-  location).
+  This option enables support for CardBus PC Cards, as well as support
+  for CardBus host bridges.  Virtually all modern PCMCIA bridges are
+  CardBus compatible.  A "bridge" is the hardware inside your computer
+  that PCMCIA cards are plugged into.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).
 
   If unsure, say Y.
 
-i82365/Yenta compatible bridge support
+i82365 compatible host bridge support
 CONFIG_I82365
-  Say Y here to include support for PCMCIA and CardBus host bridges
-  that are register compatible with the Intel i82365 and/or the Yenta
-  specification: this includes virtually all modern PCMCIA bridges.
-  "Bridge" is the name used for the hardware inside your computer that
-  PCMCIA cards are plugged into. If unsure, say Y.
+  Say Y here to include support for ISA-bus PCMCIA host bridges that
+  are register compatible with the Intel i82365.  These are found on
+  older laptops and ISA-bus card readers for desktop systems.  A
+  "bridge" is the hardware inside your computer that PCMCIA cards are
+  plugged into. If unsure, say N.
 
 Databook TCIC host bridge support
 CONFIG_TCIC
@@ -3052,60 +3564,67 @@
   and some programs won't run unless you say Y here. In particular, if
   you want to run the DOS emulator dosemu under Linux (read the
   DOSEMU-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto ), you'll need to say Y
+  <http://www.linuxdoc.org/docs.html#howto>), you'll need to say Y
   here.
-  
+
   You can find documentation about IPC with "info ipc" and also in
   section 6.4 of the Linux Programmer's Guide, available from
-  http://www.linuxdoc.org/docs.html#guide .
+  <http://www.linuxdoc.org/docs.html#guide>.
 
 BSD Process Accounting
 CONFIG_BSD_PROCESS_ACCT
   If you say Y here, a user level program will be able to instruct the
   kernel (via a special system call) to write process accounting
   information to a file: whenever a process exits, information about
-  that process will be appended to the file by the kernel. The
+  that process will be appended to the file by the kernel.  The
   information includes things such as creation time, owning user,
   command name, memory usage, controlling terminal etc. (the complete
-  list is in the struct acct in include/linux/acct.h). It is up to the
-  user level program to do useful things with this information. This
-  is generally a good idea, so say Y.
-  
+  list is in the struct acct in <file:include/linux/acct.h>).  It is
+  up to the user level program to do useful things with this
+  information.  This is generally a good idea, so say Y.
+
 Sysctl support
 CONFIG_SYSCTL
   The sysctl interface provides a means of dynamically changing
   certain kernel parameters and variables on the fly without requiring
-  a recompile of the kernel or reboot of the system. The primary
+  a recompile of the kernel or reboot of the system.  The primary
   interface consists of a system call, but if you say Y to "/proc
   file system support", a tree of modifiable sysctl entries will be
   generated beneath the /proc/sys directory. They are explained in the
-  files in Documentation/sysctl/. Note that enabling this option will
-  enlarge the kernel by at least 8 KB.
+  files in <file:Documentation/sysctl/>.  Note that enabling this
+  option will enlarge the kernel by at least 8 KB.
 
   As it is generally a good thing, you should say Y here unless
   building a kernel for install/rescue disks or your system is very
   limited in memory.
 
+# Choice: kcore
 Kernel core (/proc/kcore) format
 CONFIG_KCORE_ELF
-  If you enabled support for /proc file system then the file 
-  /proc/kcore will contain the kernel core image. This can be used 
+  If you enabled support for /proc file system then the file
+  /proc/kcore will contain the kernel core image. This can be used
   in gdb:
 
   $ cd /usr/src/linux ; gdb vmlinux /proc/kcore
 
-  You have two choices here: ELF and A.OUT. Selecting ELF will make 
+  You have two choices here: ELF and A.OUT. Selecting ELF will make
   /proc/kcore appear in ELF core format as defined by the Executable
   and Linking Format specification. Selecting A.OUT will choose the
   old "a.out" format which may be necessary for some old versions
   of binutils or on some architectures.
 
-  This is especially useful if you have compiled the kernel with the 
-  "-g" option to preserve debugging information. It is mainly used 
-  for examining kernel data structures on the live kernel so if you 
-  don't understand what this means or are not a kernel hacker, just 
+  This is especially useful if you have compiled the kernel with the
+  "-g" option to preserve debugging information. It is mainly used
+  for examining kernel data structures on the live kernel so if you
+  don't understand what this means or are not a kernel hacker, just
   leave it at its default value ELF.
 
+# Choice: kcore
+Select a.out format for /proc/kcore
+CONFIG_KCORE_AOUT
+  Not necessary unless you're using a very out-of-date binutils
+  version.  You probably want KCORE_ELF.
+
 Kernel support for ELF binaries
 CONFIG_BINFMT_ELF
   ELF (Executable and Linkable Format) is a format for libraries and
@@ -3120,21 +3639,21 @@
   want to say Y here.
 
   Information about ELF is contained in the ELF HOWTO available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you find that after upgrading from Linux kernel 1.2 and saying Y
   here, you still can't run any ELF binaries (they just crash), then
   you'll have to install the newest ELF runtime libraries, including
-  ld.so (check the file Documentation/Changes for location and latest
-  version).
+  ld.so (check the file <file:Documentation/Changes> for location and
+  latest version).
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called binfmt_elf.o. Saying M or N here is dangerous because some
-  crucial programs on your system might be in ELF format.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called binfmt_elf.o. Saying M or N here is dangerous because
+  some crucial programs on your system might be in ELF format.
 
-Kernel support for A.OUT binaries
+Kernel support for a.out binaries
 CONFIG_BINFMT_AOUT
   A.out (Assembler.OUTput) is a set of formats for libraries and
   executables used in the earliest versions of UNIX. Linux used the
@@ -3162,12 +3681,17 @@
   this to work, you need to have the emulator /usr/bin/em86 in place.
 
   You can get the same functionality by saying N here and saying Y to
-  "Kernel support for MISC binaries". 
+  "Kernel support for MISC binaries".
 
   You may answer M to compile the emulation support as a module and
   later load the module when you want to use a Linux/Intel binary. The
   module will be called binfmt_em86.o. If unsure, say Y.
 
+Kernel support for SOM binaries
+CONFIG_BINFMT_SOM
+  SOM is a binary executable format inherited from HP/UX.  Say Y here
+  to be able to load and execute SOM binaries directly.
+
 Kernel support for MISC binaries
 CONFIG_BINFMT_MISC
   If you say Y here, it will be possible to plug wrapper-driven binary
@@ -3175,15 +3699,15 @@
   programs that need an interpreter to run like Java, Python or
   Emacs-Lisp. It's also useful if you often run DOS executables under
   the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto ). Once you have
+  <http://www.linuxdoc.org/docs.html#howto>). Once you have
   registered such a binary class with the kernel, you can start one of
   those programs simply by typing in its name at a shell prompt; Linux
   will automatically feed it to the correct interpreter.
 
   You can do other nice things, too. Read the file
-  Documentation/binfmt_misc.txt to learn how to use this feature, and
-  Documentation/java.txt for information about how to include Java
-  support.
+  <file:Documentation/binfmt_misc.txt> to learn how to use this
+  feature, and <file:Documentation/java.txt> for information about how
+  to include Java support.
 
   You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
   use this part of the kernel.
@@ -3192,16 +3716,33 @@
   you have use for it; the module is called binfmt_misc.o. If you
   don't know what to answer at this point, say Y.
 
-Solaris binary emulation (EXPERIMENTAL)
+Kernel support for JAVA binaries
+CONFIG_BINFMT_JAVA
+  If you say Y here, the kernel will load and execute Java J-code
+  binaries directly.  Note: this option is obsolete and scheduled for
+  removal, use CONFIG_BINFMT_MISC instead.
+
+Solaris binary emulation
 CONFIG_SOLARIS_EMUL
   This is experimental code which will enable you to run (many)
-  Solaris binaries on your SPARC Linux machine. 
+  Solaris binaries on your SPARC Linux machine.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called solaris.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
+
+SUN SME environment monitoring
+CONFIG_ENVCTRL
+  Kernel support for temperature and fan monitoring on Sun SME
+  machines.
 
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called envctrl.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+# Choice: x86
 Processor family
 CONFIG_M386
   This is the processor type of your CPU. This information is used for
@@ -3215,17 +3756,17 @@
 
   Here are the settings recommended for greatest speed:
    - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI
-     486DLC/DLC2, UMC 486SX-S and NexGen Nx586. Only "386" kernels will
-     run on a 386 class machine.
+     486DLC/DLC2, UMC 486SX-S and NexGen Nx586.  Only "386" kernels
+     will run on a 386 class machine.
    - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or
      SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S.
-   - "586" for generic Pentium CPUs, possibly lacking the TSC 
+   - "586" for generic Pentium CPUs, possibly lacking the TSC
      (time stamp counter) register.
    - "Pentium-Classic" for the Intel Pentium.
    - "Pentium-MMX" for the Intel Pentium MMX.
    - "Pentium-Pro" for the Intel Pentium Pro/Celeron/Pentium II.
    - "Pentium-III" for the Intel Pentium III
-     and Celerons based on the coppermine core.
+     and Celerons based on the Coppermine core.
    - "Pentium-4" for the Intel Pentium 4.
    - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D).
    - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird).
@@ -3237,18 +3778,54 @@
 
   If you don't know what to do, choose "386".
 
+486
+CONFIG_M486
+  Select this for a x486 processor, ether Intel or one of the
+  compatible processors from AMD, Cyrix, IBM, or Intel.  Includes DX,
+  DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or
+  U5S.
+
+586/K5/5x86/6x86/6x86MX
+CONFIG_M586
+  Select this for an x586 or x686 processor such as the AMD K5, the
+  Intel 5x86 or 6x86, or the Intel 6x86MX.  This choice does not
+  assume the RDTSC instruction.
+
+Pentium Classic
+CONFIG_M586TSC
+  Select this for a Pentium Classic processor with the RDTSC (Read
+  Time Stamp Counter) instruction for benchmarking.
+
+32-bit PDC
+CONFIG_PDC_NARROW
+  Saying Y here will allow developers with a C180, C200, C240, C360,
+  J200, J210, and/or a J2240 to test 64-bit kernels by providing a
+  wrapper for the 32-bit PDC calls.  Since the machines which require
+  this option do not support over 4G of RAM, this option is targeted
+  for developers of these machines wishing to test changes on both
+  32-bit and 64-bit configurations.
+
+  If unsure, say N.
+
 VGA text console
 CONFIG_VGA_CONSOLE
   Saying Y here will allow you to use Linux in text mode through a
   display that complies with the generic VGA standard. Virtually
-  everyone wants that. 
+  everyone wants that.
 
   The program SVGATextMode can be used to utilize SVGA video cards to
   their full potential in text mode. Download it from
-  ftp://metalab.unc.edu/pub/Linux/utils/console .
+  <ftp://metalab.unc.edu/pub/Linux/utils/console>.
 
   Say Y.
 
+Distribute interrupts on all CPUs by default
+CONFIG_IRQ_ALL_CPUS
+  This option gives the kernel permission to distribute IRQs across
+  multiple CPUs.  Saying N here will route all IRQs to the first
+  CPU. Generally SMP PowerMacs can answer Y. SMP IBM CHRP boxes or
+  Power3 boxes should say N for now.
+
 Video mode selection support
 CONFIG_VIDEO_SELECT
   This enables support for text mode selection on kernel startup. If
@@ -3260,16 +3837,16 @@
   "man bootparam" or see the documentation of your boot loader about
   how to pass options to the kernel.)
 
-  Read the file Documentation/svga.txt for more information about the
-  Video mode selection support. If unsure, say N.
+  Read the file <file:Documentation/svga.txt> for more information
+  about the Video mode selection support. If unsure, say N.
 
-Support for frame buffer devices (EXPERIMENTAL)
+Support for frame buffer devices
 CONFIG_FB
   The frame buffer device provides an abstraction for the graphics
   hardware. It represents the frame buffer of some video hardware and
   allows application software to access the graphics hardware through
   a well-defined interface, so the software doesn't need to know
-  anything about the low-level (hardware register) stuff. 
+  anything about the low-level (hardware register) stuff.
 
   Frame buffer devices work identically across the different
   architectures supported by Linux and make the implementation of
@@ -3277,14 +3854,14 @@
   server exists which uses the frame buffer device exclusively.
   On several non-X86 architectures, the frame buffer device is the
   only way to use the graphics hardware.
- 
+
   The device is accessed through special device nodes, usually located
   in the /dev directory, i.e. /dev/fb*.
 
   You need an utility program called fbset to make full use of frame
-  buffer devices. Please read Documentation/fb/framebuffer.txt and the
-  Framebuffer-HOWTO at
-  http://www.tahallah.demon.co.uk/programming/prog.html for more
+  buffer devices. Please read <file:Documentation/fb/framebuffer.txt>
+  and the Framebuffer-HOWTO at
+  <http://www.tahallah.demon.co.uk/programming/prog.html> for more
   information.
 
   Say Y here and to the driver for your graphics board below if you
@@ -3302,6 +3879,27 @@
   hardware found in Acorn RISC PCs and other ARM-based machines.  If
   unsure, say N.
 
+Permedia2 support
+CONFIG_FB_PM2
+  This is the frame buffer device driver for the Permedia2 AGP frame
+  buffer card from ASK, aka `Graphic Blaster Exxtreme'.  There is a
+  product page at
+  <http://www.ask.com.hk/product/Permedia%202/permedia2.htm>.
+
+Enable FIFO disconnect feature
+CONFIG_FB_PM2_FIFO_DISCONNECT
+  Support the Permedia2 FIFOI disconnect feature (see CONFIG_FB_PM2).
+
+Generic Permedia2 PCI board support
+CONFIG_FB_PM2_PCI
+  Say Y to enable support for Permedia2 AGP frame buffer card from
+  3Dlabs (aka `Graphic Blaster Exxtreme') on the PCI bus.
+
+Phase5 CVisionPPC/BVisionPPC support
+CONFIG_FB_PM2_CVPPC
+  Say Y to enable support for the Amiga Phase 5 CVisionPPC BVisionPPC
+  framebuffer cards.  Phase 5 is no longer with us, alas.
+
 Amiga native chipset support
 CONFIG_FB_AMIGA
   This is the frame buffer device driver for the builtin graphics
@@ -3310,7 +3908,7 @@
   The driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want). The
   module will be called amifb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Amiga OCS chipset support
 CONFIG_FB_AMIGA_OCS
@@ -3348,7 +3946,7 @@
   Say Y if you have a NetWinder or a graphics card containing this
   device, otherwise say N.
 
-Amiga CyberVision3D support (EXPERIMENTAL)
+Amiga CyberVision3D support
 CONFIG_FB_VIRGE
   This enables support for the Cybervision 64/3D graphics card from
   Phase5. Please note that its use is not all that intuitive (i.e. if
@@ -3357,13 +3955,13 @@
   kernel. Please note that this driver DOES NOT support the older
   Cybervision 64 card, as they use incompatible video chips.
 
-Amiga RetinaZ3 support (EXPERIMENTAL)
+Amiga RetinaZ3 support
 CONFIG_FB_RETINAZ3
   This enables support for the Retina Z3 graphics card. Say N unless
   you have a Retina Z3 or plan to get one before you next recompile
   the kernel.
 
-Cirrus Logic generic driver (EXPERIMENTAL)
+Cirrus Logic generic driver
 CONFIG_FB_CLGEN
   This enables support for Cirrus Logic GD542x/543x based boards on
   Amiga: SD64, Piccolo, Picasso II/II+, Picasso IV, or EGS Spectrum.
@@ -3371,21 +3969,17 @@
   If you have a PCI-based system, this enables support for these
   chips: GD-543x, GD-544x, GD-5480.
 
-  Please read the file Documentation/fb/clgenfb.txt.
+  Please read the file <file:Documentation/fb/clgenfb.txt>.
 
   Say N unless you have such a graphics board or plan to get one
   before you next recompile the kernel.
 
-Permedia2 support (EXPERIMENTAL)
-CONFIG_FB_PM2
-  Say Y here if this is your graphics board.
-
 Apollo support
 CONFIG_APOLLO
   Say Y here if you want to run Linux on an MC680x0-based Apollo
   Domain workstation such as the DN3500.
 
-Apollo 3c505 support
+Apollo 3c505 "EtherLink Plus" support
 CONFIG_APOLLO_ELPLUS
   Say Y or M here if your Apollo has a 3Com 3c505 ISA Ethernet card.
   If you don't have one made for Apollos, you can use one from a PC,
@@ -3397,16 +3991,21 @@
   This is the frame buffer device driver for the builtin graphics
   chipset found in Ataris.
 
-Open Firmware frame buffer device support 
+Amiga FrameMaster II/Rainbow II support
+CONFIG_FB_FM2
+  This is the frame buffer device driver for the Amiga FrameMaster
+  card from BSC (exhibited 1992 but not shipped as a CBM product).
+
+Open Firmware frame buffer device support
 CONFIG_FB_OF
   Say Y if you want support with Open Firmware for your graphics
   board.
 
-S3 Trio frame buffer device support 
+S3 Trio frame buffer device support
 CONFIG_FB_S3TRIO
-  If you have a S3 Trio say Y. Say N for S3 Virge. 
+  If you have a S3 Trio say Y. Say N for S3 Virge.
 
-3Dfx Banshee/Voodoo3 display support (EXPERIMENTAL)
+3Dfx Banshee/Voodoo3 display support
 CONFIG_FB_3DFX
   This driver supports graphics boards with the 3Dfx Banshee/Voodoo3
   chips. Say Y if you have such a graphics board.
@@ -3414,9 +4013,9 @@
   The driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want). The
   module will be called tdfxfb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-nVidia Riva support (EXPERIMENTAL)
+nVidia Riva support
 CONFIG_FB_RIVA
   This driver supports graphics boards with the nVidia Riva/Geforce
   chips.
@@ -3425,9 +4024,9 @@
   The driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want). The
   module will be called rivafb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-ATI Mach64 display support (EXPERIMENTAL)
+ATI Mach64 display support
 CONFIG_FB_ATY
   This driver supports graphics boards with the ATI Mach64 chips.
   Say Y if you have such a graphics board.
@@ -3435,30 +4034,54 @@
   The driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want). The
   module will be called atyfb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
-  
-ATI Mach64 GX display support (EXPERIMENTAL)
-CONFIG_FB_ATY_GX
-  This options adds support for the first generation ATI Mach64
-  graphics chips, i.e. the Mach64 GX and CX. Note that this support is
-  limited.
-
-ATI Mach64 CT/VT/GT/LT display support (EXPERIMENTAL)
-CONFIG_FB_ATY_CT
-  This option adss support for ATI Mach64 graphics chips starting
-  with the Mach64 CT family. This includes the Mach64 VT (limited
-  support), GT (3D RAGE family), and LT.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-ATI Rage128 display support (EXPERIMENTAL)
+ATI Rage128 display support
 CONFIG_FB_ATY128
   This driver supports graphics boards with the ATI Rage128 chips.
   Say Y if you have such a graphics board and read
-  Documentation/fb/aty128fb.txt. 
+  <file:Documentation/fb/aty128fb.txt>.
 
   The driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want). The
   module will be called aty128fb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
+
+# AC tree only
+Maxine (Personal DECstation) onboard framebuffer support
+CONFIG_FB_MAXINE
+  Say Y here to directly support the on-board framebuffer in the
+  Maxine (5000/20, /25, /33) version of the DECstation.  There is a
+  page dedicated to Linux on DECstations at <http://decstation.unix-ag.org/>.
+
+# AC tree only
+PMAG-BA TURBOchannel framebuffer support
+CONFIG_FB_PMAG_BA
+  Say Y here to directly support the on-board PMAG-BA framebuffer in
+  the 5000/1xx versions of the DECstation.  There is a page dedicated
+  to Linux on DECstations at <http://decstation.unix-ag.org/>.
+
+# AC tree only
+PMAGB-B TURBOchannel framebuffer support
+CONFIG_FB_PMAGB_B
+  Say Y here to directly support the on-board PMAGB-B framebuffer in
+  the 5000/1xx versions of the DECstation.  There is a page dedicated
+  to Linux on DECstations at <http://decstation.unix-ag.org/>.
+
+FutureTV PCI card
+CONFIG_ARCH_FTVPCI
+  Say Y here if you intend to run this kernel on a FutureTV (nee Nexus
+  Electronics) StrongARM PCI card.
+
+P720T
+CONFIG_ARCH_P720T
+  Say Y here if you intend to run this kernel on the ARM Prospector
+  720T.
+
+Link-Up Systems LCD support
+CONFIG_FB_L7200
+  This driver supports the L7200 Color LCD.
+  Say Y if you want graphics support.
 
 PowerMac "control" frame buffer device support
 CONFIG_FB_CONTROL
@@ -3490,13 +4113,13 @@
   This is the frame buffer device driver for generic VESA 2.0
   compliant graphic cards. The older VESA 1.2 cards are not supported.
   You will get a boot time penguin logo at no additional cost. Please
-  read Documentation/fb/vesafb.txt. If unsure, say Y.
+  read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
 
 VGA 16-color planar support
 CONFIG_FBCON_VGA_PLANES
   This low level frame buffer console driver enable the kernel to use
   the 16-color planar modes of the old VGA cards where the bits of
-  each pixel are separated into 4 planes. 
+  each pixel are separated into 4 planes.
 
   Only answer Y here if you have a (very old) VGA card that isn't VESA
   2 compatible.
@@ -3509,7 +4132,29 @@
   This code is also available as a module. If you want to compile it
   as a module ( = code which can be inserted in and removed from the
   running kernel whenever you want), say M here and read
-  Documentation/modules.txt. The module will be called vga16fb.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  vga16fb.o.
+
+Generic STI frame buffer device support
+CONFIG_FB_STI
+  STI refers to the HP "Standard Text Interface" which is a set of
+  BIOS routines contained in a ROM chip in HP PA-RISC based machines.
+  Enabling this option will implement the linux framebuffer device and
+  an fbcon color text console using calls to the STI BIOS routines.
+  The HP framebuffer device is usually planar, uses a strange memory
+  layout, and changing the plane mask to create colored pixels
+  requires a call to the STI routines, so do not expect /dev/fb to
+  actually be useful.  However, it is the best we have as far as
+  graphics on the HP chipsets due to lack of hardware level
+  documentation for the various on-board HP chipsets used in these
+  systems.  It is sufficient for basic text console functions,
+  including fonts.
+
+  You should probably enable this option, unless you are having
+  trouble getting video when booting the kernel (make sure it isn't
+  just that you are running the console on the serial port, though).
+  Really old HP boxes may not have STI, and must use the PDC BIOS
+  console or the IODC BIOS.
 
 Select other compiled-in fonts
 CONFIG_FBCON_FONTS
@@ -3517,7 +4162,7 @@
   your frame buffer console usually use.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about foreign fonts.
 
   If unsure, say N (the default choices are safe).
@@ -3549,14 +4194,29 @@
 VGA 8x8 font
 CONFIG_FONT_8x8
   This is the "high resolution" font for the VGA frame buffer (the one
-  provided by the text console 80x50 (and higher) modes). 
+  provided by the text console 80x50 (and higher) modes).
 
   Note that this is a poor quality font. The VGA 8x16 font is quite a
-  lot more readable. 
+  lot more readable.
 
   Given the resolution provided by the frame buffer device, answer N
   here is safe.
 
+Mac console 6x11 font (not supported by all drivers)
+CONFIG_FONT_6x11
+  Small console font with Macintosh-style high-half glyphs.  Some Mac
+  framebuffer drivers don't support this one at all.
+
+Pearl (old m68k) console 8x8 font
+CONFIG_FONT_PEARL_8x8
+  Small console font with PC-style control-character and high-half
+  glyphs.
+
+Acorn console 8x8 font
+CONFIG_FONT_ACORN_8x8
+  Small console font with PC-style control characters and high-half
+  glyphs.
+
 Backward compatibility mode for Xpmac
 CONFIG_FB_COMPAT_XPMAC
   If you use the Xpmac X server (common with mklinux), you'll need to
@@ -3564,35 +4224,61 @@
   includes a server that supports the frame buffer device directly
   (XF68_FBDev).
 
-HGA monochrome support (EXPERIMENTAL)
+Hercules (HGA) mono graphics support
 CONFIG_FB_HGA
   Say Y here if you have a Hercules mono graphics card.
 
   This driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want).
   The module will be called hgafb.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
   As this card technology is 15 years old, most people will answer N
   here.
 
+Epson 1355 framebuffer support
+CONFIG_FB_E1355
+  Build in support for the SED1355 Epson Research Embedded RAMDAC
+  LCD/CRT Controller (since redesignated as the S1D13505) as a
+  framebuffer.  Product specs at
+  <http://www.erd.epson.com/vdc/html/products.htm>.
+
+Dreamcast Frame Buffer support
+CONFIG_FB_DC
+  Say Y here to enable support for the framebuffer on the Sega
+  Dreamcast.  This driver is also available as a module, dcfb.o.
+
+Register Base Address
+CONFIG_E1355_REG_BASE
+  Epson SED1355/S1D13505 LCD/CRT controller register base address.
+  See the manuals at
+  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+  discussion.
+
+Framebuffer Base Address
+CONFIG_E1355_FB_BASE
+  Epson SED1355/S1D13505 LCD/CRT controller memory base address.  See
+  the manuals at
+  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+  discussion.
+
 NEC PowerVR 2 display support
 CONFIG_FB_PVR2
-  Say Y here if you have a PowerVR 2 card in your box. If you plan to
-  run linux on your Dreamcast, you will have to say Y here. This driver
-  may or may not work on other PowerVR 2 cards, but is totally untested.
-  Use at your own risk. If unsure, say N.
+  Say Y here if you have a PowerVR 2 card in your box.  If you plan to
+  run linux on your Dreamcast, you will have to say Y here.
+  This driver may or may not work on other PowerVR 2 cards, but is
+  totally untested.  Use at your own risk.  If unsure, say N.
 
   This driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want).
-  The module will be called pvr2fb.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  The module will be called pvr2fb.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
   You can pass several parameters to the driver at boot time or at
-  module load time. The parameters look like "video=pvr2:XXX", where
+  module load time.  The parameters look like "video=pvr2:XXX", where
   the meaning of XXX can be found at the end of the main source file
-  (drivers/video/pvr2fb.c). Please see the file
-  Documentation/fb/pvr2fb.txt.
+  (<file:drivers/video/pvr2fb.c>). Please see the file
+  <file:Documentation/fb/pvr2fb.txt>.
 
 Debug pvr2fb
 CONFIG_FB_PVR2_DEBUG
@@ -3600,26 +4286,26 @@
   messages. Most people will want to say N here. If unsure, you will
   also want to say N.
 
-Matrox unified accelerated driver (EXPERIMENTAL)
+Matrox unified accelerated driver
 CONFIG_FB_MATROX
   Say Y here if you have a Matrox Millennium, Matrox Millennium II,
   Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox
   Mystique G200, Matrox Millennium G200, Matrox Marvel G200 video,
-  Matrox G400 or G450 card in your box. At this time, support for the G100
-  is untested and support for G450 is highly experimental.
+  Matrox G400 or G450 card in your box. At this time, support for the
+  G100 is untested and support for G450 is highly experimental.
 
   This driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want).
   The module will be called matroxfb.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
   You can pass several parameters to the driver at boot time or at
   module load time. The parameters look like "video=matrox:XXX", where
   the meaning of XXX can be found at the end of the main source file
-  (drivers/video/matroxfb.c). Please see the file
-  Documentation/fb/matroxfb.txt. 
+  (<file:drivers/video/matroxfb.c>). Please see
+  <file:Documentation/fb/matroxfb.txt>.
 
-Matrox Millennium support
+Matrox Millennium I/II support
 CONFIG_FB_MATROX_MILLENIUM
   Say Y here if you have a Matrox Millennium or Matrox Millennium II
   video card. If you select "Advanced lowlevel driver options" below,
@@ -3638,9 +4324,9 @@
 Matrox G100/G200/G400/G450 support
 CONFIG_FB_MATROX_G100
   Say Y here if you have a Matrox G100, G200, G400 or G450 based
-  video card. If you select "Advanced lowlevel driver options", you 
-  should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed 
-  pixel and 32 bpp packed pixel. You can also use font widths 
+  video card. If you select "Advanced lowlevel driver options", you
+  should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed
+  pixel and 32 bpp packed pixel. You can also use font widths
   different from 8.
 
   If you need support for G400 secondary head, you must first say Y to
@@ -3654,14 +4340,14 @@
   DDC (I2C) bus present on all Matroxes, an I2C bus which
   interconnects Matrox optional devices, like MGA-TVO on G200 and
   G400, and the secondary head DDC bus, present on G400 only.
-  
-  You can say Y or M here if you want to experiment with monitor 
+
+  You can say Y or M here if you want to experiment with monitor
   detection code. You must say Y or M here if you want to use either
   second head of G400 or MGA-TVO on G200 or G400.
-  
+
   If you compile it as module, it will create a module named
   i2c-matroxfb.o.
-  
+
 Matrox G400 second head support
 CONFIG_FB_MATROX_MAVEN
   WARNING !!! This support does not work with G450 !!!
@@ -3672,26 +4358,24 @@
   secondary head output is blanked while you are in X. With XFree
   3.9.17 preview you can use both heads if you use SVGA over fbdev or
   the fbdev driver on first head and the fbdev driver on second head.
-  
+
   If you compile it as module, two modules are created,
   matroxfb_crtc2.o and matroxfb_maven.o. Matroxfb_maven is needed for
   both G200 and G400, matroxfb_crtc2 is needed only by G400. You must
   also load i2c-matroxfb to get it to run.
-  
+
   The driver starts in monitor mode and you must use the matroxset
-  tool (available at ftp://platan.vc.cvut.cz/pub/linux/matrox-latest)
-  to switch it to PAL or NTSC or to swap primary and secondary head
-  outputs. Secondary head driver also always start in 640x480
-  resolution, you must use fbset to change it.
-  
+  tool (available at
+  <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest>) to switch it to
+  PAL or NTSC or to swap primary and secondary head outputs.
+  Secondary head driver also always start in 640x480 resolution, you
+  must use fbset to change it.
+
   Also do not forget that second head supports only 16 and 32 bpp
   packed pixels, so it is a good idea to compile them into the kernel
-  too. You can use only some font widths, as the driver uses generic
+  too.  You can use only some font widths, as the driver uses generic
   painting procedures (the secondary head does not use acceleration
   engine).
-  
-  There is no need for enabling 'Matrox multihead support' if you have
-  only one Matrox card in the box.
 
 Matrox G450 second head support
 CONFIG_FB_MATROX_G450
@@ -3703,10 +4387,10 @@
   want two independent display devices.
 
   The driver starts in monitor mode and currently does not support
-  output in TV modes. You must use the matroxset tool (available
-  at ftp://platan.vc.cvut.cz/pub/linux/matrox-latest) to swap primary
-  and secondary head outputs. Secondary head driver always start in
-  640x480 resolution and you must use fbset to change it.
+  output in TV modes.  You must use the matroxset tool (available
+  at <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest>) to swap
+  primary and secondary head outputs.  Secondary head driver always
+  start in 640x480 resolution and you must use fbset to change it.
 
   Also do not forget that second head supports only 16 and 32 bpp
   packed pixels, so it is a good idea to compile them into the kernel
@@ -3714,9 +4398,6 @@
   painting procedures (the secondary head does not use acceleration
   engine).
 
-  There is no need for enabling 'Matrox multihead support' if you have
-  only one Matrox card in the box.
-
 Matrox unified driver multihead support
 CONFIG_FB_MATROX_MULTIHEAD
   Say Y here if you have more than one (supported) Matrox device in
@@ -3732,6 +4413,24 @@
   for the different Matrox devices. This method is slightly faster but
   uses 40 KB of kernel memory per Matrox card.
 
+  There is no need for enabling 'Matrox multihead support' if you have
+  only one Matrox card in the box.
+
+3Dfx Voodoo Graphics / Voodoo2 frame buffer support
+CONFIG_FB_VOODOO1
+  Say Y here if you have a 3Dfx Voodoo Graphics (Voodoo1/sst1) or 
+  Voodoo2 (cvg) based graphics card.
+
+  This driver is also available as a module ( = code which can be 
+  inserted and removed from the running kernel whenever you want).
+  The module will be called sstfb.o. If you want to compile it as
+  a module, say M here and read Documentation/modules.txt.
+
+  WARNING: Do not use any application that uses the 3D engine
+  (namely glide) while using this driver.
+  Please read the file Documentation/fb/README-sstfb.txt for supported
+  options and other important info  support.
+
 MDA text console (dual-headed)
 CONFIG_MDA_CONSOLE
   Say Y here if you have an old MDA or monochrome Hercules graphics
@@ -3739,15 +4438,15 @@
   will then be able to use two monitors with your Linux system. Do not
   say Y here if your MDA card is the primary card in your system; the
   normal VGA driver will handle it.
-  
+
   This driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want).
   The module will be called mdacon.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
-  
+  a module, say M here and read <file:Documentation/modules.txt>.
+
   If unsure, say N.
 
-SBUS and UPA frame buffers
+SBUS and UPA framebuffers
 CONFIG_FB_SBUS
   Say Y if you want support for SBUS or UPA based frame buffer device.
 
@@ -3769,11 +4468,59 @@
 CONFIG_FB_CGTHREE
   This is the frame buffer device driver for the CGthree frame buffer.
 
+CGfourteen (SX) support
+CONFIG_FB_CGFOURTEEN
+  This is the frame buffer device driver for the CGfourteen frame
+  buffer on Desktop SPARCsystems with the SX graphics option.
+
+P9100 (Sparcbook 3 only) support
+CONFIG_FB_P9100
+  This is the frame buffer device driver for the P9100 card
+  supported on Sparcbook 3 machines.
+
+Leo (ZX) support
+CONFIG_FB_LEO
+  This is the frame buffer device driver for the SBUS-based Sun ZX
+  (leo) frame buffer cards.
+
+IGA 168x display support
+CONFIG_FB_IGA
+  This is the framebuffer device for the INTERGRAPHICS 1680 and
+  successor frame buffer cards.
+
 TCX (SS4/SS5 only) support
 CONFIG_FB_TCX
   This is the frame buffer device driver for the TCX 24/8bit frame
   buffer.
 
+HD64461 Frame Buffer support
+CONFIG_FB_HIT
+  This is the frame buffer device driver for the Hitachi HD64461 LCD
+  frame buffer card.
+
+SIS 630/540 display support
+CONFIG_FB_SIS
+  This is the frame buffer device driver for the SiS 630 and 640 Super
+  Socket 7 UMA cards.  Specs available at <http://www.sis.com.tw/>.
+
+# AC tree only
+SIS 630/540/730 support
+CONFIG_FB_SIS_300
+  This is the frame buffer device driver for the SiS 630 and related
+  Super Socket 7 UMA cards.  Specs available at
+  <http://www.sis.com.tw/>.
+
+# AC tree only
+SIS 315H/315 support
+CONFIG_FB_SIS_315
+  This is the frame buffer device driver for the SiS 315 graphics
+  card.  Specs available at <http://www.sis.com.tw/>.
+
+IMS Twin Turbo display support
+CONFIG_FB_IMSTT
+  The IMS Twin Turbo is a PCI-based frame buffer card bundled with
+  many Macintosh and compatible computers.
+
 Virtual Frame Buffer support (ONLY FOR TESTING!)
 CONFIG_FB_VIRTUAL
   This is a `virtual' frame buffer device. It operates on a chunk of
@@ -3788,13 +4535,48 @@
   This driver is also available as a module ( = code which can be
   inserted and removed from the running kernel whenever you want). The
   module will be called vfb.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt.
- 
+  say M here and read <file:Documentation/modules.txt>.
+
   If unsure, say N.
 
+Mach64 CT/VT/GT/LT (incl. 3D RAGE) support
+CONFIG_FB_ATY_CT
+  Say Y here to support use of ATI's 64-bit Rage boards (or other
+  boards based on the Mach64 CT, VT, GT, and LT chipsets) as a
+  framebuffer device.  The ATI product support page for these boards
+  is at <http://support.ati.com/products/pc/mach64/>.
+
+Sony Vaio Picturebook laptop LCD panel support
+CONFIG_FB_ATY_CT_VAIO_LCD
+  Say Y here if you want to use the full width of the Sony Vaio 
+  Picturebook laptops LCD panels (you will get a 128x30 console).
+
+  Note that you need to activate this mode using the 'vga=0x301'
+  option from your boot loader (lilo or loadlin).  See the
+  documentation of your boot loader about how to pass options to the
+  kernel.
+  
+Mach64 GX support
+CONFIG_FB_ATY_GX
+  Say Y here to support use of the ATI Mach64 Graphics Expression
+  board (or other boards based on the Mach64 GX chipset) as a
+  framebuffer device.  The ATI product support page for these boards
+  is at
+  <http://support.ati.com/products/pc/mach64/graphics_xpression.html>.
+
+# AC tree only
+ATI Radeon display support
+CONFIG_FB_RADEON
+  Choose this option if you want to use an ATI Radeon graphics card as
+  a framebuffer device.  There are both PCI and AGP versions.  You
+  don't need to choose this to run the Radeon in plain VGA mode.
+  There is a product page at
+  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
+
+SA-1100 LCD support
 CONFIG_FB_SA1100
   This is a framebuffer device for the SA-1100 LCD Controller.
-  See http://www.linux-fbdev.org/ for information on framebuffer
+  See <http://www.linux-fbdev.org/> for information on framebuffer
   devices.
 
   If you plan to use the LCD display with your SA-1100 system, say
@@ -3819,8 +4601,8 @@
   Low level frame buffer console drivers can be modules ( = code which
   can be inserted and removed from the running kernel whenever you
   want). The modules will be called fbcon-*.o. If you want to compile
-  (some of) them as modules, read Documentation/modules.txt.
-  
+  (some of) them as modules, read <file:Documentation/modules.txt>.
+
   If unsure, say N.
 
 Monochrome support
@@ -3890,10 +4672,10 @@
   This is the low level frame buffer console driver for 1/2/4/8/16/32
   bits per pixel packed pixels on Mac. It supports variable font
   widths for low resolution screens.
-  
-HGA monochrome support (EXPERIMENTAL)
+
+HGA monochrome support
 CONFIG_FBCON_HGA
-  This is the low level frame buffer console driver for Hercules mono 
+  This is the low level frame buffer console driver for Hercules mono
   graphics cards.
 
 VGA characters/attributes support
@@ -3909,21 +4691,21 @@
   drive, PLIP link (Parallel Line Internet Protocol is mainly used to
   create a mini network by connecting the parallel ports of two local
   machines) etc., then you need to say Y here; please read
-  Documentation/parport.txt and drivers/parport/BUGS-parport.
+  <file:Documentation/parport.txt> and drivers/parport/BUGS-parport.
 
   For extensive information about drivers for many devices attaching
-  to the parallel port see http://www.torque.net/linux-pp.html on the
-  WWW.
+  to the parallel port see <http://www.torque.net/linux-pp.html> on
+  the WWW.
 
   It is possible to share a single parallel port among several devices
   and it is safe to compile all the corresponding drivers into the
-  kernel. If you want to compile parallel port support as a module ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
-  The module will be called parport.o. If you have more than one
-  parallel port and want to specify which port and IRQ to be used by
-  this driver at module load time, take a look at
-  Documentation/parport.txt.
+  kernel.  If you want to compile parallel port support as a module
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  parport.o.  If you have more than one parallel port and want to
+  specify which port and IRQ to be used by this driver at module load
+  time, take a look at <file:Documentation/parport.txt>.
 
   If unsure, say Y.
 
@@ -3931,20 +4713,21 @@
 CONFIG_PARPORT_PC
   You should say Y here if you have a PC-style parallel port. All IBM
   PC compatible computers and some Alphas have PC-style parallel
-  ports. 
+  ports.
 
-  This code is also available as a module. If you want to compile it
+  This code is also available as a module.  If you want to compile it
   as a module ( = code which can be inserted in and removed from the
   running kernel whenever you want), say M here and read
-  Documentation/modules.txt. The module will be called parport_pc.o.
-  
+  <file:Documentation/modules.txt>.  The module will be called
+  parport_pc.o.
+
   If unsure, say Y.
 
 Parallel+serial PCI card support
 CONFIG_PARPORT_SERIAL
-  This adds support for multi-IO PCI cards that have parallel and serial
-  ports.  You should say Y or M here.  If you say M, the module will be
-  called parport_serial.o.
+  This adds support for multi-IO PCI cards that have parallel and
+  serial ports.  You should say Y or M here.  If you say M, the module
+  will be called parport_serial.o.
 
 Use FIFO/DMA if available
 CONFIG_PARPORT_PC_FIFO
@@ -3952,12 +4735,12 @@
   printing. Say Y here if you want to take advantage of that.
 
   As well as actually having a FIFO, or DMA capability, the kernel
-  will need to know which IRQ the parallel port has. By default,
+  will need to know which IRQ the parallel port has.  By default,
   parallel port interrupts will not be used, and so neither will the
-  FIFO. See Documentation/parport.txt to find out how to specify
-  which IRQ/DMA to use.
+  FIFO.  See <file:Documentation/parport.txt> to find out how to
+  specify which IRQ/DMA to use.
 
-SuperIO chipset support (EXPERIMENTAL)
+SuperIO chipset support
 CONFIG_PARPORT_PC_SUPERIO
   Saying Y here enables some probes for Super-IO chipsets in order to
   find out things like base addresses, IRQ lines and DMA channels.  It
@@ -3974,12 +4757,6 @@
   other non-standard types of parallel ports. This causes a
   performance loss, so most people say N.
 
-Sun Ultra/AX-style hardware 
-CONFIG_PARPORT_AX
-  Say Y here if you need support for the parallel port hardware on Sun
-  Ultra/AX machines. This code is also available as a module (say M),
-  called parport_ax.o. If in doubt, saying N is the safe plan.
-
 Amiga built-in parallel port support
 CONFIG_PARPORT_AMIGA
   Say Y here if you need support for the parallel port hardware on
@@ -3992,51 +4769,51 @@
   Atari machines. This code is also available as a module (say M),
   called parport_atari.o. If in doubt, saying N is the safe plan.
 
-Multiface 3 parallel port card support
+Multiface III parallel port support
 CONFIG_PARPORT_MFC3
   Say Y here if you need parallel port support for the MFC3 card.
   This code is also available as a module (say M), called
   parport_mfc3.o. If in doubt, saying N is the safe plan.
 
-Support IEEE1284 status readback
+Support IEEE 1284 status readback
 CONFIG_PRINTER_READBACK
   If you have a device on your parallel port that support this
   protocol, this option will allow the device to report its status. It
   is safe to say Y.
 
-IEEE1284 transfer modes
+IEEE 1284 transfer modes
 CONFIG_PARPORT_1284
   If you have a printer that supports status readback or device ID, or
   want to use a device that uses enhanced parallel port transfer modes
   such as EPP and ECP, say Y here to enable advanced IEEE 1284
   transfer modes. Also say Y if you want device ID information to
   appear in /proc/sys/dev/parport/*/autoprobe*. It is safe to say N.
- 
+
 Enable loadable module support
 CONFIG_MODULES
   Kernel modules are small pieces of compiled code which can be
   inserted in or removed from the running kernel, using the programs
   insmod and rmmod. This is described in the file
-  Documentation/modules.txt, including the fact that you have to say
-  "make modules" in order to compile the modules that you chose during
-  kernel configuration. Modules can be device drivers, file systems,
-  binary executable formats, and so on. If you think that you may want
-  to make use of modules with this kernel in the future, then say Y
-  here. If unsure, say Y.
+  <file:Documentation/modules.txt>, including the fact that you have
+  to say "make modules" in order to compile the modules that you chose
+  during kernel configuration.  Modules can be device drivers, file
+  systems, binary executable formats, and so on. If you think that you
+  may want to make use of modules with this kernel in the future, then
+  say Y here.  If unsure, say Y.
 
 Set version information on all symbols for modules
 CONFIG_MODVERSIONS
   Usually, modules have to be recompiled whenever you switch to a new
-  kernel. Saying Y here makes it possible, and safe, to use the
+  kernel.  Saying Y here makes it possible, and safe, to use the
   same modules even after compiling a new kernel; this requires the
   program modprobe. All the software needed for module support is in
-  the modutils package (check the file Documentation/Changes for
-  location and latest version). NOTE: if you say Y here but don't
+  the modutils package (check the file <file:Documentation/Changes>
+  for location and latest version).  NOTE: if you say Y here but don't
   have the program genksyms (which is also contained in the above
   mentioned modutils package), then the building of your kernel will
-  fail. If you are going to use modules that are generated from
-  non-kernel sources, you would benefit from this option. Otherwise
-  it's not that important. So, N ought to be a safe bet.
+  fail.  If you are going to use modules that are generated from
+  non-kernel sources, you would benefit from this option.  Otherwise
+  it's not that important.  So, N ought to be a safe bet.
 
 Kernel module loader support
 CONFIG_KMOD
@@ -4048,11 +4825,11 @@
   kernel needs a module, it runs modprobe with the appropriate
   arguments, thereby loading the module if it is available. (This is a
   replacement for kerneld.) Say Y here and read about configuring it
-  in Documentation/kmod.txt.
+  in <file:Documentation/kmod.txt>.
 
-ARP daemon support (EXPERIMENTAL)
+ARP daemon support
 CONFIG_ARPD
-  Normally, the kernel maintains an internal cache which maps IP 
+  Normally, the kernel maintains an internal cache which maps IP
   addresses to hardware addresses on the local network, so that
   Ethernet/Token Ring/ etc. frames are sent to the proper address on
   the physical networking layer. For small networks having a few
@@ -4060,7 +4837,7 @@
   resolution (ARP) cache inside the kernel works well. However,
   maintaining an internal ARP cache does not work well for very large
   switched networks, and will use a lot of kernel memory if TCP/IP
-  connections are made to many machines on the network. 
+  connections are made to many machines on the network.
 
   If you say Y here, the kernel's internal ARP cache will never grow
   to more than 256 entries (the oldest entries are expired in a LIFO
@@ -4084,35 +4861,35 @@
 
   For an excellent introduction to Linux networking, please read the
   NET-3-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This option is also necessary if you want to use the full power of
   term (term is a program which gives you almost full Internet
   connectivity if you have a regular dial up shell account on some
   Internet connected Unix computer; for more information, read
-  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html ).
-  
+  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
+
   If you say Y here and also to "/proc file system support" and
   "Sysctl support" below, you can change various aspects of the
   behavior of the TCP/IP code by writing to the (virtual) files in
   /proc/sys/net/ipv4/*; the options are explained in the file
-  Documentation/networking/ip-sysctl.txt.
+  <file:Documentation/networking/ip-sysctl.txt>.
 
   Short answer: say Y.
 
-IP: multicasting
+IP multicasting
 CONFIG_IP_MULTICAST
   This is code for addressing several networked computers at once,
   enlarging your kernel by about 2 KB. You need multicasting if you
   intend to participate in the MBONE, a high bandwidth network on top
   of the Internet which carries audio and video broadcasts. More
   information about the MBONE is on the WWW at
-  http://www-itg.lbl.gov/mbone/ . Information about the multicast
+  <http://www-itg.lbl.gov/mbone/>. Information about the multicast
   capabilities of the various network cards is contained in
-  Documentation/networking/multicast.txt. For most people, it's safe
-  to say N.
+  <file:Documentation/networking/multicast.txt>. For most people, it's
+  safe to say N.
 
-IP: advanced router
+Advanced router
 CONFIG_IP_ADVANCED_ROUTER
   If you intend to run your Linux box mostly as a router, i.e. as a
   computer that forwards and redistributes network packets, say Y; you
@@ -4120,7 +4897,7 @@
   control about the routing process.
 
   The answer to this question won't directly affect the kernel:
-  answering N will just cause this configure script to skip all the
+  answering N will just cause the configurator to skip all the
   questions about advanced routing.
 
   Note that your box can only act as a router if you enable IP
@@ -4130,7 +4907,7 @@
 
     echo "1" > /proc/sys/net/ipv4/ip_forward
 
-  at boot time after the /proc file system has been mounted. 
+  at boot time after the /proc file system has been mounted.
 
   If you turn on IP forwarding, you will also get the rp_filter, which
   automatically rejects incoming packets if the routing table entry
@@ -4148,26 +4925,27 @@
 
   If unsure, say N here.
 
-IP: policy routing
+Policy routing
 CONFIG_IP_MULTIPLE_TABLES
   Normally, a router decides what to do with a received packet based
   solely on the packet's final destination address. If you say Y here,
   the Linux router will also be able to take the packet's source
-  address into account. Furthermore, if you also say Y to "IP: use TOS
+  address into account. Furthermore, if you also say Y to "Use TOS
   value as routing key" below, the TOS (Type-Of-Service) field of the
   packet can be used for routing decisions as well. In addition, if
-  you say Y here and to "IP: fast network address translation" below,
+  you say Y here and to "Fast network address translation" below,
   the router will also be able to modify source and destination
   addresses of forwarded packets.
 
   If you are interested in this, please see the preliminary
-  documentation at http://www.compendium.com.ar/policy-routing.txt and
-  ftp://post.tepkom.ru/pub/vol2/Linux/docs/advanced-routing.tex . You
-  will need supporting software from ftp://ftp.inr.ac.ru/ip-routing/
-  
+  documentation at <http://www.compendium.com.ar/policy-routing.txt>
+  and <ftp://post.tepkom.ru/pub/vol2/Linux/docs/advanced-routing.tex>.
+  You will need supporting software from
+  <ftp://ftp.inr.ac.ru/ip-routing/>.
+
   If unsure, say N.
-  
-IP: equal cost multipath
+
+Equal cost multipath
 CONFIG_IP_ROUTE_MULTIPATH
   Normally, the routing tables specify a single action to be taken in
   a deterministic manner for a given packet. If you say Y here
@@ -4177,20 +4955,20 @@
   equal "cost" and chooses one of them in a non-deterministic fashion
   if a matching packet arrives.
 
-IP: use TOS value as routing key
+Use TOS value as routing key
 CONFIG_IP_ROUTE_TOS
   The header of every IP packet carries a TOS (Type Of Service) value
-  with which the packet requests a certain treatment, e.g. low latency
-  (for interactive traffic), high throughput, or high reliability. If
-  you say Y here, you will be able to specify different routes for
-  packets with different TOS values.
+  with which the packet requests a certain treatment, e.g. low
+  latency (for interactive traffic), high throughput, or high
+  reliability.  If you say Y here, you will be able to specify
+  different routes for packets with different TOS values.
 
-IP: use netfilter MARK value as routing key
+Use netfilter MARK value as routing key
 CONFIG_IP_ROUTE_FWMARK
   If you say Y here, you will be able to specify different routes for
   packets with different mark values (see iptables(8), MARK target).
 
-IP: verbose route monitoring
+Verbose route monitoring
 CONFIG_IP_ROUTE_VERBOSE
   If you say Y here, which is recommended, then the kernel will print
   verbose messages regarding the routing, for example warnings about
@@ -4199,20 +4977,20 @@
   handled by the klogd daemon which is responsible for kernel messages
   ("man klogd").
 
-IP: large routing tables
+Large routing tables
 CONFIG_IP_ROUTE_LARGE_TABLES
   If you have routing zones that grow to more than about 64 entries,
   you may want to say Y here to speed up the routing process.
 
-IP: fast network address translation
+Fast network address translation
 CONFIG_IP_ROUTE_NAT
   If you say Y here, your router will be able to modify source and
   destination addresses of packets that pass through it, in a manner
-  you specify. General information about Network Address Translation
+  you specify.  General information about Network Address Translation
   can be gotten from the document
-  http://www.csn.tu-chemnitz.de/~mha/linux-ip-nat/diplom/nat.html
+  <http://www.csn.tu-chemnitz.de/~mha/linux-ip-nat/diplom/nat.html>.
 
-IP: kernel level autoconfiguration
+Kernel level IP autoconfiguration
 CONFIG_IP_PNP
   This enables automatic configuration of IP addresses of devices and
   of the routing table during kernel boot, based on either information
@@ -4233,7 +5011,22 @@
   does BOOTP itself, providing all necessary information on the kernel
   command line, you can say N here. If unsure, say Y. Note that if you
   want to use BOOTP, a BOOTP server must be operating on your network.
-  Read Documentation/nfsroot.txt for details.
+  Read <file:Documentation/nfsroot.txt> for details.
+
+DHCP support
+CONFIG_IP_PNP_DHCP
+  If you want your Linux box to mount its whole root file system (the
+  one containing the directory /) from some other computer over the
+  net via NFS and you want the IP address of your computer to be
+  discovered automatically at boot time using the DHCP protocol (a
+  special protocol designed for doing this job), say Y here. In case
+  the boot ROM of your network card was designed for booting Linux and
+  does DHCP itself, providing all necessary information on the kernel
+  command line, you can say N here.
+
+  If unsure, say Y. Note that if you want to use DHCP, a DHCP server
+  must be operating on your network.  Read
+  <file:Documentation/nfsroot.txt> for details.
 
 RARP support
 CONFIG_IP_PNP_RARP
@@ -4243,10 +5036,10 @@
   discovered automatically at boot time using the RARP protocol (an
   older protocol which is being obsoleted by BOOTP and DHCP), say Y
   here. Note that if you want to use RARP, a RARP server must be
-  operating on your network. Read Documentation/nfsroot.txt for
+  operating on your network. Read <file:Documentation/nfsroot.txt> for
   details.
 
-IP: tunneling
+IP tunneling
 CONFIG_NET_IPIP
   Tunneling means encapsulating data of one protocol type within
   another protocol and sending it over a channel that understands the
@@ -4256,13 +5049,13 @@
   appear on a different network than it physically is, or to use
   mobile-IP facilities (allowing laptops to seamlessly move between
   networks without changing their IP addresses; check out
-  http://anchor.cs.binghamton.edu/~mobileip/LJ/index.html ). 
+  <http://anchor.cs.binghamton.edu/~mobileip/LJ/index.html>).
 
   Saying Y to this option will produce two modules ( = code which can
   be inserted in and removed from the running kernel whenever you
   want). Most people won't need this and can say N.
 
-IP: GRE tunnels over IP
+GRE tunnels over IP
 CONFIG_NET_IPGRE
   Tunneling means encapsulating data of one protocol type within
   another protocol and sending it over a channel that understands the
@@ -4270,18 +5063,18 @@
   GRE (Generic Routing Encapsulation) and at this time allows
   encapsulating of IPv4 or IPv6 over existing IPv4 infrastructure.
   This driver is useful if the other endpoint is a Cisco router: Cisco
-  likes GRE much better than the other Linux tunneling driver ("IP:
+  likes GRE much better than the other Linux tunneling driver ("IP
   tunneling" above). In addition, GRE allows multicast redistribution
   through the tunnel.
 
-IP: broadcast GRE over IP
+Broadcast GRE over IP
 CONFIG_NET_IPGRE_BROADCAST
   One application of GRE/IP is to construct a broadcast WAN (Wide Area
   Network), which looks like a normal Ethernet LAN (Local Area
   Network), but can be distributed all over the Internet. If you want
-  to do that, say Y here and to "IP: multicast routing" below.
+  to do that, say Y here and to "IP multicast routing" below.
 
-IP: multicast routing
+IP multicast routing
 CONFIG_IP_MROUTE
   This is used if you want your machine to act as a router for IP
   packets that have several destination addresses. It is needed on the
@@ -4289,118 +5082,69 @@
   audio and video broadcasts. In order to do that, you would most
   likely run the program mrouted. Information about the multicast
   capabilities of the various network cards is contained in
-  Documentation/networking/multicast.txt. If you haven't heard about
-  it, you don't need it.
+  <file:Documentation/networking/multicast.txt>. If you haven't heard
+  about it, you don't need it.
 
-IP: PIM-SM version 1 support
+PIM-SM version 1 support
 CONFIG_IP_PIMSM_V1
   Kernel side support for Sparse Mode PIM (Protocol Independent
   Multicast) version 1. This multicast routing protocol is used widely
   because Cisco supports it. You need special software to use it
-  (pimd-v1). Please see http://netweb.usc.edu/pim/ for more
+  (pimd-v1). Please see <http://netweb.usc.edu/pim/> for more
   information about PIM.
 
   Say Y if you want to use PIM-SM v1. Note that you can say N here if
   you just want to use Dense Mode PIM.
 
-IP: PIM-SM version 2 support
+PIM-SM version 2 support
 CONFIG_IP_PIMSM_V2
   Kernel side support for Sparse Mode PIM version 2. In order to use
   this, you need an experimental routing daemon supporting it (pimd or
   gated-5). This routing protocol is not used widely, so say N unless
   you want to play with it.
 
-PC/TCP compatibility mode
-CONFIG_INET_PCTCP
-  If you have been having difficulties telnetting to your Linux
-  machine from a DOS system that uses (broken) PC/TCP networking
-  software (all versions up to OnNet 2.0) over your local Ethernet try
-  saying Y here. Everyone else says N. 
-
-  People having problems with NCSA telnet should see the file
-  Documentation/networking/ncsa-telnet.
-
-Path MTU Discovery (normally enabled)
-CONFIG_PATH_MTU_DISCOVERY
-  MTU (maximal transfer unit) is the size of the chunks we send out
-  over the net. "Path MTU Discovery" means that, instead of always
-  sending very small chunks, we start out sending big ones and if we
-  then discover that some host along the way likes its chunks smaller,
-  we adjust to a smaller size. This is good, so most people say Y
-  here.
-
-  However, some DOS software (versions of DOS NCSA telnet and Trumpet
-  Winsock in PPP mode) is broken and won't be able to connect to your
-  Linux machine correctly in all cases (especially through a terminal
-  server) unless you say N here. See
-  Documentation/networking/ncsa-telnet for the location of fixed NCSA
-  telnet clients. If in doubt, say Y.
-
-Disable NAGLE algorithm (normally enabled)
-CONFIG_TCP_NAGLE_OFF
-  The NAGLE algorithm works by requiring an acknowledgment before
-  sending small IP frames (packets). This keeps tiny telnet and
-  rlogin packets from congesting Wide Area Networks. Most people
-  strongly recommend to say N here, thereby leaving NAGLE
-  enabled. Those programs that would benefit from disabling this
-  facility can do it on a per connection basis themselves.
-
-IP: Allow large windows (not recommended if <16 MB of memory)
-CONFIG_SKB_LARGE
-  On high speed, long distance networks the performance limit on
-  networking becomes the amount of data the sending machine can buffer
-  until the other end confirms its reception. (At 45 Mbit/second there
-  are a lot of bits between New York and London ...). If you say Y
-  here, bigger buffers can be used which allows larger amounts of data
-  to be "in flight" at any given time. It also means a user process
-  can require a lot more memory for network buffers and thus this
-  option is best used only on machines with 16 MB of memory or higher.
-  Unless you are using long links with end to end speeds of over 2
-  Mbit a second or satellite links this option will make no difference
-  to performance.
-
 Unix domain sockets
 CONFIG_UNIX
   If you say Y here, you will include support for Unix domain sockets;
   sockets are the standard Unix mechanism for establishing and
-  accessing network connections. Many commonly used programs such as
+  accessing network connections.  Many commonly used programs such as
   the X Window system and syslog use these sockets even if your
-  machine is not connected to any network. Unless you are working on
+  machine is not connected to any network.  Unless you are working on
   an embedded system or something similar, you therefore definitely
   want to say Y here.
 
   However, the socket support is also available as a module ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt. The module will be called
-  unix.o. If you try building this as a module and you have said Y to
-  "Kernel module loader support" above, be sure to add 'alias net-pf-1
-  unix' to your /etc/modules.conf file. Note that several important
-  services won't work correctly if you say M here and then neglect to
-  load the module.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>. The module will be
+  called unix.o.  If you try building this as a module and you have
+  said Y to "Kernel module loader support" above, be sure to add
+  'alias net-pf-1 unix' to your /etc/modules.conf file. Note that
+  several important services won't work correctly if you say M here
+  and then neglect to load the module.
 
   Say Y unless you know what you are doing.
 
-The IPv6 protocol (EXPERIMENTAL)
+The IPv6 protocol
 CONFIG_IPV6
   This is experimental support for the next version of the Internet
   Protocol: IP version 6 (also called IPng "IP next generation").
   Features of this new protocol include: expanded address space,
   authentication and privacy, and seamless interoperability with the
   current version of IP (IP version 4). For general information about
-  IPv6, see http://playground.sun.com/pub/ipng/html/ipng-main.html ;
+  IPv6, see <http://playground.sun.com/pub/ipng/html/ipng-main.html>;
   for specific information about IPv6 under Linux read the HOWTO at
-  http://www.bieringer.de/linux/IPv6/ and the file net/ipv6/README in
-  the kernel source.
+  <http://www.bieringer.de/linux/IPv6/> and the file net/ipv6/README
+  in the kernel source.
 
   If you want to use IPv6, please upgrade to the newest net-tools as
-  given in Documentation/Changes. You will still be able to do regular
-  IPv4 networking as well.
+  given in <file:Documentation/Changes>. You will still be able to do
+  regular IPv4 networking as well.
 
   This protocol support is also available as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
   want). The module will be called ipv6.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
   It is safe to say N here for now.
 
@@ -4410,8 +5154,8 @@
   through the old netlink interface. However, a better option is to
   say Y to "Kernel/User network link driver" and to "Routing
   messages" instead.
-  
-Kernel httpd acceleration (EXPERIMENTAL)
+
+Kernel httpd acceleration
 CONFIG_KHTTPD
   The kernel httpd acceleration daemon (kHTTPd) is a (limited) web
   server built into the kernel. It is limited since it can only serve
@@ -4430,17 +5174,17 @@
   The kHTTPd is experimental. Be careful when using it on a production
   machine. Also note that kHTTPd doesn't support virtual servers yet.
 
-IPX networking
+The IPX protocol
 CONFIG_IPX
   This is support for the Novell networking protocol, IPX, commonly
-  used for local networks of Windows machines. You need it if you want
-  to access Novell NetWare file or print servers using the Linux
+  used for local networks of Windows machines.  You need it if you
+  want to access Novell NetWare file or print servers using the Linux
   Novell client ncpfs (available from
-  ftp://metalab.unc.edu/pub/Linux/system/filesystems/ ) or from within
-  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto ). In order to do the
-  former, you'll also have to say Y to "NCP file system support",
-  below.
+  <ftp://metalab.unc.edu/pub/Linux/system/filesystems/>) or from
+  within the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>).  In order
+  to do the former, you'll also have to say Y to "NCP file system
+  support", below.
 
   IPX is similar in scope to IP, while SPX, which runs on top of IPX,
   is similar to TCP. There is also experimental support for SPX in
@@ -4448,22 +5192,22 @@
 
   To turn your Linux box into a fully featured NetWare file server and
   IPX router, say Y here and fetch either lwared from
-  ftp://metalab.unc.edu/pub/Linux/system/network/daemons/ or mars_nwe
-  from ftp://ftp.gwdg.de/pub/linux/misc/ncpfs . For more information,
-  read the IPX-HOWTO available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <ftp://metalab.unc.edu/pub/Linux/system/network/daemons/> or
+  mars_nwe from <ftp://ftp.gwdg.de/pub/linux/misc/ncpfs>. For more
+  information, read the IPX-HOWTO available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
 
   The IPX driver would enlarge your kernel by about 16 KB. This driver
   is also available as a module ( = code which can be inserted in and
-  removed from the running kernel whenever you want). The module will
-  be called ipx.o. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. Unless you want to integrate
-  your Linux box with a local Novell network, say N.
+  removed from the running kernel whenever you want).  The module will
+  be called ipx.o.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  Unless you want to
+  integrate your Linux box with a local Novell network, say N.
 
-IPX: Full internal IPX network
+Full internal IPX network
 CONFIG_IPX_INTERN
   Every IPX network has an address that identifies it. Sometimes it is
   useful to give an IPX "network" address to your Linux box as well
@@ -4472,7 +5216,7 @@
   same address). The way this is done is to create a virtual internal
   "network" inside your box and to assign an IPX address to this
   network. Say Y here if you want to do this; read the IPX-HOWTO at
-  http://www.linuxdoc.org/docs.html#howto for details.
+  <http://www.linuxdoc.org/docs.html#howto> for details.
 
   The full internal IPX network enables you to allocate sockets on
   different virtual nodes of the internal network. This is done by
@@ -4485,12 +5229,17 @@
   'special' sockets to sockets listening on the primary network is
   disabled. This might break existing applications, especially RIP/SAP
   daemons. A RIP/SAP daemon that works well with the full internal net
-  can be found on ftp://ftp.gwdg.de/pub/linux/misc/ncpfs . 
+  can be found on <ftp://ftp.gwdg.de/pub/linux/misc/ncpfs>.
 
   If you don't know what you are doing, say N.
 
-IPX: SPX networking (EXPERIMENTAL)
+#(We're told this will come back someday)
+
+SPX networking
 CONFIG_SPX
+  * Orphaned entry retained 20 April 2001 by Petr Vandrovec     *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   The Sequenced Packet eXchange protocol is a transport layer protocol
   built on top of IPX. It is used in Novell NetWare systems for
   client-server applications and is similar to TCP (which runs on top
@@ -4502,26 +5251,26 @@
   space programs lwared or mars_nwe for the server side).
 
   Say Y here if you have use for SPX; read the IPX-HOWTO at
-  http://www.linuxdoc.org/docs.html#howto for details.
+  <http://www.linuxdoc.org/docs.html#howto> for details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called af_spx.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-DECnet networking (EXPERIMENTAL)
+DECnet networking
 CONFIG_DECNET
   The DECnet networking protocol was used in many products made by
-  Digital (now Compaq). It provides reliable stream and sequenced
+  Digital (now Compaq).  It provides reliable stream and sequenced
   packet communications over which run a variety of services similar
   to those which run over TCP/IP.
 
   To find some tools to use with the kernel layer support, please
-  look at Patrick Caulfield's web site: 
-  http://linux.dreamtime.org/decnet/
+  look at Patrick Caulfield's web site:
+  <http://linux.dreamtime.org/decnet/>.
 
-  More detailed documentation is available in the
-  Documentation/networking/decnet.txt file.
+  More detailed documentation is available in
+  <file:Documentation/networking/decnet.txt>.
 
   Be sure to say Y to "/proc file system support" and "Sysctl support"
   below when using DECnet, since you will need sysctl support to aid
@@ -4533,27 +5282,27 @@
 
 DECnet SIOCFIGCONF support
 CONFIG_DECNET_SIOCGIFCONF
-   This option should only be turned on if you are really sure that
-   you know what you are doing. It can break other applications which
-   use this system call and the proper way to get the information
-   provided by this call is to use rtnetlink.
-   
-   If unsure, say N.
+  This option should only be turned on if you are really sure that
+  you know what you are doing. It can break other applications which
+  use this system call and the proper way to get the information
+  provided by this call is to use rtnetlink.
+
+  If unsure, say N.
 
-DECnet Router Support (EXPERIMENTAL)
+DECnet router support
 CONFIG_DECNET_ROUTER
-   Add support for turning your DECnet Endnode into a level 1 or 2
-   router. This is an unfinished option for developers only. If you do
-   say Y here, then make sure that you also say Y to "Kernel/User
-   network link driver", "Routing messages" and "Network packet
-   filtering". The first two are required to allow configuration via
-   rtnetlink (currently you need Alexey Kuznetsov's iproute2 package
-   from ftp://ftp.inr.ac.ru). The "Network packet filtering" option
-   will be required for the forthcoming routing daemon to work.
+  Add support for turning your DECnet Endnode into a level 1 or 2
+  router.  This is an unfinished option for developers only.  If you
+  do say Y here, then make sure that you also say Y to "Kernel/User
+  network link driver", "Routing messages" and "Network packet
+  filtering".  The first two are required to allow configuration via
+  rtnetlink (currently you need Alexey Kuznetsov's iproute2 package
+  from <ftp://ftp.inr.ac.ru>). The "Network packet filtering" option
+  will be required for the forthcoming routing daemon to work.
 
-   See Documentation/networking/decnet.txt for more information.
+  See <file:Documentation/networking/decnet.txt> for more information.
 
-DECnet: use FWMARK value as routing key
+Use FWMARK value as DECnet routing key
 CONFIG_DECNET_ROUTE_FWMARK
   If you say Y here, you will be able to specify different routes for
   packets with different FWMARK ("firewalling mark") values
@@ -4568,28 +5317,29 @@
 AppleTalk protocol support
 CONFIG_ATALK
   AppleTalk is the way Apple computers speak to each other on a
-  network. If your Linux box is connected to such a network and you
-  want to join the conversation, say Y. You will need to use the
+  network.  If your Linux box is connected to such a network and you
+  want to join the conversation, say Y.  You will need to use the
   netatalk package so that your Linux box can act as a print and file
-  server for Macs as well as access AppleTalk printers. Check out
-  http://www.zettabyte.net/netatalk/ on the WWW for details. EtherTalk 
-  is the name used for AppleTalk over Ethernet and the cheaper and 
-  slower LocalTalk is AppleTalk over a proprietary Apple network using
-  serial links. EtherTalk and LocalTalk are fully supported by Linux.
+  server for Macs as well as access AppleTalk printers.  Check out
+  <http://www.zettabyte.net/netatalk/> on the WWW for details.
+  EtherTalk is the name used for AppleTalk over Ethernet and the
+  cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
+  network using serial links.  EtherTalk and LocalTalk are fully
+  supported by Linux.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html . The
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.  The
   NET-3-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , contains valuable
+  <http://www.linuxdoc.org/docs.html#howto>, contains valuable
   information as well.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called appletalk.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.  You almost
-  certainly want to compile it as a module so you can restart your 
-  AppleTalk stack without rebooting your machine.  I hear that the 
-  GNU boycott of Apple is over, so even politically correct people
+  The module is called appletalk.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  You
+  almost certainly want to compile it as a module so you can restart
+  your AppleTalk stack without rebooting your machine.  I hear that
+  the GNU boycott of Apple is over, so even politically correct people
   are allowed to say Y here.
 
 AppleTalk-IP driver support
@@ -4600,7 +5350,7 @@
   box is stuck on an AppleTalk only network) or decapsulate (e.g. if
   you want your Linux box to act as an Internet gateway for a zoo of
   AppleTalk connected Macs). Please see the file
-  Documentation/networking/ipddp.txt for more information.
+  <file:Documentation/networking/ipddp.txt> for more information.
 
   If you say Y here, the AppleTalk-IP support will be compiled into
   the kernel. In this case, you can either use encapsulation or
@@ -4609,11 +5359,11 @@
 
   If you say M here, the AppleTalk-IP support will be compiled as a
   module ( = code which can be inserted in and removed from the
-  running kernel whenever you want, read Documentation/modules.txt).
-  The module is called ipddp.o. In this case, you will be able to use
-  both encapsulation and decapsulation simultaneously, by loading two
-  copies of the module and specifying different values for the module
-  option ipddp_mode. 
+  running kernel whenever you want, read
+  <file:Documentation/modules.txt>).  The module is called ipddp.o.
+  In this case, you will be able to use both encapsulation and
+  decapsulation simultaneously, by loading two copies of the module
+  and specifying different values for the module option ipddp_mode.
 
 IP to AppleTalk-IP Encapsulation support
 CONFIG_IPDDP_ENCAP
@@ -4621,20 +5371,20 @@
   IP packets inside AppleTalk frames; this is useful if your Linux box
   is stuck on an AppleTalk network (which hopefully contains a
   decapsulator somewhere). Please see
-  Documentation/networking/ipddp.txt for more information. If you said
-  Y to "AppleTalk-IP driver support" above and you say Y here, then
-  you cannot say Y to "AppleTalk-IP to IP Decapsulation support",
-  below.
+  <file:Documentation/networking/ipddp.txt> for more information. If
+  you said Y to "AppleTalk-IP driver support" above and you say Y
+  here, then you cannot say Y to "AppleTalk-IP to IP Decapsulation
+  support", below.
 
 AppleTalk-IP to IP Decapsulation support
 CONFIG_IPDDP_DECAP
   If you say Y here, the AppleTalk-IP code will be able to decapsulate
   AppleTalk-IP frames to IP packets; this is useful if you want your
   Linux box to act as an Internet gateway for an AppleTalk network.
-  Please see Documentation/networking/ipddp.txt for more information.
-  If you said Y to "AppleTalk-IP driver support" above and you say Y
-  here, then you cannot say Y to "IP to AppleTalk-IP Encapsulation
-  support", above.
+  Please see <file:Documentation/networking/ipddp.txt> for more
+  information.  If you said Y to "AppleTalk-IP driver support" above
+  and you say Y here, then you cannot say Y to "IP to AppleTalk-IP
+  Encapsulation support", above.
 
 Apple/Farallon LocalTalk PC card support
 CONFIG_LTPC
@@ -4643,7 +5393,7 @@
   If you are in doubt, this card is the one with the 65C02 chip on it.
   You also need version 1.3.3 or later of the netatalk package.
   This driver is experimental, which means that it may not work.
-  See the file Documentation/networking/ltpc.txt.
+  See the file <file:Documentation/networking/ltpc.txt>.
 
 COPS LocalTalk PC card support
 CONFIG_COPS
@@ -4652,7 +5402,7 @@
   package. This driver is experimental, which means that it may not
   work. This driver will only work if you choose "AppleTalk DDP"
   networking support, above.
-  Please read the file Documentation/networking/cops.txt. 
+  Please read the file <file:Documentation/networking/cops.txt>.
 
 Dayna firmware support
 CONFIG_COPS_DAYNA
@@ -4668,15 +5418,15 @@
 Amateur Radio support
 CONFIG_HAMRADIO
   If you want to connect your Linux box to an amateur radio, answer Y
-  here. You want to read http://www.tapr.org/tapr/html/pkthome.html
+  here. You want to read <http://www.tapr.org/tapr/html/pkthome.html>
   and the HAM-HOWTO and the AX25-HOWTO, both available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about amateur radio.
 
-Amateur Radio AX.25 Level 2
+Amateur Radio AX.25 Level 2 protocol
 CONFIG_AX25
   This is the protocol used for computer communication over amateur
   radio. It is either used by itself for point-to-point links, or to
@@ -4694,15 +5444,16 @@
   Information about where to get supporting software for Linux amateur
   radio as well as information about how to configure an AX.25 port is
   contained in the AX25-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . You might also want to
-  check out the file Documentation/networking/ax25.txt in the kernel
-  source. More information about digital amateur radio in general is
-  on the WWW at http://www.tapr.org/tapr/html/pkthome.html .
+  <http://www.linuxdoc.org/docs.html#howto>. You might also want to
+  check out the file <file:Documentation/networking/ax25.txt> in the
+  kernel source. More information about digital amateur radio in
+  general is on the WWW at
+  <http://www.tapr.org/tapr/html/pkthome.html>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called ax25.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 AX.25 DAMA Slave support
 CONFIG_AX25_DAMA_SLAVE
@@ -4722,7 +5473,7 @@
   slaves. If you say Y here, your Linux box will act as a DAMA server.
   If unsure, say N.
 
-Amateur Radio NET/ROM
+Amateur Radio NET/ROM support
 CONFIG_NETROM
   NET/ROM is a network layer protocol on top of AX.25 useful for
   routing.
@@ -4730,15 +5481,15 @@
   A comprehensive listing of all the software for Linux amateur radio
   users as well as information about how to configure an AX.25 port is
   contained in the AX25-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . You also might want to
-  check out the file Documentation/networking/ax25.txt. More
+  <http://www.linuxdoc.org/docs.html#howto>. You also might want to
+  check out the file <file:Documentation/networking/ax25.txt>. More
   information about digital amateur radio in general is on the WWW at
-  http://www.tapr.org/tapr/html/pkthome.html .
+  <http://www.tapr.org/tapr/html/pkthome.html>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called netrom.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Amateur Radio X.25 PLP (Rose)
 CONFIG_ROSE
@@ -4749,15 +5500,15 @@
   A comprehensive listing of all the software for Linux amateur radio
   users as well as information about how to configure an AX.25 port is
   contained in the AX25-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . You also might want to
-  check out the file Documentation/networking/ax25.txt. More
+  <http://www.linuxdoc.org/docs.html#howto>.  You also might want to
+  check out the file <file:Documentation/networking/ax25.txt>. More
   information about digital amateur radio in general is on the WWW at
-  http://www.tapr.org/tapr/html/pkthome.html .
+  <http://www.tapr.org/tapr/html/pkthome.html>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called rose.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Serial port KISS driver for AX.25
 CONFIG_MKISS
@@ -4773,8 +5524,8 @@
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called mkiss.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called mkiss.o.
 
 Serial port 6PACK driver for AX.25
 CONFIG_6PACK
@@ -4787,12 +5538,12 @@
 
   Note that this driver is still experimental and might cause
   problems. For details about the features and the usage of the
-  driver, read Documentation/networking/6pack.txt.
+  driver, read <file:Documentation/networking/6pack.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called 6pack.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called 6pack.o.
 
 BPQ Ethernet driver
 CONFIG_BPQETHER
@@ -4813,7 +5564,7 @@
   Currently, this driver supports Ottawa PI/PI2, Paccomm/Gracilis
   PackeTwin, and S5SCC/DMA boards. They are detected automatically.
   If you have one of these cards, say Y here and read the AX25-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver can operate multiple boards simultaneously. If you
   compile it as a module (by saying M instead of Y), it will be called
@@ -4829,7 +5580,7 @@
   certain parameters, such as channel access timing, clock mode, and
   DMA channel. This is accomplished with a small utility program,
   dmascc_cfg, available at
-  http://www.nt.tuwien.ac.at/~kkudielk/Linux/ . Please be sure to get
+  <http://www.nt.tuwien.ac.at/~kkudielk/Linux/>. Please be sure to get
   at least version 1.27 of dmascc_cfg, as older versions will not
   work with the current driver.
 
@@ -4837,27 +5588,28 @@
 CONFIG_SCC
   These cards are used to connect your Linux box to an amateur radio
   in order to communicate with other computers. If you want to use
-  this, read Documentation/networking/z8530drv.txt and the AX25-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto . Also
-  make sure to say Y to "Amateur Radio AX.25 Level 2" support.
+  this, read <file:Documentation/networking/z8530drv.txt> and the
+  AX25-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>. Also make sure to say Y
+  to "Amateur Radio AX.25 Level 2" support.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called scc.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called scc.o.
+
+Support for TRX that feedback the tx signal to rx
+CONFIG_SCC_TRXECHO
+  Some transmitters feed the transmitted signal back to the receive
+  line.  Say Y here to foil this by explicitly disabling the receiver
+  during data transmission.  If in doubt, say Y.
 
-additional delay for PA0HZP OptoSCC compatible boards
+Additional delay for PA0HZP OptoSCC compatible boards
 CONFIG_SCC_DELAY
   Say Y here if you experience problems with the SCC driver not
-  working properly; please read Documentation/networking/z8530drv.txt
-  for details. If unsure, say N.
-
-#support for TRX that feedback the tx signal to rx
-#CONFIG_SCC_TRXECHO
-###
-### Don't know what's going on here.
-###
-#
+  working properly; please read
+  <file:Documentation/networking/z8530drv.txt> for details. If unsure,
+  say N.
 
 YAM driver for AX.25
 CONFIG_YAM
@@ -4867,7 +5619,7 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt.
+  say M here and read <file:Documentation/modules.txt>.
 
 BAYCOM picpar and par96 driver for AX.25
 CONFIG_BAYCOM_PAR
@@ -4875,13 +5627,13 @@
   connect to a parallel interface. The driver supports the picpar and
   par96 designs. To configure the driver, use the sethdlc utility
   available in the standard ax25 utilities package. For information on
-  the modems, see http://www.baycom.de and the file
-  Documentation/networking/baycom.txt.
+  the modems, see <http://www.baycom.de> and the file
+  <file:Documentation/networking/baycom.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called baycom_par.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_par.o.
 
 BAYCOM EPP driver for AX.25
 CONFIG_BAYCOM_EPP
@@ -4889,48 +5641,49 @@
   connect to a parallel interface. The driver supports the EPP
   designs. To configure the driver, use the sethdlc utility available
   in the standard ax25 utilities package. For information on the
-  modems, see http://www.baycom.de and the file
-  Documentation/networking/baycom.txt.
+  modems, see <http://www.baycom.de> and the file
+  <file:Documentation/networking/baycom.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called baycom_par.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_par.o.
 
-BAYCOM ser12 full duplex driver for AX.25
+BAYCOM ser12 full-duplex driver for AX.25
 CONFIG_BAYCOM_SER_FDX
   This is one of two drivers for Baycom style simple amateur radio
   modems that connect to a serial interface. The driver supports the
-  ser12 design in full duplex mode. In addition, it allows the
+  ser12 design in full-duplex mode. In addition, it allows the
   baudrate to be set between 300 and 4800 baud (however not all modems
   support all baudrates). This is the preferred driver. The next
-  driver, "BAYCOM ser12 half duplex driver for AX.25" is the old
+  driver, "BAYCOM ser12 half-duplex driver for AX.25" is the old
   driver and still provided in case this driver does not work with
   your serial interface chip. To configure the driver, use the sethdlc
   utility available in the standard ax25 utilities package. For
-  information on the modems, see http://www.baycom.de and
-  Documentation/networking/baycom.txt.
+  information on the modems, see <http://www.baycom.de> and
+  <file:Documentation/networking/baycom.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called baycom_ser_fdx.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_ser_fdx.o.
 
-BAYCOM ser12 half duplex driver for AX.25
+BAYCOM ser12 half-duplex driver for AX.25
 CONFIG_BAYCOM_SER_HDX
   This is one of two drivers for Baycom style simple amateur radio
   modems that connect to a serial interface. The driver supports the
-  ser12 design in full duplex mode. This is the old driver. It is
+  ser12 design in full-duplex mode. This is the old driver.  It is
   still provided in case your serial interface chip does not work with
-  the full duplex driver. This driver is depreciated. To configure the
-  driver, use the sethdlc utility available in the standard ax25
+  the full-duplex driver. This driver is depreciated.  To configure
+  the driver, use the sethdlc utility available in the standard ax25
   utilities package. For information on the modems, see
-  http://www.baycom.de and Documentation/networking/baycom.txt.
+  <http://www.baycom.de> and
+  <file:Documentation/networking/baycom.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called baycom_ser_hdx.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_ser_hdx.o.
 
 Sound card modem driver for AX.25
 CONFIG_SOUNDMODEM
@@ -4942,13 +5695,13 @@
   To configure the driver, use the sethdlc, smdiag and smmixer
   utilities available in the standard ax25 utilities package. For
   information on how to key the transmitter, see
-  http://www.ife.ee.ethz.ch/~sailer/pcf/ptt_circ/ptt.html and
-  Documentation/networking/soundmodem.txt.
+  <http://www.ife.ee.ethz.ch/~sailer/pcf/ptt_circ/ptt.html> and
+  <file:Documentation/networking/soundmodem.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called soundmodem.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called soundmodem.o.
 
 Sound card modem support for Sound Blaster and compatible cards
 CONFIG_SOUNDMODEM_SBC
@@ -4957,7 +5710,7 @@
   with a Sound Blaster emulation) you should say N here and Y to
   "Sound card modem support for WSS and Crystal cards", below, because
   this usually results in better performance. This option also
-  supports SB16/32/64 in full duplex mode.
+  supports SB16/32/64 in full-duplex mode.
 
 Sound card modem support for WSS and Crystal cards
 CONFIG_SOUNDMODEM_WSS
@@ -4965,8 +5718,8 @@
   compatible cards. These cards feature a codec chip from either
   Analog Devices (such as AD1848, AD1845, AD1812) or Crystal
   Semiconductors (such as CS4248, CS423x). This option also supports
-  the WSS full duplex operation which currently works with Crystal
-  CS423x chips. If you don't need full duplex operation, do not enable
+  the WSS full-duplex operation which currently works with Crystal
+  CS423x chips. If you don't need full-duplex operation, do not enable
   it to save performance.
 
 Sound card modem support for 1200 baud AFSK modulation
@@ -5026,7 +5779,7 @@
   can only use one protocol at a time, depending on what the other end
   can understand).
 
-CCITT X.25 Packet Layer (EXPERIMENTAL)
+CCITT X.25 Packet Layer
 CONFIG_X25
   X.25 is a set of standardized network protocols, similar in scope to
   frame relay; the one physical line from your box to the X.25 network
@@ -5037,13 +5790,13 @@
   countries have public X.25 networks. X.25 consists of two
   protocols: the higher level Packet Layer Protocol (PLP) (say Y here
   if you want that) and the lower level data link layer protocol LAPB
-  (say Y to "LAPB Data Link Driver" below if you want that). 
+  (say Y to "LAPB Data Link Driver" below if you want that).
 
-  You can read more about X.25 at http://www.sangoma.com/x25.htm and
-  http://www.cisco.com/univercd/data/doc/software/11_0/rpcg/cx25.htm .
+  You can read more about X.25 at <http://www.sangoma.com/x25.htm> and
+  <http://www.cisco.com/univercd/data/doc/software/11_0/rpcg/cx25.htm>.
   Information about X.25 for Linux is contained in the files
-  Documentation/networking/x25.txt and
-  Documentation/networking/x25-iface.txt.
+  <file:Documentation/networking/x25.txt> and
+  <file:Documentation/networking/x25-iface.txt>.
 
   One connects to an X.25 network either with a dedicated network card
   using the X.21 protocol (not yet supported by Linux) or one can do
@@ -5051,14 +5804,14 @@
   to "X.25 async driver" below) or over Ethernet using an ordinary
   Ethernet card and either the 802.2 LLC protocol (say Y to "802.2
   LLC" below) or LAPB over Ethernet (say Y to "LAPB Data Link Driver"
-  and "LAPB over Ethernet driver" below). 
+  and "LAPB over Ethernet driver" below).
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called x25.o. If unsure, say N.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called x25.o. If unsure, say N.
 
-LAPB Data Link Driver (EXPERIMENTAL) 
+LAPB Data Link Driver
 CONFIG_LAPB
   Link Access Procedure, Balanced (LAPB) is the data link layer (i.e.
   the lower) part of the X.25 protocol. It offers a reliable
@@ -5069,41 +5822,42 @@
   currently supports LAPB only over Ethernet connections. If you want
   to use LAPB connections over Ethernet, say Y here and to "LAPB over
   Ethernet driver" below. Read
-  Documentation/networking/lapb-module.txt for technical details.
+  <file:Documentation/networking/lapb-module.txt> for technical
+  details.
 
   If you want to compile this driver as a module though ( = code which
   can be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called lapb.o. If unsure, say N.
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called lapb.o.  If unsure, say N.
 
-802.2 LLC (EXPERIMENTAL)
+802.2 LLC
 CONFIG_LLC
   This is a Logical Link Layer protocol used for X.25 connections over
-  Ethernet, using ordinary Ethernet cards. 
+  Ethernet, using ordinary Ethernet cards.
 
-
-Frame Diverter (EXPERIMENTAL)
+Frame Diverter
 CONFIG_NET_DIVERT
   The Frame Diverter allows you to divert packets from the
-  network, that are not aimed at the interface receiving it (in 
-  promisc. mode). Typically, a Linux box setup as an ethernet bridge
-  with the Frames Diverter on, can do some *really* transparent www 
+  network, that are not aimed at the interface receiving it (in
+  promisc. mode). Typically, a Linux box setup as an Ethernet bridge
+  with the Frames Diverter on, can do some *really* transparent www
   caching using a Squid proxy for example.
 
   This is very useful when you don't want to change your router's
   config (or if you simply don't have access to it).
 
-  The other possible usages of diverting Ethernet Frames are numberous:
+  The other possible usages of diverting Ethernet Frames are
+  numberous:
    - reroute smtp traffic to another interface
    - traffic-shape certain network streams
    - transparently proxy smtp connections
    - etc...
 
   For more informations, please refer to:
-    http://www.freshmeat.net/projects/etherdivert
-    http://perso.wanadoo.fr/magpie/EtherDivert.html
+    <http://www.freshmeat.net/projects/etherdivert>
+    <http://perso.wanadoo.fr/magpie/EtherDivert.html>
 
-  If unsure, say N
+  If unsure, say N.
 
 802.1d Ethernet Bridging
 CONFIG_BRIDGE
@@ -5113,21 +5867,22 @@
   Several such bridges can work together to create even larger
   networks of Ethernets using the IEEE 802.1 spanning tree algorithm.
   As this is a standard, Linux bridges will cooperate properly with
-  other third party bridge products. 
+  other third party bridge products.
+
+  In order to use the Ethernet bridge, you'll need the bridge
+  configuration tools; see <file:Documentation/networking/bridge.txt>
+  for location. Please read the Bridge mini-HOWTO for more
+  information.
 
-  In order to use the ethernet bridge, you'll need the bridge
-  configuration tools; see Documentation/networking/bridge.txt for
-  location. Please read the Bridge mini-HOWTO for more information.
-  
   Note that if your box acts as a bridge, it probably contains several
   Ethernet devices, but the kernel is not able to recognize more than
   one at boot time without help; for details read the Ethernet-HOWTO,
-  available from in http://www.linuxdoc.org/docs.html#howto .
+  available from in <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this code as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called bridge.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bridge.o.
 
   If unsure, say N.
 
@@ -5135,15 +5890,15 @@
 CONFIG_PACKET
   The Packet protocol is used by applications which communicate
   directly with network devices without an intermediate network
-  protocol implemented in the kernel, e.g. tcpdump. If you want them
-  to work, choose Y. 
+  protocol implemented in the kernel, e.g. tcpdump.  If you want them
+  to work, choose Y.
 
   This driver is also available as a module called af_packet.o ( =
   code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt; if you use modprobe or
-  kmod, you may also want to add "alias net-pf-17 af_packet" to 
-  /etc/modules.conf. 
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>; if you use modprobe
+  or kmod, you may also want to add "alias net-pf-17 af_packet" to
+  /etc/modules.conf.
 
   If unsure, say Y.
 
@@ -5157,17 +5912,17 @@
 Kernel/User network link driver
 CONFIG_NETLINK
   This driver allows for two-way communication between the kernel and
-  user processes. It does so by creating a new socket family, PF_NETLINK.
-  Over this socket, the kernel can send and receive datagrams carrying
-  information. It is documented on many systems in netlink(7), a HOWTO is
-  provided as well, for example on
-  http://snafu.freedom.org/linux2.2/docs/netlink-HOWTO.html
+  user processes.  It does so by creating a new socket family,
+  PF_NETLINK.  Over this socket, the kernel can send and receive
+  datagrams carrying information.  It is documented on many systems in
+  netlink(7), a HOWTO is provided as well, for example on
+  <http://snafu.freedom.org/linux2.2/docs/netlink-HOWTO.html>.
 
   So far, the kernel uses this feature to publish some network related
   information if you say Y to "Routing messages", below. You also need
   to say Y here if you want to use arpd, a daemon that helps keep the
   internal ARP cache (a mapping between IP addresses and hardware
-  addresses on the local network) small. The ethertap device, which
+  addresses on the local network) small.  The ethertap device, which
   lets user space programs read and write raw Ethernet frames, also
   needs the network link driver.
 
@@ -5177,7 +5932,7 @@
 CONFIG_RTNETLINK
   If you say Y here, user space programs can receive some network
   related routing information over the netlink. 'rtmon', supplied
-  with the iproute2 package (ftp://ftp.inr.ac.ru), can read and
+  with the iproute2 package (<ftp://ftp.inr.ac.ru>), can read and
   interpret this data.  Information sent to the kernel over this link
   is ignored.
 
@@ -5192,17 +5947,17 @@
 Asynchronous Transfer Mode (ATM)
 CONFIG_ATM
   ATM is a high-speed networking technology for Local Area Networks
-  and Wide Area Networks. It uses a fixed packet size and is
+  and Wide Area Networks.  It uses a fixed packet size and is
   connection oriented, allowing for the negotiation of minimum
   bandwidth requirements.
-  
+
   In order to participate in an ATM network, your Linux box needs an
   ATM networking card. If you have that, say Y here and to the driver
   of your ATM card below.
 
   Note that you need a set of user-space programs to actually make use
-  of ATM. See the file Documentation/networking/atm.txt for further
-  details.
+  of ATM.  See the file <file:Documentation/networking/atm.txt> for
+  further details.
 
 Classical IP over ATM
 CONFIG_ATM_CLIP
@@ -5247,9 +6002,9 @@
   The driver works with MMF (-MF or ...F) and UTP-5 (-U5 or ...D)
   adapters.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called eni.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called eni.o.
 
 Enable extended debugging
 CONFIG_ATM_ENI_DEBUG
@@ -5296,7 +6051,7 @@
   Burst four words at once in the send direction. You may want to try
   this if you have disabled 8W bursts. Enabling 4W if 8W is also set
   may or may not improve throughput.
-  
+
 Enable 2W TX bursts (optional)
 CONFIG_ATM_ENI_BURST_TX_2W
   Burst two words at once in the send direction. You may want to try
@@ -5331,9 +6086,9 @@
   Driver for the ZeitNet ZN1221 (MMF) and ZN1225 (UTP-5) 155 Mbps ATM
   adapters.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called zatm.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called zatm.o.
 
 Enable extended debugging
 CONFIG_ATM_ZATM_DEBUG
@@ -5345,12 +6100,13 @@
 
 Fujitsu FireStream (FS50/FS155)
 CONFIG_ATM_FIRESTREAM
-  Driver for the Fujitsu FireStream 155 (MB86697) and 
+  Driver for the Fujitsu FireStream 155 (MB86697) and
   FireStream 50 (MB86695) ATM PCI chips.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called firestream.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  firestream.o.
 
 Enable usec resolution timestamps
 CONFIG_ATM_ZATM_EXACT_TS
@@ -5368,21 +6124,22 @@
   25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE
   series. Say Y if you have one of those.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called nicstar.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  nicstar.o.
 
-ForeRunner LE155 PHYsical layer
+Use suni PHY driver (155Mbps)
 CONFIG_ATM_NICSTAR_USE_SUNI
   Support for the S-UNI and compatible PHYsical layer chips. These are
   found in most 155Mbps NICStAR based ATM cards, namely in the
-  ForeRunner LE155 cards. This driver provides detection of cable
+  ForeRunner LE155 cards. This driver provides detection of cable~
   removal and reinsertion and provides some statistics. This driver
   doesn't have removal capability when compiled as a module, so if you
   need that capability don't include S-UNI support (it's not needed to
   make the card work).
 
-ForeRunner LE25 PHYsical layer
+Use IDT77015 PHY driver (25Mbps)
 CONFIG_ATM_NICSTAR_USE_IDT77105
   Support for the PHYsical layer chip in ForeRunner LE25 cards. In
   addition to cable removal/reinsertion detection, this driver allows
@@ -5390,6 +6147,31 @@
   This driver is required for proper handling of temporary carrier
   loss, so if you have a 25Mbps NICStAR based ATM card you must say Y.
 
+IDT 77252 (NICStAR II)
+CONFIG_ATM_IDT77252
+  Driver for the IDT 77252 ATM PCI chips.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called idt77252.o
+
+Enable debugging messages
+CONFIG_ATM_IDT77252_DEBUG
+  Somewhat useful debugging messages are available. The choice of
+  messages is controlled by a bitmap.  This may be specified as a
+  module argument.  See the file <file:drivers/atm/idt77252.h> for
+  the meanings of the bits in the mask.
+
+  When active, these messages can have a significant impact on the
+  speed of the driver, and the size of your syslog files! When
+  inactive, they will have only a modest impact on performance.
+
+Receive ALL cells in raw queue
+CONFIG_ATM_IDT77252_RCV_ALL
+  Enable receiving of all cells on the ATM link, that do not match
+  an open connection in the raw cell queue of the driver.  Useful
+  for debugging or special applications only, so the safe answer is N.
+
 Madge Ambassador (Collage PCI 155 Server)
 CONFIG_ATM_AMBASSADOR
   This is a driver for ATMizer based ATM card produced by Madge
@@ -5399,11 +6181,12 @@
 Enable debugging messages
 CONFIG_ATM_AMBASSADOR_DEBUG
   Somewhat useful debugging messages are available. The choice of
-  messages is controlled by a bitmap. This may be specified as a
+  messages is controlled by a bitmap.  This may be specified as a
   module argument (kernel command line argument as well?), changed
   dynamically using an ioctl (not yet) or changed by sending the
-  string "Dxxxx" to VCI 1023 (where x is a hex digit). See the file
-  drivers/atm/ambassador.h for the meanings of the bits in the mask.
+  string "Dxxxx" to VCI 1023 (where x is a hex digit).  See the file
+  <file:drivers/atm/ambassador.h> for the meanings of the bits in the
+  mask.
 
   When active, these messages can have a significant impact on the
   speed of the driver, and the size of your syslog files! When
@@ -5418,28 +6201,29 @@
 Enable debugging messages
 CONFIG_ATM_HORIZON_DEBUG
   Somewhat useful debugging messages are available. The choice of
-  messages is controlled by a bitmap. This may be specified as a
+  messages is controlled by a bitmap.  This may be specified as a
   module argument (kernel command line argument as well?), changed
   dynamically using an ioctl (not yet) or changed by sending the
-  string "Dxxxx" to VCI 1023 (where x is a hex digit). See the file
-  drivers/atm/horizon.h for the meanings of the bits in the mask.
+  string "Dxxxx" to VCI 1023 (where x is a hex digit).  See the file
+  <file:drivers/atm/horizon.h> for the meanings of the bits in the
+  mask.
 
   When active, these messages can have a significant impact on the
   speed of the driver, and the size of your syslog files! When
   inactive, they will have only a modest impact on performance.
 
-Interphase ATM PCI x575/x525/x531 
+Interphase ATM PCI x575/x525/x531
 CONFIG_ATM_IA
   This is a driver for the Interphase (i)ChipSAR adapter cards
-  which include a variety of variants in term of the size of the 
-  control memory (128K-1KVC, 512K-4KVC), the size of the packet 
-  memory (128K, 512K, 1M), and the PHY type (Single/Multi mode OC3, 
+  which include a variety of variants in term of the size of the
+  control memory (128K-1KVC, 512K-4KVC), the size of the packet
+  memory (128K, 512K, 1M), and the PHY type (Single/Multi mode OC3,
   UTP155, UTP25, DS3 and E3). Go to:
   	www.iphase.com/products/ClassSheet.cfm?ClassID=ATM
-  for more info about the cards. Say Y (or M to compile as a module 
+  for more info about the cards. Say Y (or M to compile as a module
   named iphase.o) here if you have one of these cards.
 
-  See the file Documentation/networking/iphase.txt for further
+  See the file <file:Documentation/networking/iphase.txt> for further
   details.
 
 Enable debugging messages
@@ -5447,9 +6231,11 @@
   Somewhat useful debugging messages are available. The choice of
   messages is controlled by a bitmap. This may be specified as a
   module argument (kernel command line argument as well?), changed
-  dynamically using an ioctl (Get the debug utility, iadbg, from 
-  ftp.iphase.com/pub/atm/pci). See the file drivers/atm/iphase.h 
-  for the meanings of the bits in the mask.
+  dynamically using an ioctl (Get the debug utility, iadbg, from
+  <ftp://ftp.iphase.com/pub/atm/pci>).
+
+  See the file <file:drivers/atm/iphase.h> for the meanings of the
+  bits in the mask.
 
   When active, these messages can have a significant impact on the
   speed of the driver, and the size of your syslog files! When
@@ -5458,36 +6244,37 @@
 Linux telephony support
 CONFIG_PHONE
   Say Y here if you have a telephony card, which for example allows
-  you to use a regular phone for voice-over-IP applications. 
+  you to use a regular phone for voice-over-IP applications.
 
-  Note: this has nothing to do with modems. You do not need to say Y
+  Note: this has nothing to do with modems.  You do not need to say Y
   here in order to be able to use a modem under Linux.
 
-  This support is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called phonedev.o.
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  phonedev.o.
 
 Compaq Smart Array support
 CONFIG_BLK_CPQ_CISS_DA
-   This is the driver for Compaq Smart Array 5xxx controllers.
-   Everyone using these boards should say Y here.
-   See Documentation/cciss.txt for the current list of
-   boards supported by this driver, and for further information
-   on the use of this driver.
+  This is the driver for Compaq Smart Array 5xxx controllers.
+  Everyone using these boards should say Y here.
+  See <file:Documentation/cciss.txt> for the current list of
+  boards supported by this driver, and for further information
+  on the use of this driver.
 
 QuickNet Internet LineJack/PhoneJack support
 CONFIG_PHONE_IXJ
   Say M if you have a telephony card manufactured by Quicknet
   Technologies, Inc.  These include the Internet PhoneJACK and
   Internet LineJACK Telephony Cards. You will get a module called
-  ixj.o. 
+  ixj.o.
 
   For the ISA versions of these products, you can configure the
   cards using the isapnp tools (pnpdump/isapnp) or you can use the
-  isapnp support.  Please read Documentation/telephony/ixj.txt.
+  isapnp support.  Please read <file:Documentation/telephony/ixj.txt>.
 
   For more information on these cards, see Quicknet's web site at:
-  http://www.quicknet.net/ .
+  <http://www.quicknet.net/>.
 
   If you do not have any Quicknet telephony cards, you can safely
   say N here.
@@ -5498,66 +6285,66 @@
   cards. It simultaneously supports PCA-200E and SBA-200E models
   on PCI and SBUS hosts. Say Y (or M to compile as a module
   named fore_200e.o) here if you have one of these ATM adapters.
- 
+
   Note that the driver will actually be compiled only if you
   additionally enable the support for PCA-200E and/or SBA-200E
   cards.
 
-  See the file Documentation/networking/fore200e.txt for further
-  details.
- 
+  See the file <file:Documentation/networking/fore200e.txt> for
+  further details.
+
 Enable PCA-200E card support on PCI-based hosts
 CONFIG_ATM_FORE200E_PCA
   Say Y here if you want your PCA-200E cards to be probed.
- 
+
 Use default PCA-200E firmware
 CONFIG_ATM_FORE200E_PCA_DEFAULT_FW
   Use the default PCA-200E firmware data shipped with the driver.
- 
+
   Normal users do not have to deal with the firmware stuff, so
   they should say Y here.
- 
+
 Pathname of user-supplied binary firmware
 CONFIG_ATM_FORE200E_PCA_FW
   This defines the pathname of an alternative PCA-200E binary
   firmware image supplied by the user. This pathname may be
   absolute or relative to the drivers/atm directory.
- 
+
   The driver comes with an adequate firmware image, so normal users do
   not have to supply an alternative one. They just say Y to "Use
   default PCA-200E firmware" instead.
- 
+
 Enable SBA-200E card support on SBUS-based hosts
 CONFIG_ATM_FORE200E_SBA
   Say Y here if you want your SBA-200E cards to be probed.
- 
+
 Use default SBA-200E firmware
 CONFIG_ATM_FORE200E_SBA_DEFAULT_FW
   Use the default SBA-200E firmware data shipped with the driver.
- 
+
   Normal users do not have to deal with the firmware stuff, so
   they should say Y here.
- 
+
 Pathname of user-supplied binary firmware
 CONFIG_ATM_FORE200E_SBA_FW
   This defines the pathname of an alternative SBA-200E binary
   firmware image supplied by the user. This pathname may be
   absolute or relative to the drivers/atm directory.
- 
+
   The driver comes with an adequate firmware image, so normal users do
   not have to supply an alternative one. They just say Y to "Use
   default SBA-200E firmware", above.
- 
+
 Maximum number of tx retries
 CONFIG_ATM_FORE200E_TX_RETRY
   Specifies the number of times the driver attempts to transmit
   a message before giving up, if the transmit queue of the ATM card
   is transiently saturated.
- 
+
   Saturation of the transmit queue may occur only under extreme
   conditions, e.g. when a fast host continuously submits very small
   frames (<64 bytes) or raw AAL0 cells (48 bytes) to the ATM adapter.
- 
+
   Note that under common conditions, it is unlikely that you encounter
   a saturation of the transmit queue, so the retry mechanism never
   comes into play.
@@ -5567,54 +6354,168 @@
   Specifies the level of debugging messages issued by the driver.
   The verbosity of the driver increases with the value of this
   parameter.
- 
+
   When active, these messages can have a significant impact on
   the performances of the driver, and the size of your syslog files!
   Keep the debugging level to 0 during normal operations.
 
-SCSI support?
+Fusion MPT device support
+CONFIG_FUSION
+  LSI Logic Fusion(TM) Message Passing Technology (MPT) device support
+  provides high performance SCSI host initiator, and LAN [1] interface
+  services to a host system.  The Fusion architecture is capable of
+  duplexing these protocols on high-speed Fibre Channel
+  (up to 2 GHz x 2 ports = 4 GHz) and parallel SCSI (up to Ultra-320)
+  physical medium.
+
+          [1] LAN is not supported on parallel SCSI medium.
+
+  These drivers require a Fusion MPT compatible PCI adapter installed
+  in the host system.  MPT adapters contain specialized I/O processors
+  to handle I/O workload, and more importantly to offload this work
+  from the host CPU(s).
+
+  If you have Fusion MPT hardware and want to use it, you can say
+  Y or M here to add MPT (base + ScsiHost) drivers.
+    <Y> = build lib (fusion.o), and link [static] into the kernel [2]
+          proper
+    <M> = compiled as [dynamic] modules [3] named: (mptbase.o,
+          mptscsih.o)
+
+          [2] In order enable capability to boot the linux kernel
+              natively from a Fusion MPT target device, you MUST
+               answer Y here! (currently requires CONFIG_BLK_DEV_SD)
+          [3] This support is also available as a module ( = code
+              which can be inserted in and removed from the running
+              kernel whenever you want).  If you want to compile as
+              modules, say M here and read
+              <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+  If you say Y or M here you will get a choice of these
+  additional protocol and support module options:         Module Name:
+    <M>   Enhanced SCSI error reporting                     (isense.o)
+    <M>   Fusion MPT misc device (ioctl) driver             (mptctl.o)
+    <M>   Fusion MPT LAN driver                             (mptlan.o)
+
+  ---
+  Fusion MPT is trademark of LSI Logic Corporation, and its
+  architecture is based on LSI Logic's Message Passing Interface (MPI)
+  specification.
+
+Fusion MPT enhanced SCSI error reporting [optional] module
+CONFIG_FUSION_ISENSE
+  The isense module (roughly stands for Interpret SENSE data) is
+  completely optional.  It simply provides extra English readable
+  strings in SCSI Error Report(s) that might be generated from the
+  Fusion MPT SCSI Host driver, for example when a target device
+  returns a SCSI check condition on a I/O.  Without this module
+  loaded you might see:
+
+    SCSI Error Report =-=-= (ioc0,scsi5:0)
+      SCSI_Status=02h (CHECK_CONDITION)
+      Original_CDB[]: 2A 00 00 00 00 41 00 00 02 00
+      SenseData[12h]: 70 00 02 00 00 00 00 0A 00 00 00 00 04 02 02 00 00 00
+      SenseKey=2h (NOT READY); FRU=02h
+      ASC/ASCQ=29h/00h
+
+  Where otherwise, if this module had been loaded, you would see:
+
+    SCSI Error Report =-=-= (ioc0,scsi5:0)
+      SCSI_Status=02h (CHECK_CONDITION)
+      Original_CDB[]: 2A 00 00 00 00 41 00 00 02 00 - "WRITE(10)"
+      SenseData[12h]: 70 00 02 00 00 00 00 0A 00 00 00 00 04 02 02 00 00 00
+      SenseKey=2h (NOT READY); FRU=02h
+      ASC/ASCQ=29h/00h "LOGICAL UNIT NOT READY, INITIALIZING CMD. REQUIRED"
+
+  Say M for "Enhanced SCSI error reporting" to compile this optional module,
+  creating a driver named: isense.o.
+
+  NOTE: Support for building this feature into the kernel is not
+  available, due to kernel size considerations.
+
+Fusion MPT misc device (ioctl) driver [optional] module
+CONFIG_FUSION_CTL
+  The Fusion MPT misc device driver provides specialized control
+  of MPT adapters via system ioctl calls.  Use of ioctl calls to
+  the MPT driver requires that you create and use a misc device
+  node ala:
+    mknod /dev/mptctl c 10 240
+
+  One use of this ioctl interface is to perform an upgrade (reflash)
+  of the MPT adapter firmware.  Refer to readme file(s) distributed
+  with the Fusion MPT linux driver for additional details.
+
+  If enabled by saying M to this, a driver named: mptctl.o
+  will be compiled.
+
+  If unsure whether you really want or need this, say N.
+
+Fusion MPT LAN driver [optional]
+CONFIG_FUSION_LAN
+  This module supports LAN IP traffic over Fibre Channel port(s)
+  on Fusion MPT compatible hardware (LSIFC9xx chips).
+  The physical interface used is defined in RFC 2625.
+  Please refer to that document for details.
+
+  Installing this driver requires the knowledge to configure and
+  activate a new network interface, "fc0", using standard Linux tools.
+
+  If enabled by saying M to this, a driver named: mptlan.o
+  will be compiled.
+
+  If unsure whether you really want or need this, say N.
+
+  NOTES: This feature is NOT available nor supported for linux-2.2.x
+  kernels.  You must be building a linux-2.3.x or linux-2.4.x kernel
+  in order to configure this option.
+  Support for building this feature into the linux kernel is not
+  yet available.
+
+SCSI support
 CONFIG_SCSI
-  If you want to use a SCSI hard disk, SCSI tape drive, SCSI CDROM or
+  If you want to use a SCSI hard disk, SCSI tape drive, SCSI CD-ROM or
   any other SCSI device under Linux, say Y and make sure that you know
   the name of your SCSI host adapter (the card inside your computer
   that "speaks" the SCSI protocol, also called SCSI controller),
-  because you will be asked for it. 
+  because you will be asked for it.
 
   You also need to say Y here if you want support for the parallel
   port version of the 100 MB IOMEGA ZIP drive.
 
   Please read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . The
+  <http://www.linuxdoc.org/docs.html#howto>. The
   SCSI-Programming-HOWTO contains information about how to add or
   remove an SCSI device from a running Linux machine without
   rebooting.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called scsi_mod.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt and
-  Documentation/scsi.txt. However, do not compile this as a module if
-  your root file system (the one containing the directory /) is
-  located on a SCSI device.
+  The module will be called scsi_mod.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.  However, do not compile this as a
+  module if your root file system (the one containing the directory /)
+  is located on a SCSI device.
 
 SCSI disk support
 CONFIG_BLK_DEV_SD
   If you want to use a SCSI hard disk or the SCSI or parallel port
   version of the IOMEGA ZIP drive under Linux, say Y and read the
   SCSI-HOWTO, the Disk-HOWTO and the Multi-Disk-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . This is NOT for SCSI
-  CDROMs.
+  <http://www.linuxdoc.org/docs.html#howto>. This is NOT for SCSI
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called sd_mod.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt and
-  Documentation/scsi.txt. Do not compile this driver as a module if
-  your root file system (the one containing the directory /) is
-  located on a SCSI disk. In this case, do not compile the driver for
-  your SCSI host adapter (below) as a module either.
+  The module will be called sd_mod.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.  Do not compile this driver as a
+  module if your root file system (the one containing the directory /)
+  is located on a SCSI disk. In this case, do not compile the driver
+  for your SCSI host adapter (below) as a module either.
 
-Extra SCSI Disks
+Maximum number of SCSI disks that can be loaded as modules
 CONFIG_SD_EXTRA_DEVS
   This controls the amount of additional space allocated in tables for
   drivers that are loaded as modules after the kernel is booted.  In
@@ -5628,63 +6529,76 @@
 
   If you don't understand what's going on, go with the default.
 
+Maximum number of SCSI tapes that can be loaded as modules
+CONFIG_ST_EXTRA_DEVS
+  This controls the amount of additional space allocated in tables for
+  drivers that are loaded as modules after the kernel is booted.  In
+  the event that the SCSI core itself was loaded as a module, this
+  value is the number of additional tapes that can be loaded after the
+  first host driver is loaded.
+
+  Admittedly this isn't pretty, but there are tons of race conditions
+  involved with resizing the internal arrays on the fly.  Someday this
+  flag will go away, and everything will work automatically.
+
+  If you don't understand what's going on, go with the default.
+
 SCSI tape support
 CONFIG_CHR_DEV_ST
   If you want to use a SCSI tape drive under Linux, say Y and read the
   SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , and
-  drivers/scsi/README.st in the kernel source. This is NOT for SCSI
-  CDROMs.
+  <http://www.linuxdoc.org/docs.html#howto>, and
+  <file:drivers/scsi/README.st> in the kernel source.  This is NOT for
+  SCSI CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called st.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt and
-  Documentation/scsi.txt .
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.
 
 OnStream SC-x0 SCSI tape support
 CONFIG_CHR_DEV_OSST
-  The OnStream SC-x0 SCSI tape drives can not be driven by the 
-  standard st driver, but instead need this special osst driver and 
-  use the  /dev/osstX char device nodes (major 206).
-  Via usb-storage and ide-scsi, you may be able to drive the USB-x0 
-  and DI-x0 drives as well. Note that there is also a second generation
-  of OnStream tape drives (ADR-x0) that supports the standard SCSI-2
-  commands for tapes (QIC-157) and can be driven by the standard
-  driver st.
+  The OnStream SC-x0 SCSI tape drives can not be driven by the
+  standard st driver, but instead need this special osst driver and
+  use the  /dev/osstX char device nodes (major 206).  Via usb-storage
+  and ide-scsi, you may be able to drive the USB-x0 and DI-x0 drives
+  as well.  Note that there is also a second generation of OnStream
+  tape drives (ADR-x0) that supports the standard SCSI-2 commands for
+  tapes (QIC-157) and can be driven by the standard driver st.
   For more information, you may have a look at the SCSI-HOWTO
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO  and
-  drivers/scsi/README.osst  in the kernel source. 
-  More info on the OnStream driver may be found on 
-  http://linux1.onstream.nl/test/
+  <ftp://metalab.unc.edu/pub/Linux/docs/HOWTO>  and
+  <file:drivers/scsi/README.osst>  in the kernel source.
+  More info on the OnStream driver may be found on
+  <http://linux1.onstream.nl/test/>
   Please also have a look at the standard st docu, as most of it
   applies to osst as well.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called osst.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt and
-  Documentation/scsi.txt .
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.
 
-SCSI CDROM support
+SCSI CD-ROM support
 CONFIG_BLK_DEV_SR
-  If you want to use a SCSI CDROM under Linux, say Y and read the
-  SCSI-HOWTO and the CDROM-HOWTO at
-  http://www.linuxdoc.org/docs.html#howto . Also make sure to say Y
-  or M to "ISO 9660 CDROM file system support" later.
+  If you want to use a SCSI CD-ROM under Linux, say Y and read the
+  SCSI-HOWTO and the CD-ROM-HOWTO at
+  <http://www.linuxdoc.org/docs.html#howto>. Also make sure to say Y
+  or M to "ISO 9660 CD-ROM file system support" later.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called sr_mod.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt and
-  Documentation/scsi.txt .
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.
 
-Extra SCSI CDROMs
+Maximum number of CD-ROM devices that can be loaded as modules
 CONFIG_SR_EXTRA_DEVS
   This controls the amount of additional space allocated in tables for
   drivers that are loaded as modules after the kernel is booted. In
   the event that the SCSI core itself was loaded as a module, this
-  value is the number of additional CDROMs that can be loaded after
+  value is the number of additional CD-ROMs that can be loaded after
   the first host driver is loaded.
 
   Admittedly this isn't pretty, but there are tons of race conditions
@@ -5693,7 +6607,7 @@
 
   If you don't understand what's going on, go with the default.
 
-Enable vendor-specific extensions (for SCSI CDROM)
+Enable vendor-specific extensions (for SCSI CD-ROM)
 CONFIG_BLK_DEV_SR_VENDOR
   This enables the usage of vendor specific SCSI commands. This is
   required to support multisession CDs with old NEC/TOSHIBA cdrom
@@ -5704,27 +6618,27 @@
 CONFIG_CHR_DEV_SG
   If you want to use SCSI scanners, synthesizers or CD-writers or just
   about anything having "SCSI" in its name other than hard disks,
-  CDROMs or tapes, say Y here. These won't be supported by the kernel
+  CD-ROMs or tapes, say Y here. These won't be supported by the kernel
   directly, so you need some additional software which knows how to
   talk to these devices using the SCSI protocol:
 
-  For scanners, look at SANE (http://www.mostang.com/sane). For CD
+  For scanners, look at SANE (<http://www.mostang.com/sane>). For CD
   writer software look at cdrecord
-  (http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html)
+  (<http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html>)
   and for burning a "disk at once": cdrdao
-  (http://www.ping.de/sites/daneb/cdrdao.html). Cdparanoia is a high
-  quality digital reader of audio CDs (http://www.xiph.org/paranoia).
+  (<http://www.ping.de/sites/daneb/cdrdao.html>). Cdparanoia is a high
+  quality digital reader of audio CDs (<http://www.xiph.org/paranoia>).
   For other devices, it's possible that you'll have to write the
   driver software yourself. Please read the file
-  Documentation/scsi-generic.txt for more information.
+  <file:Documentation/scsi-generic.txt> for more information.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt and
-  Documentation/scsi.txt. The module will be called sg.o. If unsure,
+  say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>. The module will be called sg.o. If unsure,
   say N.
 
-Debug new queueing code for SCSI
+Enable extra checks in SCSI queueing code
 CONFIG_SCSI_DEBUG_QUEUES
   This option turns on a lot of additional consistency checking for
   the new queueing code. This will adversely affect performance, but
@@ -5732,14 +6646,14 @@
   This will typically cause the kernel to panic if an error is
   detected, but it would have probably crashed if the panic weren't
   there. Comments/questions/problems to linux-scsi mailing list
-  please. See http://www.andante.org/scsi_queue.html for more
+  please. See <http://www.andante.org/scsi_queue.html> for more
   up-to-date information.
 
 Probe all LUNs on each SCSI device
 CONFIG_SCSI_MULTI_LUN
   If you have a SCSI device that supports more than one LUN (Logical
   Unit Number), e.g. a CD jukebox, and only one LUN is detected, you
-  can say Y here to force the SCSI driver to probe for multiple LUNs. 
+  can say Y here to force the SCSI driver to probe for multiple LUNs.
   A SCSI device with multiple LUNs acts logically like multiple SCSI
   devices. The vast majority of SCSI devices have only one LUN, and
   so most people can say N here and should in fact do so, because it
@@ -5754,7 +6668,7 @@
 SCSI logging facility
 CONFIG_SCSI_LOGGING
   This turns on a logging facility that can be used to debug a number
-  of SCSI related problems. 
+  of SCSI related problems.
 
   If you say Y here, no logging output will appear by default, but you
   can enable logging by saying Y to "/proc file system support" and
@@ -5765,25 +6679,37 @@
   at boot time after the /proc file system has been mounted.
 
   There are a number of things that can be used for 'token' (you can
-  find them in the source: drivers/scsi/scsi.c), and this allows you
-  to select the types of information you want, and the level allows
-  you to select the level of verbosity. 
+  find them in the source: <file:drivers/scsi/scsi.c>), and this
+  allows you to select the types of information you want, and the
+  level allows you to select the level of verbosity.
 
   If you say N here, it may be harder to track down some types of SCSI
   problems. If you say Y here your kernel will be somewhat larger, but
   there should be no noticeable performance impact as long as you have
   logging turned off.
 
+SGI WD93C93 SCSI Driver
+CONFIG_SCSI_SGIWD93
+  Say Y here to support the on-board WD93C93 SCSI controller found (a)
+  on the Indigo2 and other MIPS-based SGI machines, and (b) on ARCS
+  ARM-based machines.
+
+DEC NCR53C94 SCSI Driver
+CONFIG_SCSI_DECNCR
+  Say Y here to support the NCR53C94 SCSI controller chips on IOASIC
+  based TURBOchannel DECstations and TURBOchannel PMAZ-A cards.
+
 AdvanSys SCSI support
 CONFIG_SCSI_ADVANSYS
   This is a driver for all SCSI host adapters manufactured by
   AdvanSys. It is documented in the kernel source in
-  drivers/scsi/advansys.c. 
+  <file:drivers/scsi/advansys.c>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The module will be called advansys.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  advansys.o.
 
 Adaptec AHA152X/2825 support
 CONFIG_SCSI_AHA152X
@@ -5792,49 +6718,61 @@
   must be manually specified in this case.
 
   It is explained in section 3.3 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . You might also want to
-  read the file drivers/scsi/README.aha152x.
+  <http://www.linuxdoc.org/docs.html#howto>. You might also want to
+  read the file <file:drivers/scsi/README.aha152x>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called aha152x.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Adaptec AHA1542 support
 CONFIG_SCSI_AHA1542
-  This is support for a SCSI host adapter. It is explained in section
+  This is support for a SCSI host adapter.  It is explained in section
   3.4 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Note that Trantor was
+  <http://www.linuxdoc.org/docs.html#howto>.  Note that Trantor was
   purchased by Adaptec, and some former Trantor products are being
-  sold under the Adaptec name. If it doesn't work out of the box, you
-  may have to change some settings in drivers/scsi/aha1542.h.
-  
+  sold under the Adaptec name.  If it doesn't work out of the box, you
+  may have to change some settings in <file:drivers/scsi/aha1542.h>.
+
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called aha1542.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called aha1542.o.
 
 Adaptec AHA1740 support
 CONFIG_SCSI_AHA1740
-  This is support for a SCSI host adapter. It is explained in section
+  This is support for a SCSI host adapter.  It is explained in section
   3.5 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . If it doesn't work out
+  <http://www.linuxdoc.org/docs.html#howto>.  If it doesn't work out
   of the box, you may have to change some settings in
-  drivers/scsi/aha1740.h.
+  <file:drivers/scsi/aha1740.h>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called aha1740.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called aha1740.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Adaptec AIC7xxx chipset SCSI controller support
+Adaptec AIC7xxx support
 CONFIG_SCSI_AIC7XXX
-  This driver supports all of Adaptec's PCI based SCSI controllers (not
-  the hardware RAID controllers though) as well as the aic7770 based
-  EISA and VLB SCSI controllers (the 274x and 284x series).  This is
-  an Adaptec sponsored driver written by Justin Gibbs.  It is intended
-  to replace the previous aic7xxx driver maintained by Doug Ledford since
-  Doug is no longer maintaining that driver.
+  This driver supports all of Adaptec's PCI based SCSI controllers
+  (not the hardware RAID controllers though) as well as the aic7770
+  based EISA and VLB SCSI controllers (the 274x and 284x series).
+  This is an Adaptec sponsored driver written by Justin Gibbs.  It is
+  intended to replace the previous aic7xxx driver maintained by Doug
+  Ledford since Doug is no longer maintaining that driver.
+
+Adaptec I2O RAID controllers
+CONFIG_SCSI_DPT_I2O
+  This driver supports all of Adaptec's I2O based RAID controllers as 
+  well as the DPT SmartRaid V cards.  This is an Adaptec maintained
+  driver by Deanna Bonds.  See <file:drivers/scsi/README.dpti>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  dpt_i2o.o.
 
 Default number of TCQ commands per device
 CONFIG_AIC7XXX_CMDS_PER_DEVICE
@@ -5852,21 +6790,31 @@
 
   Default: 253
 
-Initial Bus Reset Settle Delay
+Delay in seconds after SCSI bus reset
 CONFIG_AIC7XXX_RESET_DELAY_MS
   The number of milliseconds to delay after an initial bus reset.
   The bus settle delay following all error recovery actions is
   dictated by the SCSI layer and is not affected by this value.
 
-  Default: 5000 (5 seconds)
+  Default: 15000 (15 seconds)
 
-Old Adaptec AIC7xxx chipset SCSI controller support
+Build Adapter Firmware with Kernel Build
+CONFIG_AIC7XXX_BUILD_FIRMWARE
+  This option should only be enabled if you are modifying the firmware
+  source to the aic7xxx driver and wish to have the generated firmware
+  include files updated during a normal kernel build.  The assembler
+  for the firmware requires lex and yacc or their equivalents, as well
+  as the db v1 library.  You may have to install additional packages
+  or modify the assembler make file or the files it includes if your
+  build environment is different than that of the author.
+
+Old Adaptec AIC7xxx support
 CONFIG_SCSI_AIC7XXX_OLD
-  WARNING This driver is an older aic7xxx driver and is no longer under
-  active development.  Adaptec, Inc. is writing a new driver to take the
-  place of this one, and it is recommended that whenever possible, people
-  should use the new Adaptec written driver instead of this one.  This
-  driver will eventually be phased out entirely.
+  WARNING This driver is an older aic7xxx driver and is no longer
+  under active development.  Adaptec, Inc. is writing a new driver to
+  take the place of this one, and it is recommended that whenever
+  possible, people should use the new Adaptec written driver instead
+  of this one.  This driver will eventually be phased out entirely.
 
   This is support for the various aic7xxx based Adaptec SCSI
   controllers. These include the 274x EISA cards; 284x VLB cards;
@@ -5889,47 +6837,47 @@
 
   Information on the configuration options for this controller can be
   found by checking the help file for each of the available
-  configuration options. You should read drivers/scsi/aic7xxx_old/README.aic7xxx
-  at a minimum before contacting the maintainer with any questions.
-  The SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , can also be of great
-  help.
+  configuration options. You should read
+  <file:drivers/scsi/aic7xxx_old/README.aic7xxx> at a minimum before
+  contacting the maintainer with any questions.  The SCSI-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>, can also
+  be of great help.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called aic7xxx_old.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called aic7xxx_old.o.
 
-Enable or Disable Tagged Command Queueing by default
+Enable tagged command queueing (TCQ) by default
 CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT
   This option causes the aic7xxx driver to attempt to use Tagged
-  Command Queueing (TCQ) on all devices that claim to support it. 
+  Command Queueing (TCQ) on all devices that claim to support it.
 
   TCQ is a feature of SCSI-2 which improves performance: the host
   adapter can send several SCSI commands to a device's queue even if
-  previous commands haven't finished yet. Because the device is
+  previous commands haven't finished yet.  Because the device is
   intelligent, it can optimize its operations (like head positioning)
-  based on its own request queue. Not all devices implement this
-  correctly. 
+  based on its own request queue.  Not all devices implement this
+  correctly.
 
   If you say Y here, you can still turn off TCQ on troublesome devices
-  with the use of the tag_info boot parameter. See the file
-  drivers/scsi/README.aic7xxx for more information on that and other
-  aic7xxx setup commands. If this option is turned off, you may still
-  enable TCQ on known good devices by use of the tag_info boot
+  with the use of the tag_info boot parameter.  See the file
+  <file:drivers/scsi/README.aic7xxx> for more information on that and
+  other aic7xxx setup commands.  If this option is turned off, you may
+  still enable TCQ on known good devices by use of the tag_info boot
   parameter.
 
   If you are unsure about your devices then it is safest to say N
   here.
-  
+
   However, TCQ can increase performance on some hard drives by as much
   as 50% or more, so it is recommended that if you say N here, you
-  should at least read the README.aic7xxx file so you will know how to
-  enable this option manually should your drives prove to be safe in
-  regards to TCQ.
+  should at least read the <file:drivers/scsi/README.aic7xxx> file so
+  you will know how to enable this option manually should your drives
+  prove to be safe in regards to TCQ.
 
   Conversely, certain drives are known to lock up or cause bus resets
-  when TCQ is enabled on them. If you have a Western Digital
+  when TCQ is enabled on them.  If you have a Western Digital
   Enterprise SCSI drive for instance, then don't even bother to enable
   TCQ on it as the drive will become unreliable, and it will actually
   reduce performance.
@@ -5947,7 +6895,7 @@
   eventually have their command depth reduced, but is a waste of
   memory if all of your devices end up reducing this number down to a
   more reasonable figure.
-  
+
   NOTE: Certain very broken drives are known to lock up when given
   more commands than they like to deal with. Quantum Fireball drives
   are the most common in this category. For the Quantum Fireball
@@ -5964,14 +6912,14 @@
   small amount of overhead to each and every SCSI command the aic7xxx
   driver handles, so if you aren't really interested in this
   information, it is best to leave it disabled. This will only work if
-  you also say Y to "/proc file system support", below. 
+  you also say Y to "/proc file system support", below.
 
   If unsure, say N.
 
-IBM ServeRAID Support
+IBM ServeRAID support
 CONFIG_SCSI_IPS
   This is support for the IBM ServeRAID hardware RAID controllers.
-  See http://www.developer.ibm.com/welcome/netfinity/serveraid.html
+  See <http://www.developer.ibm.com/welcome/netfinity/serveraid.html>
   for more information.  If this driver does not work correctly
   without modification please contact the author by email at
   ipslinux@us.ibm.com.
@@ -5979,14 +6927,14 @@
   You can build this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
   but only a single instance may be loaded. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt. The
-  module will be called ips.o.
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  The module will be called ips.o.
 
 BusLogic SCSI support
 CONFIG_SCSI_BUSLOGIC
   This is support for BusLogic MultiMaster and FlashPoint SCSI Host
   Adapters. Consult the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , and the files
+  <http://www.linuxdoc.org/docs.html#howto>, and the files
   README.BusLogic and README.FlashPoint in drivers/scsi for more
   information. If this driver does not work correctly without
   modification, please contact the author, Leonard N. Zubkoff, by
@@ -5995,8 +6943,8 @@
   You can also build this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
   but only a single instance may be loaded. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt. The
-  module will be called BusLogic.o.
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  The module will be called BusLogic.o.
 
 Omit BusLogic SCSI FlashPoint support
 CONFIG_SCSI_OMIT_FLASHPOINT
@@ -6005,81 +6953,86 @@
   substantial, so users of MultiMaster Host Adapters may wish to omit
   it.
 
+Compaq Fibre Channel 64-bit/66Mhz HBA support
+CONFIG_SCSI_CPQFCTS
+  Say Y here to compile in support for the Compaq StorageWorks Fibre
+  Channel 64-bit/66Mhz Host Bus Adapter.
+
 DMX3191D SCSI support
 CONFIG_SCSI_DMX3191D
   This is support for Domex DMX3191D SCSI Host Adapters.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called dmx3191d.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called dmx3191d.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 DTC3180/3280 SCSI support
 CONFIG_SCSI_DTC3280
-  This is support for DTC 3180/3280 SCSI Host Adapters. Please read
+  This is support for DTC 3180/3280 SCSI Host Adapters.  Please read
   the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , and the file
-  drivers/scsi/README.dtc3x80.
+  <http://www.linuxdoc.org/docs.html#howto>, and the file
+  <file:drivers/scsi/README.dtc3x80>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called dtc.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called dtc.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support
 CONFIG_SCSI_EATA_DMA
   This is support for the EATA-DMA protocol compliant SCSI Host
   Adapters like the SmartCache III/IV, SmartRAID controller families
-  and the DPT PM2011B and PM2012B controllers. 
+  and the DPT PM2011B and PM2012B controllers.
 
-  Note that this driver is obsolete; if you have one of the above SCSI
-  Host Adapters, you should normally say N here and Y to "EATA
-  ISA/EISA/PCI support", below. Please read the SCSI-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  Note that this driver is obsolete; if you have one of the above
+  SCSI Host Adapters, you should normally say N here and Y to "EATA
+  ISA/EISA/PCI support", below.  Please read the SCSI-HOWTO, available
+  from <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called eata_dma.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called eata_dma.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 EATA-PIO (old DPT PM2001, PM2012A) support
 CONFIG_SCSI_EATA_PIO
   This driver supports all EATA-PIO protocol compliant SCSI Host
-  Adapters like the DPT PM2001 and the PM2012A. EATA-DMA compliant
+  Adapters like the DPT PM2001 and the PM2012A.  EATA-DMA compliant
   host adapters could also use this driver but are discouraged from
   doing so, since this driver only supports hard disks and lacks
-  numerous features. You might want to have a look at the SCSI-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto . 
+  numerous features.  You might want to have a look at the SCSI-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called eata_pio.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called eata_pio.o.
 
 UltraStor 14F/34F support
 CONFIG_SCSI_U14_34F
   This is support for the UltraStor 14F and 34F SCSI-2 host adapters.
-  The source at drivers/scsi/u14-34f.c contains some information about
-  this hardware. If the driver doesn't work out of the box, you may
-  have to change some settings in drivers/scsi/u14-34f.c. Read the
-  SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Note that there is also
+  The source at <file:drivers/scsi/u14-34f.c> contains some
+  information about this hardware.  If the driver doesn't work out of
+  the box, you may have to change some settings in
+  <file: drivers/scsi/u14-34f.c>.  Read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.  Note that there is also
   another driver for the same hardware: "UltraStor SCSI support",
-  below. You should say Y to both only if you want 24F support as
+  below.  You should say Y to both only if you want 24F support as
   well.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called u14-34f.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called u14-34f.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 enable elevator sorting
 CONFIG_SCSI_U14_34F_LINKED_COMMANDS
-  This option enables elevator sorting for all probed SCSI disks and 
-  CDROMs. It definitely reduces the average seek distance when doing
+  This option enables elevator sorting for all probed SCSI disks and
+  CD-ROMs. It definitely reduces the average seek distance when doing
   random seeks, but this does not necessarily result in a noticeable
   performance improvement: your mileage may vary...
-  
+
   The safe answer is N.
 
 maximum number of queued commands
@@ -6098,7 +7051,7 @@
   other adapters based on the Future Domain chipsets (Quantum
   ISA-200S, ISA-250MG; Adaptec AHA-2920A; and at least one IBM board).
   It is explained in section 3.7 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip
   and should use the aic7xxx driver ("Adaptec AIC7xxx chipset SCSI
@@ -6108,7 +7061,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called fdomain.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Future Domain MCS-600/700 SCSI support
 CONFIG_SCSI_FD_MCS
@@ -6121,71 +7074,90 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called fd_mcs.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Generic NCR5380/53c400 SCSI support
 CONFIG_SCSI_GENERIC_NCR5380
   This is the generic NCR family of SCSI controllers, not to be
-  confused with the NCR 53c7 or 8xx controllers. It is explained in
+  confused with the NCR 53c7 or 8xx controllers.  It is explained in
   section 3.8 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . If it doesn't work out
+  <http://www.linuxdoc.org/docs.html#howto>.  If it doesn't work out
   of the box, you may have to change some settings in
-  drivers/scsi/g_NCR5380.h.
+  <file:drivers/scsi/g_NCR5380.h>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called g_NCR5380.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  The module will be called g_NCR5380.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Enable NCR53c400 extensions
 CONFIG_SCSI_GENERIC_NCR53C400
-  This enables certain optimizations for the NCR53c400 SCSI cards. You
-  might as well try it out. Note that this driver will only probe for
-  the Trantor T130B in its default configuration; you might have to
-  pass a command line option to the kernel at boot time if it doesn't
-  detect your card. See the file drivers/scsi/README.g_NCR5380 for
-  details.
+  This enables certain optimizations for the NCR53c400 SCSI cards.
+  You might as well try it out.  Note that this driver will only probe
+  for the Trantor T130B in its default configuration; you might have
+  to pass a command line option to the kernel at boot time if it does
+  not detect your card.  See the file
+  <file:drivers/scsi/README.g_NCR5380> for details.
 
+# Choice: ncr5380
 NCR5380/53c400 mapping method (use Port for T130B)
 CONFIG_SCSI_G_NCR5380_PORT
   The NCR5380 and NCR53c400 SCSI controllers come in two varieties:
   port or memory mapped. You should know what you have. The most
   common card, Trantor T130B, uses port mapped mode.
 
+NCR Dual 700 MCA SCSI support
+CONFIG_SCSI_NCR_D700
+  This is a driver for the MicroChannel Dual 700 card produced by
+  NCR and commonly used in 345x/35xx/4100 class machines.  It always
+  tries to negotiate sync and uses tag command queueing.
+
+  Unless you have an NCR manufactured machine, the chances are that
+  you do not have this SCSI card, so say N.
+
+HP LASI SCSI support for 53c700
+CONFIG_SCSI_LASI700
+  This is a driver for the lasi baseboard in some parisc machines
+  which is based on the 53c700 chip.  Will also support LASI subsystems
+  based on the 710 chip using 700 emulation mode.
+
+  Unless you know you have a 53c700 or 53c710 based lasi, say N here
+
 NCR53c7,8xx SCSI support
 CONFIG_SCSI_NCR53C7xx
   This is a driver for the 53c7 and 8xx NCR family of SCSI
-  controllers, not to be confused with the NCR 5380 controllers. It is
-  explained in section 3.8 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . If it doesn't work out
+  controllers, not to be confused with the NCR 5380 controllers.  It
+  is explained in section 3.8 of the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.  If it doesn't work out
   of the box, you may have to change some settings in
-  drivers/scsi/53c7,8xx.h. Please read drivers/scsi/README.ncr53c7xx
-  for the available boot time command line options.
+  <file:drivers/scsi/53c7,8xx.h>.  Please read
+  <file:drivers/scsi/README.ncr53c7xx> for the available boot time
+  command line options.
 
   Note: there is another driver for the 53c8xx family of controllers
-  ("NCR53C8XX SCSI support" below). If you want to use them both, you
+  ("NCR53C8XX SCSI support" below).  If you want to use them both, you
   need to say M to both and build them as modules, but only one may be
   active at a time. If you have a 53c8xx board, it's better to use the
   other driver.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 53c7,8xx.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called 53c7,8xx.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
-always negotiate synchronous transfers
+Always negotiate synchronous transfers
 CONFIG_SCSI_NCR53C7xx_sync
   In general, this is good; however, it is a bit dangerous since there
   are some broken SCSI devices out there. Take your chances. Safe bet
   is N.
 
-allow FAST-SCSI [10MHz]
+Allow FAST-SCSI [10MHz]
 CONFIG_SCSI_NCR53C7xx_FAST
   This will enable 10MHz FAST-SCSI transfers with your host
   adapter. Some systems have problems with that speed, so it's safest
   to say N here.
 
-allow DISCONNECT
+Allow DISCONNECT
 CONFIG_SCSI_NCR53C7xx_DISCONNECT
   This enables the disconnect/reconnect feature of the NCR SCSI
   controller. When you say Y here, a slow SCSI device will not lock
@@ -6197,10 +7169,67 @@
   to hang, which might cause a system crash. The safe answer
   therefore is to say N.
 
+SYM53C8XX Version 2 SCSI support
+CONFIG_SCSI_SYM53C8XX_2
+  This driver supports the whole NCR53C8XX/SYM53C8XX family of 
+  PCI-SCSI controllers. It also supports the subset of LSI53C10XX 
+  Ultra-160 controllers that are based on the SYM53C8XX SCRIPTS 
+  language. It does not support LSI53C10XX Ultra-320 PCI-X SCSI 
+  controllers.
+
+  If your system has problems using this new major version of the
+  SYM53C8XX driver, you may switch back to driver version 1.
+
+  Please read drivers/scsi/sym53c8xx_2/Documentation.txt for more
+  information.
+
+PCI DMA addressing mode
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE
+  This option only applies to PCI-SCSI chip that are PCI DAC capable 
+  (875A, 895A, 896, 1010-33, 1010-66, 1000).
+
+  When set to 0, only PCI 32 bit DMA addressing (SAC) will be performed.
+  When set to 1, 40 bit DMA addressing (with upper 24 bits of address 
+  set to zero) is supported. The addressable range is here 1 TB.
+  When set to 2, full 64 bits of address for DMA are supported, but only
+  16 segments of 4 GB can be addressed. The addressable range is so 
+  limited to 64 GB.
+
+  The safest value is 0 (32 bit DMA addressing) that is guessed to still 
+  fit most of real machines.
+
+  The preferred value 1 (40 bit DMA addressing) should make happy 
+  properly engineered PCI DAC capable host bridges. You may configure
+  this option for Intel platforms with more than 4 GB of memory.
+
+  The still experimental value 2 (64 bit DMA addressing with 16 x 4GB 
+  segments limitation) can be used on systems that require PCI address 
+  bits past bit 39 to be set for the addressing of memory using PCI 
+  DAC cycles.
+
+use normal IO
+CONFIG_SCSI_SYM53C8XX_IOMAPPED
+  If you say Y here, the driver will preferently use normal IO rather than 
+  memory mapped IO.
+
+maximum number of queued commands
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS
+  This option allows you to specify the maximum number of commands
+  that can be queued to any device, when tagged command queuing is
+  possible. The driver supports up to 256 queued commands per device.
+  This value is used as a compiled-in hard limit.
+
+default tagged command queue depth
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS
+  This is the default value of the command queue depth the driver will 
+  announce to the generic SCSI layer for devices that support tagged 
+  command queueing. This value can be changed from the boot command line.
+  This is a soft limit that cannot exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
+
 NCR53C8XX SCSI support
 CONFIG_SCSI_NCR53C8XX
   This is the BSD ncr driver adapted to Linux for the NCR53C8XX family
-  of PCI-SCSI controllers. This driver supports parity checking,
+  of PCI-SCSI controllers.  This driver supports parity checking,
   tagged command queuing and fast synchronous data transfers up to 80
   MB/s with wide FAST-40 LVD devices and controllers.
 
@@ -6208,21 +7237,22 @@
   option "SYM53C8XX SCSI support", below.
 
   Note: there is yet another driver for the 53c8xx family of
-  controllers ("NCR53c7,8xx SCSI support" above). If you want to use
+  controllers ("NCR53c7,8xx SCSI support" above).  If you want to use
   them both, you need to say M to both and build them as modules, but
-  only one may be active at a time. If you have a 53c8xx board, you
+  only one may be active at a time.  If you have a 53c8xx board, you
   probably do not want to use the "NCR53c7,8xx SCSI support".
 
-  Please read drivers/scsi/README.ncr53c8xx for more information.
+  Please read <file:drivers/scsi/README.ncr53c8xx> for more
+  information.
 
-SYM53C8XX SCSI support
+SYM53C8XX Version 1 SCSI support
 CONFIG_SCSI_SYM53C8XX
   This driver supports all the features of recent 53C8XX chips (used
   in PCI SCSI controllers), notably the hardware phase mismatch
   feature of the SYM53C896.
 
   Older versions of the 53C8XX chips are not supported by this
-  driver. If your system uses either a 810 rev. < 16, a 815, or a 825
+  driver.  If your system uses either a 810 rev. < 16, a 815, or a 825
   rev. < 16 PCI SCSI processor, you must use the generic NCR53C8XX
   driver ("NCR53C8XX SCSI support" above) or configure both the
   NCR53C8XX and this SYM53C8XX drivers either as module or linked to
@@ -6231,32 +7261,33 @@
   When both drivers are linked into the kernel, the SYM53C8XX driver
   is called first at initialization and you can use the 'excl=ioaddr'
   driver boot option to exclude attachment of adapters by the
-  SYM53C8XX driver. For example, entering
+  SYM53C8XX driver.  For example, entering
   'sym53c8xx=excl:0xb400,excl=0xc000' at the lilo prompt prevents
   adapters at io address 0xb400 and 0xc000 from being attached by the
   SYM53C8XX driver, thus allowing the NCR53C8XX driver to attach them.
   The 'excl' option is also supported by the NCR53C8XX driver.
-  
-  Please read drivers/scsi/README.ncr53c8xx for more information.
 
-synchronous data transfers frequency
+  Please read <file:drivers/scsi/README.ncr53c8xx> for more
+  information.
+
+Synchronous transfer frequency in MHz
 CONFIG_SCSI_NCR53C8XX_SYNC
   The SCSI Parallel Interface-2 Standard defines 5 classes of transfer
-  rates: FAST-5, FAST-10, FAST-20, FAST-40 and FAST-80. The numbers are
-  respectively the maximum data transfer rates in mega-transfers per
-  second for each class. For example, a FAST-20 Wide 16 device is able
-  to transfer data at 20 million 16 bit packets per second for a total
-  rate of 40 MB/s.
+  rates: FAST-5, FAST-10, FAST-20, FAST-40 and FAST-80.  The numbers
+  are respectively the maximum data transfer rates in mega-transfers
+  per second for each class.  For example, a FAST-20 Wide 16 device is
+  able to transfer data at 20 million 16 bit packets per second for a
+  total rate of 40 MB/s.
 
   You may specify 0 if you want to only use asynchronous data
   transfers. This is the safest and slowest option. Otherwise, specify
   a value between 5 and 80, depending on the capability of your SCSI
-  controller. The higher the number, the faster the data transfer.
+  controller.  The higher the number, the faster the data transfer.
   Note that 80 should normally be ok since the driver decreases the
   value automatically according to the controller's capabilities.
 
   Your answer to this question is ignored for controllers with NVRAM,
-  since the driver will get this information from the user set-up. It
+  since the driver will get this information from the user set-up.  It
   also can be overridden using a boot setup option, as follows
   (example): 'ncr53c8xx=sync:12' will allow the driver to negotiate
   for FAST-20 synchronous data transfer (20 mega-transfers per
@@ -6270,18 +7301,18 @@
   There is no safe option other than using good cabling, right
   terminations and SCSI conformant devices.
 
-use normal IO
+Use normal IO
 CONFIG_SCSI_NCR53C8XX_IOMAPPED
   If you say Y here, the driver will use normal IO, as opposed to
   memory mapped IO. Memory mapped IO has less latency than normal IO
   and works for most Intel-based hardware. Under Linux/Alpha only
   normal IO is currently supported by the driver and so, this option
-  has no effect on those systems. 
+  has no effect on those systems.
 
   The normal answer therefore is N; try Y only if you encounter SCSI
   related problems.
 
-not allow targets to disconnect
+Not allow targets to disconnect
 CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
   This option is only provided for safety if you suspect some SCSI
   device of yours to not support properly the target-disconnect
@@ -6289,7 +7320,7 @@
   not allow targets to disconnect is not reasonable if there is more
   than 1 device on a SCSI bus. The normal answer therefore is N.
 
-default tagged command queue depth
+Default tagged command queue depth
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
   "Tagged command queuing" is a feature of SCSI-2 which improves
   performance: the host adapter can send several SCSI commands to a
@@ -6300,33 +7331,33 @@
   feature, enter 0 or 1 here (it doesn't matter which).
 
   The default value is 8 and should be supported by most hard disks.
-  This value can be overridden from the boot command line using the 
+  This value can be overridden from the boot command line using the
   'tags' option as follows (example):
   'ncr53c8xx=tags:4/t2t3q16/t0u2q10' will set default queue depth to
   4, set queue depth to 16 for target 2 and target 3 on controller 0
   and set queue depth to 10 for target 0 / lun 2 on controller 1.
 
-  The normal answer therefore is to go with the default 8 and to use 
-  a boot command line option for devices that need to use a different 
+  The normal answer therefore is to go with the default 8 and to use
+  a boot command line option for devices that need to use a different
   command queue depth.
 
   There is no safe option other than using good SCSI devices.
 
-maximum number of queued commands
+Maximum number of queued commands
 CONFIG_SCSI_NCR53C8XX_MAX_TAGS
   This option allows you to specify the maximum number of commands
   that can be queued to any device, when tagged command queuing is
   possible. The default value is 32. Minimum is 2, maximum is 64.
-  Modern hard disks are able to support 64 tags and even more, but 
+  Modern hard disks are able to support 64 tags and even more, but
   do not seem to be faster when more than 32 tags are being used.
-  
+
   So, the normal answer here is to go with the default value 32 unless
   you are using very large hard disks with large cache (>= 1 MB) that
   are able to take advantage of more than 32 tagged commands.
 
   There is no safe option and the default answer is recommended.
 
-assume boards are SYMBIOS compatible (EXPERIMENTAL)
+Assume boards are SYMBIOS compatible
 CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
   This option allows you to enable some features depending on GPIO
   wiring. These General Purpose Input/Output pins can be used for
@@ -6335,7 +7366,7 @@
   controller LED and GPIO3 bit as a flag indicating
   singled-ended/differential interface. The Tekram DC-390U/F boards
   uses a different GPIO wiring.
-  
+
   Your answer to this question is ignored if all your controllers have
   NVRAM, since the driver is able to detect the board type from the
   NVRAM format.
@@ -6344,16 +7375,16 @@
   use BIOS and drivers from SYMBIOS, you would want to say Y here,
   otherwise N. N is the safe answer.
 
-enable profiling statistics gathering
+Enable traffic profiling
 CONFIG_SCSI_NCR53C8XX_PROFILE
   This option allows you to enable profiling information gathering.
-  These statistics are not very accurate due to the low frequency 
-  of the kernel clock (100 Hz on i386) and have performance impact 
+  These statistics are not very accurate due to the low frequency
+  of the kernel clock (100 Hz on i386) and have performance impact
   on systems that use very fast devices.
 
   The normal answer therefore is N.
 
-include support for the NCR PQS/PDS SCSI card
+Include support for the NCR PQS/PDS SCSI card
 CONFIG_SCSI_NCR53C8XX_PQS_PDS
   Say Y here if you have a special SCSI adapter produced by NCR
   corporation called a PCI Quad SCSI or PCI Dual SCSI. You do not need
@@ -6366,23 +7397,24 @@
 IBMMCA SCSI support
 CONFIG_SCSI_IBMMCA
   This is support for the IBM SCSI adapter found in many of the PS/2
-  series computers. These machines have an MCA bus, so you need to
-  answer Y to "MCA support" as well and read Documentation/mca.txt.
+  series computers.  These machines have an MCA bus, so you need to
+  answer Y to "MCA support" as well and read
+  <file:Documentation/mca.txt>.
 
   If the adapter isn't found during boot (a common problem for models
   56, 57, 76, and 77) you'll need to use the 'ibmmcascsi=<pun>' kernel
   option, where <pun> is the id of the SCSI subsystem (usually 7, but
-  if that doesn't work check your reference diskette). Owners of model
-  95 with a LED-matrix-display can in addition activate some activity
-  info like under OS/2, but more informative, by setting
-  'ibmmcascsi=display' as an additional kernel parameter. Try "man
+  if that doesn't work check your reference diskette).  Owners of
+  model 95 with a LED-matrix-display can in addition activate some
+  activity info like under OS/2, but more informative, by setting
+  'ibmmcascsi=display' as an additional kernel parameter.  Try "man
   bootparam" or see the documentation of your boot loader about how to
   pass options to the kernel.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ibmmca.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ibmmca.o.
 
 Standard SCSI-order
 CONFIG_IBMMCA_SCSI_ORDER_STANDARD
@@ -6399,7 +7431,7 @@
   highest priority. This must therefore be the disk with the highest
   SCSI-id (e.g. 6) and not the one with the lowest! IBM-BIOS kept the
   original definition of the SCSI-standard as also industrial- and
-  process-control-machines, like VME-CPUs running under realtime-OSs
+  process-control-machines, like VME-CPUs running under realtime-OSes
   (e.g. LynxOS, OS9) do.
 
   If you like to run Linux on your MCA-machine with the same
@@ -6428,96 +7460,96 @@
   you know that one of your older devices needs it; N is the safe
   answer.
 
-NCR 53C9x MCA support
+NCR MCA 53C9x SCSI support
 CONFIG_SCSI_MCA_53C9X
-  Some Microchannel machines, notably the NCR 35xx line, use a SCSI
+  Some MicroChannel machines, notably the NCR 35xx line, use a SCSI
   controller based on the NCR 53C94.  This driver will allow use of
-  the controller on the 3550, and very possibly others.   
+  the controller on the 3550, and very possibly others.
 
   If you want to compile this as a module (= code which can be
   inserted and removed from the running kernel whenever you want), say
-  M here and read Documentation/modules.txt. The module will be called
-  mca_53c9x.o.
- 
+  M here and read <file:Documentation/modules.txt>.  The module will
+  be called mca_53c9x.o.
+
 Always IN2000 SCSI support
 CONFIG_SCSI_IN2000
-  This is support for an ISA bus SCSI host adapter. You'll find more
-  information in drivers/scsi/in2000.readme. If it doesn't work out of
-  the box, you may have to change the jumpers for IRQ or address
-  selection. 
+  This is support for an ISA bus SCSI host adapter.  You'll find more
+  information in <file:drivers/scsi/README.in2000>. If it doesn't work
+  out of the box, you may have to change the jumpers for IRQ or
+  address selection.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called in2000.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called in2000.o.
 
 Initio 91XXU(W) SCSI support
 CONFIG_SCSI_INITIO
-  This is support for the Initio 91XXU(W) SCSI host adapter. Please
+  This is support for the Initio 91XXU(W) SCSI host adapter.  Please
   read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called initio.o
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called initio.o.
 
 PAS16 SCSI support
 CONFIG_SCSI_PAS16
-  This is support for a SCSI host adapter. It is explained in section
+  This is support for a SCSI host adapter.  It is explained in section
   3.10 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . If it doesn't work out
+  <http://www.linuxdoc.org/docs.html#howto>.  If it doesn't work out
   of the box, you may have to change some settings in
-  drivers/scsi/pas16.h.
-  
+  <file:drivers/scsi/pas16.h>.
+
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called pas16.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called pas16.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Initio INI-A100U2W SCSI support
 CONFIG_SCSI_INIA100
-  This is support for the Initio INI-A100U2W SCSI host adapter. Please
-  read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  This is support for the Initio INI-A100U2W SCSI host adapter.
+  Please read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
-  If you want to compile this as a module ( = code which can be 
+  If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called a100u2w.o
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called a100u2w.o.
 
 PCI2000 support
 CONFIG_SCSI_PCI2000
   This is support for the PCI2000I EIDE interface card which acts as a
-  SCSI host adapter. Please read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  SCSI host adapter.  Please read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module called pci2000.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 PCI2220i support
 CONFIG_SCSI_PCI2220I
   This is support for the PCI2220i EIDE interface card which acts as a
-  SCSI host adapter. Please read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  SCSI host adapter.  Please read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module called pci2220i.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 PSI240i support
 CONFIG_SCSI_PSI240I
   This is support for the PSI240i EIDE interface card which acts as a
-  SCSI host adapter. Please read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  SCSI host adapter.  Please read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module called psi240i.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 Qlogic FAS SCSI support
 CONFIG_SCSI_QLOGIC_FAS
@@ -6530,31 +7562,32 @@
   SCSI support"), below.
 
   Information about this driver is contained in
-  drivers/scsi/README.qlogicfas. You should also read the SCSI-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  <file:drivers/scsi/README.qlogicfas>.  You should also read the
+  SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called qlogicfas.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
-Qlogic ISP SCSI support (EXPERIMENTAL)
+Qlogic ISP SCSI support
 CONFIG_SCSI_QLOGIC_ISP
   This driver works for all QLogic PCI SCSI host adapters (IQ-PCI,
-  IQ-PCI-10, IQ_PCI-D) except for the PCI-basic card. (This latter
-  card is supported by the "AM53/79C974 PCI SCSI" driver). 
+  IQ-PCI-10, IQ_PCI-D) except for the PCI-basic card.  (This latter
+  card is supported by the "AM53/79C974 PCI SCSI" driver.)
 
   If you say Y here, make sure to choose "BIOS" at the question "PCI
   access mode".
 
-  Please read the file drivers/scsi/README.qlogicisp. You should also
-  read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  Please read the file <file:drivers/scsi/README.qlogicisp>.  You
+  should also read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called qlogicisp.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  The module will be called qlogicisp.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Qlogic ISP FC SCSI support
 CONFIG_SCSI_QLOGIC_FC
@@ -6562,8 +7595,8 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called qlogicfc.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  The module will be called qlogicfc.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Qlogic QLA 1280 SCSI support
 CONFIG_SCSI_QLOGIC_1280
@@ -6572,61 +7605,63 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called qla1280.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Seagate ST-02 and Future Domain TMC-8xx SCSI support
 CONFIG_SCSI_SEAGATE
   These are 8-bit SCSI controllers; the ST-01 is also supported by
-  this driver. It is explained in section 3.9 of the SCSI-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto . If it
+  this driver.  It is explained in section 3.9 of the SCSI-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.  If it
   doesn't work out of the box, you may have to change some settings in
-  drivers/scsi/seagate.h.
+  <file:drivers/scsi/seagate.h>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called seagate.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called seagate.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Trantor T128/T128F/T228 SCSI support
 CONFIG_SCSI_T128
   This is support for a SCSI host adapter. It is explained in section
   3.11 of the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . If it doesn't work out
+  <http://www.linuxdoc.org/docs.html#howto>.  If it doesn't work out
   of the box, you may have to change some settings in
-  drivers/scsi/t128.h. Note that Trantor was purchased by Adaptec, and
-  some former Trantor products are being sold under the Adaptec name.
+  <file:drivers/scsi/t128.h>.  Note that Trantor was purchased by
+  Adaptec, and some former Trantor products are being sold under the
+  Adaptec name.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called t128.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called t128.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 UltraStor SCSI support
 CONFIG_SCSI_ULTRASTOR
   This is support for the UltraStor 14F, 24F and 34F SCSI-2 host
-  adapter family. This driver is explained in section 3.12 of the
+  adapter family.  This driver is explained in section 3.12 of the
   SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . If it doesn't work out
+  <http://www.linuxdoc.org/docs.html#howto>.  If it doesn't work out
   of the box, you may have to change some settings in
-  drivers/scsi/ultrastor.h.
-  
+  <file:drivers/scsi/ultrastor.h>.
+
   Note that there is also another driver for the same hardware:
   "UltraStor 14F/34F support", above.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ultrastor.o. 
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ultrastor.o.
 
 7000FASST SCSI support
 CONFIG_SCSI_7000FASST
   This driver supports the Western Digital 7000 SCSI host adapter
-  family. Some information is in the source: drivers/scsi/wd7000.c.
+  family.  Some information is in the source:
+  <file:drivers/scsi/wd7000.c>.
 
   This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module will be called wd7000.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wd7000.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 ACARD SCSI support
 CONFIG_SCSI_ACARD
@@ -6635,40 +7670,41 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called atp870u.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support
 CONFIG_SCSI_EATA
-  This driver supports all EATA/DMA-compliant SCSI host adapters. DPT
-  ISA and all EISA i/o addresses are probed looking for the "EATA"
-  signature. If you chose "BIOS" at the question "PCI access mode",
+  This driver supports all EATA/DMA-compliant SCSI host adapters.  DPT
+  ISA and all EISA I/O addresses are probed looking for the "EATA"
+  signature.  If you chose "BIOS" at the question "PCI access mode",
   the addresses of all the PCI SCSI controllers reported by the PCI
   subsystem are probed as well.
 
-  You want to read the start of drivers/scsi/eata.c and the
+  You want to read the start of <file:drivers/scsi/eata.c> and the
   SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that there is also another driver for the same hardware
-  available: "EATA-DMA support". You should say Y to only one of them.
+  available: "EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti,
+  Alphatronix) support". You should say Y to only one of them.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called eata.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called eata.o.
 
-enable tagged command queuing
+enable tagged command queueing
 CONFIG_SCSI_EATA_TAGGED_QUEUE
   This is a feature of SCSI-2 which improves performance: the host
   adapter can send several SCSI commands to a device's queue even if
   previous commands haven't finished yet. Most EATA adapters negotiate
   this feature automatically with the device, even if your answer is
   N. The safe answer is N.
-        
+
 enable elevator sorting
 CONFIG_SCSI_EATA_LINKED_COMMANDS
-  This option enables elevator sorting for all probed SCSI disks and 
-  CDROMs. It definitely reduces the average seek distance when doing
+  This option enables elevator sorting for all probed SCSI disks and
+  CD-ROMs. It definitely reduces the average seek distance when doing
   random seeks, but this does not necessarily result in a noticeable
   performance improvement: your mileage may vary...
   The safe answer is N.
@@ -6684,21 +7720,21 @@
 
 NCR53c406a SCSI support
 CONFIG_SCSI_NCR53C406A
-  This is support for the NCR53c406a SCSI host adapter. For user
-  configurable parameters, check out drivers/scsi/NCR53c406.c in the
-  kernel source. Also read the SCSI-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  This is support for the NCR53c406a SCSI host adapter.  For user
+  configurable parameters, check out <file:drivers/scsi/NCR53c406.c>
+  in the kernel source.  Also read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called NCR53c406.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called NCR53c406.o.
 
-Symbios Logic sym53c416 support
+Symbios 53c416 SCSI support
 CONFIG_SCSI_SYM53C416
   This is support for the sym53c416 SCSI host adapter, the SCSI
   adapter that comes with some HP scanners. This driver requires that
-  the sym53c416 is configured first using some sort of pnp
+  the sym53c416 is configured first using some sort of PnP
   configuration program (e.g. isapnp) or by a PnP aware BIOS. If you
   are using isapnp then you need to compile this driver as a module
   and then load it using insmod after isapnp has run. The parameters
@@ -6710,8 +7746,8 @@
   There is support for up to four adapters. If you want to compile
   this driver as a module ( = code which can be inserted in and
   removed from the running kernel whenever you want), say M here and
-  read Documentation/modules.txt. The module will be called
-  sym53c416.o. 
+  read <file:Documentation/modules.txt>. The module will be called
+  sym53c416.o.
 
 Simple 53c710 SCSI support (Compaq, NCR machines)
 CONFIG_SCSI_SIM710
@@ -6720,46 +7756,46 @@
   More complex drivers for this chip are available ("NCR53c7,8xx SCSI
   support", above), but they require that the scsi chip be able to do
   DMA block moves between memory and on-chip registers, which can
-  cause problems under certain conditions. This driver is designed to
+  cause problems under certain conditions.  This driver is designed to
   avoid these problems and is intended to work with any Intel machines
   using 53c710 chips, including various Compaq and NCR machines.
 
   Please read the comments at the top of the file
-  drivers/scsi/sim710.c for more information.
+  <file:drivers/scsi/sim710.c> for more information.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called sim710.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sim710.o.
 
-Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support
+Tekram DC390(T) and Am53/79C974 SCSI support
 CONFIG_SCSI_DC390T
   This driver supports PCI SCSI host adapters based on the Am53C974A
   chip, e.g. Tekram DC390(T), DawiControl 2974 and some onboard
   PCscsi/PCnet (Am53/79C974) solutions.
 
-  Documentation can be found in drivers/scsi/README.tmscsim.
-  
+  Documentation can be found in <file:drivers/scsi/README.tmscsim>.
+
   Note that this driver does NOT support Tekram DC390W/U/F, which are
   based on NCR/Symbios chips. Use "NCR53C8XX SCSI support" for those.
   Also note that there is another generic Am53C974 driver,
-  "AM53/79C974 PCI SCSI support" below. You can pick either one.
+  "AM53/79C974 PCI SCSI support" below.  You can pick either one.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called tmscsim.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called tmscsim.o.
 
 Omit support for other Am53/79C974 based SCSI adapters
 CONFIG_SCSI_DC390T_NOGENSUPP
   If you say N here, the DC390(T) SCSI driver relies on the DC390
   EEPROM to get initial values for its settings, such as speed,
-  termination, etc. If it can't find this EEPROM, it will use defaults
-  or the user supplied boot/module parameters. For details on driver
-  configuration see drivers/scsi/README.tmscsim.
+  termination, etc.  If it can't find this EEPROM, it will use
+  defaults or the user supplied boot/module parameters.  For details
+  on driver configuration see <file:drivers/scsi/README.tmscsim>.
 
   If you say Y here and if no EEPROM is found, the driver gives up and
-  thus only supports Tekram DC390(T) adapters. This can be useful if
+  thus only supports Tekram DC390(T) adapters.  This can be useful if
   you have a DC390(T) and another Am53C974 based adapter, which, for
   some reason, you want to drive with the other AM53C974 driver.
 
@@ -6767,40 +7803,42 @@
 
 AM53/79C974 PCI SCSI support
 CONFIG_SCSI_AM53C974
-  This is support for the AM53/79C974 SCSI host adapters. Please read
-  drivers/scsi/README.AM53C974 for details. Also, the SCSI-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto , is for
-  you.
+  This is support for the AM53/79C974 SCSI host adapters.  Please read
+  <file:drivers/scsi/README.AM53C974> for details.  Also, the
+  SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>, is for you.
 
   Note that there is another driver for AM53C974 based adapters:
-  "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above. You
+  "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above.  You
   can pick either one.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called AM53C974.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called AM53C974.o.
 
 AMI MegaRAID support
 CONFIG_SCSI_MEGARAID
   This driver supports the AMI MegaRAID 418, 428, 438, 466, 762, 490
-  and 467 SCSI host adapters. 
+  and 467 SCSI host adapters.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called megaraid.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called megaraid.o.
 
-GDT SCSI Disk Array Controller support
+Intel/ICP (former GDT SCSI Disk Array) RAID Controller Support
 CONFIG_SCSI_GDTH
-  This is a driver for all SCSI Disk Array Controllers (EISA/ISA/PCI) 
-  manufactured by ICP vortex. It is documented in the kernel source in
-  drivers/scsi/gdth.c and drivers/scsi/gdth.h. 
+  Formerly called GDT SCSI Disk Array Controller Support.
+ 
+  This is a driver for RAID/SCSI Disk Array Controllers (EISA/ISA/PCI) 
+  manufactured by Intel/ICP vortex (an Intel Company). It is documented
+  in the kernel source in drivers/scsi/gdth.c and drivers/scsi/gdth.h. 
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 IOMEGA parallel port (ppa - older drives)
 CONFIG_SCSI_PPA
@@ -6817,17 +7855,17 @@
   newer drives)", below.
 
   For more information about this driver and how to use it you should
-  read the file drivers/scsi/README.ppa. You should also read the
-  SCSI-HOWTO, which is available from
-  http://www.linuxdoc.org/docs.html#howto . If you use this driver,
+  read the file <file:drivers/scsi/README.ppa>.  You should also read
+  the SCSI-HOWTO, which is available from
+  <http://www.linuxdoc.org/docs.html#howto>.  If you use this driver,
   you will still be able to use the parallel port for other tasks,
   such as a printer; it is safe to compile both drivers into the
   kernel.
 
   This driver is also available as a module which can be inserted in
-  and removed from the running kernel whenever you want. To compile
+  and removed from the running kernel whenever you want.  To compile
   this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called ppa.o. 
+  <file:Documentation/modules.txt>.  The module will be called ppa.o.
 
 IOMEGA parallel port (imm - newer drives)
 CONFIG_SCSI_IMM
@@ -6844,17 +7882,17 @@
   here and Y to "IOMEGA Parallel Port (ppa - older drives)", above.
 
   For more information about this driver and how to use it you should
-  read the file drivers/scsi/README.ppa. You should also read the
-  SCSI-HOWTO, which is available from
-  http://www.linuxdoc.org/docs.html#howto . If you use this driver,
+  read the file <file:drivers/scsi/README.ppa>.  You should also read
+  the SCSI-HOWTO, which is available from
+  <http://www.linuxdoc.org/docs.html#howto>.  If you use this driver,
   you will still be able to use the parallel port for other tasks,
   such as a printer; it is safe to compile both drivers into the
   kernel.
 
   This driver is also available as a module which can be inserted in
-  and removed from the running kernel whenever you want. To compile
+  and removed from the running kernel whenever you want.  To compile
   this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called imm.o. 
+  <file:Documentation/modules.txt>.  The module will be called imm.o.
 
 Force the Iomega ZIP drivers to use EPP-16
 CONFIG_SCSI_IZIP_EPP16
@@ -6866,7 +7904,7 @@
   so we have to control the state of the chipset's FIFO queue every
   now and then to avoid data loss. This will be done if you say Y
   here.
-  
+
   Generally, saying Y is the safe option and slows things down a bit.
 
 Assume slow parallel port control register
@@ -6881,67 +7919,7 @@
 
   Generally, saying N is fine.
 
-Parallel port SCSI device support
-CONFIG_PPSCSI
-  There are many external CD-ROM and disk devices that connect through
-  your computer's parallel port. Lots of them are actually SCSI
-  devices using a parallel port SCSI adapter. This option enables the
-  ppSCSI subsystem which contains drivers for many of these external
-  drives. You may also want to look at CONFIG_PARIDE (Parallel port
-  IDE device support).
-
-  If you built ppSCSI support into your kernel, you may still build
-  the individual protocol modules and high-level drivers as loadable
-  modules. If you build this support as a module, it will be called
-  ppscsi.o.
-
-  To use the ppSCSI support, you must say Y or M here and also to at
-  least one protocol driver (e.g. "Shuttle EPST adapter", "Iomega VPI0
-  adapter", "Shining ScarSCI adapter" etc.).
-
-Adaptec APA-348 adapter
-CONFIG_PPSCSI_T348
-  This option enables support for the APA-348 adapter from Adaptec
-  (also known as Trantor T348).  If you build this as a module it will
-  be called t348.o.
-
-Adaptec APA-358 adapter
-CONFIG_PPSCSI_T358
-  This option enables support for the APA-358 adapter from Adaptec
-  (also known as Trantor T358).  If you build this as a module it will
-  be called t358.o.
-
-Iomega VPI0 adapter
-CONFIG_PPSCSI_VPI0
-  This option enables support for the Iomega VPI0 adapter found in the
-  original ZIP-100 drives and the Jaz Traveller.  If you build this as
-  a module it will be called vpi0.o.
-
-OnSpec 90c26 adapter
-CONFIG_PPSCSI_ONSCSI
-  This option enables support for the OnSpec 90c26 in its SCSI adapter
-  mode.  If you build this as a module it will be called onscsi.o.
-
-Shining SparSCI adapter
-CONFIG_PPSCSI_SPARCSI
-  This option enables support for the WBS-11A parallel port SCSI
-  adapter.  This adapter has been marketed by LinkSys as the
-  "ParaSCSI+" and by Shining Technologies as the "SparCSI".  If you
-  build this as a module it will be called sparcsi.o.
-
-Shuttle EPSA-2 adapter
-CONFIG_PPSCSI_EPSA2
-  This option enables support for the Shuttle Technologies EPSA2
-  parallel port SCSI adapter.  EPAS2 is a predecessor to the EPST.  If
-  you build this as a module it will be called epsa2.o.
-
-Shuttle EPST adapter
-CONFIG_PPSCSI_EPST
-  This option enables support for the Shuttle Technologies EPST
-  parallel port SCSI adapter.  If you build this as a module is will
-  be called epst.o.
-
-SCSI Debug host simulator. (EXPERIMENTAL)
+SCSI debugging host simulator
 CONFIG_SCSI_DEBUG
   This is a host adapter simulator that can be programmed to simulate
   a large number of conditions that could occur on a real bus. The
@@ -6950,7 +7928,7 @@
   important data. This is primarily of use to people trying to debug
   the middle and upper layers of the SCSI subsystem. If unsure, say N.
 
-Fibre Channel support and FC4 SCSI support
+Fibre Channel and FC4 SCSI support
 CONFIG_FC4
   Fibre Channel is a high speed serial protocol mainly used to
   connect large storage devices to the computer; it is compatible with
@@ -6966,7 +7944,7 @@
 
   If unsure, say N.
 
-Sun SOC
+Sun SOC/Sbus
 CONFIG_FC4_SOC
   Serial Optical Channel is an interface card with one or two Fibre
   Optic ports, each of which can be connected to a disk array. Note
@@ -6976,7 +7954,7 @@
   This support is also available as a module called soc.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Sun SOC+ (aka SOCAL)
 CONFIG_FC4_SOCAL
@@ -6989,16 +7967,16 @@
   This support is also available as a module called socal.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 SparcSTORAGE Array 100 and 200 series
 CONFIG_SCSI_PLUTO
-  If you never bought a disk array made by Sun, go with N. 
+  If you never bought a disk array made by Sun, go with N.
 
   This support is also available as a module called pluto.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Sun Enterprise Network Array (A5000 and EX500)
 CONFIG_SCSI_FCAL
@@ -7010,14 +7988,14 @@
   This support is also available as a module called fcal.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt. If unsure, say N.
+  here and read <file:Documentation/modules.txt>. If unsure, say N.
 
-AcornSCSI support
+Acorn SCSI card (aka30) support
 CONFIG_SCSI_ACORNSCSI_3
   This enables support for the Acorn SCSI card (aka30). If you have an
   Acorn system with one of these, say Y. If unsure, say N.
 
-Acorn SCSI tagged queue support
+Support SCSI 2 Tagged queueing
 CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
   Say Y here to enable tagged queuing support on the Acorn SCSI card.
 
@@ -7026,7 +8004,7 @@
   previous commands haven't finished yet. Some SCSI devices don't
   implement this properly, so the safe answer is N.
 
-Acorn SCSI Synchronous transfers support
+Support SCSI 2 Synchronous Transfers
 CONFIG_SCSI_ACORNSCSI_SYNC
   Say Y here to enable synchronous transfer negotiation with all
   targets on the Acorn SCSI card.
@@ -7034,6 +8012,16 @@
   In general, this improves performance; however some SCSI devices
   don't implement it properly, so the safe answer is N.
 
+ARXE SCSI support
+CONFIG_SCSI_ARXESCSI
+  Around 1991, Arxe Systems Limited released a high density floppy
+  disc interface for the Acorn Archimedes range, to allow the use of
+  HD discs from the then new A5000 on earlier models. This interface
+  was either sold on its own or with an integral SCSI controller.
+  Technical details on this NCR53c94-based device are available at
+  <http://www.cryton.demon.co.uk/acornbits/scsi_arxe.html>
+  Say Y here to compile in support for the SCSI controller.
+
 Oak SCSI support
 CONFIG_SCSI_OAK1
   This enables support for the Oak SCSI card. If you have an Acorn
@@ -7044,7 +8032,7 @@
   This enables support for the Cumana SCSI I card. If you have an
   Acorn system with one of these, say Y. If unsure, say N.
 
-Cumana SCSI II support (EXPERIMENTAL)
+Cumana SCSI II support
 CONFIG_SCSI_CUMANA_2
   This enables support for the Cumana SCSI II card. If you have an
   Acorn system with one of these, say Y. If unsure, say N.
@@ -7055,17 +8043,17 @@
   in the Econet socket. If you have an Acorn system with one of these,
   say Y. If unsure, say N.
 
-EESOX SCSI support (EXPERIMENTAL)
+EESOX SCSI support
 CONFIG_SCSI_EESOXSCSI
   This enables support for the EESOX SCSI card. If you have an Acorn
   system with one of these, say Y, otherwise say N.
 
-Powertec SCSI support (EXPERIMENTAL)
+PowerTec SCSI support
 CONFIG_SCSI_POWERTECSCSI
   This enables support for the Powertec SCSI card on Acorn systems. If
   you have one of these, say Y. If unsure, say N.
 
-IEEE 1394 (aka FireWire) support
+IEEE 1394 (FireWire) support
 CONFIG_IEEE1394
   IEEE 1394 describes a high performance serial bus, which is also
   known as FireWire(tm) or i.Link(tm) and is used for connecting all
@@ -7078,10 +8066,10 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ieee1394.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ieee1394.o.
 
-TI PCILynx IEEE 1394 support
+Texas Instruments PCILynx support
 CONFIG_IEEE1394_PCILYNX
   Say Y here if you have an IEEE-1394 controller with the Texas
   Instruments PCILynx chip.  Note: this driver is written for revision
@@ -7089,8 +8077,8 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called pcilynx.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called pcilynx.o.
 
 Use local RAM on PCILynx board
 CONFIG_IEEE1394_PCILYNX_LOCALRAM
@@ -7100,7 +8088,7 @@
   computer's motherboard. Local RAM may speed up command processing
   because no PCI transfers are necessary during use of the Packet
   Control Lists.
-  
+
   Note that there are no known PCILynx systems providing local RAM
   except for the evaluation boards by Texas Instruments and that the
   PCILynx does not reliably report missing RAM. This means that it is
@@ -7114,32 +8102,43 @@
   This option enables driver code to access the RAM, ROM and AUX ports
   of the PCILynx through character devices in /dev.  If you don't know
   what this is about then you won't need it.
-  
+
   If unsure, say N.
 
+#Adaptec AIC-5800 IEEE 1394 support
+#CONFIG_IEEE1394_AIC5800
+#  Say Y here if you have a IEEE 1394 controller using the Adaptec
+#  AIC-5800 chip.  All Adaptec host adapters (89xx series) use this
+#  chip, as well as miro's DV boards.
+#
+#  If you want to compile this as a module ( = code which can be
+#  inserted in and removed from the running kernel whenever you want),
+#  say M here and read <file:Documentation/modules.txt>.  The module
+#  will be called aic5800.o.
+#
 OHCI-1394 support
 CONFIG_IEEE1394_OHCI1394
   Enable this driver if you have an IEEE 1394 controller based on the
   OHCI-1394 specification. The current driver is only tested with OHCI
   chipsets made by Texas Instruments and NEC. Most third-party vendors
-  use one of these chipsets. It should work with any OHCI-1394 compliant
-  card, however.
+  use one of these chipsets.  It should work with any OHCI-1394
+  compliant card, however.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ohci1394.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ohci1394.o.
 
 OHCI-1394 Video support
 CONFIG_IEEE1394_VIDEO1394
-  This option enables video device usage for OHCI-1394 cards. Enable this
-  option only if you have an IEEE 1394 video device connected to an
-  OHCI-1394 card.
+  This option enables video device usage for OHCI-1394 cards.  Enable
+  this option only if you have an IEEE 1394 video device connected to
+  an OHCI-1394 card.
 
 SBP-2 support (Harddisks etc.)
 CONFIG_IEEE1394_SBP2
-  This option enables you to use SBP-2 devices connected to your IEEE 1394
-  bus. SBP-2 devices include harddrives and DVD devices.
+  This option enables you to use SBP-2 devices connected to your IEEE
+  1394 bus.  SBP-2 devices include harddrives and DVD devices.
 
 Raw IEEE 1394 I/O support
 CONFIG_IEEE1394_RAWIO
@@ -7150,8 +8149,8 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called raw1394.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called raw1394.o.
 
 Excessive debugging output
 CONFIG_IEEE1394_VERBOSEDEBUG
@@ -7164,18 +8163,18 @@
   Say Y if you really want or need the debugging output, everyone else
   says N.
 
-Network device support?
+Network device support
 CONFIG_NETDEVICES
   You can say N here if you don't intend to connect your Linux box to
   any other computer at all or if all your connections will be over a
   telephone line with a modem either via UUCP (UUCP is a protocol to
   forward mail and news between unix hosts over telephone lines; read
   the UUCP-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto ) or dialing up a shell
+  <http://www.linuxdoc.org/docs.html#howto>) or dialing up a shell
   account or a BBS, even using term (term is a program which gives you
   almost full Internet connectivity if you have a regular dial up
   shell account on some Internet connected Unix computer. Read
-  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html ).
+  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
 
   You'll have to say Y if your computer contains a network card that
   you want to use under Linux (make sure you know its name because you
@@ -7191,7 +8190,7 @@
 
   Make sure to read the NET-3-HOWTO. Eventually, you will have to read
   Olaf Kirch's excellent and free book "Network Administrator's
-  Guide", to be found in http://www.linuxdoc.org/docs.html#guide . If
+  Guide", to be found in <http://www.linuxdoc.org/docs.html#guide>. If
   unsure, say Y.
 
 Dummy net driver support
@@ -7204,14 +8203,15 @@
   thing often comes in handy, the default is Y. It won't enlarge your
   kernel either. What a deal. Read about it in the Network
   Administrator's Guide, available from
-  http://www.linuxdoc.org/docs.html#guide .
+  <http://www.linuxdoc.org/docs.html#guide>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called dummy.o. If you want to use more than one dummy device at a
-  time, you need to compile this driver as a module. Instead of
-  'dummy', the devices will then be called 'dummy0', 'dummy1' etc.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called dummy.o.  If you want to use more than one dummy
+  device at a time, you need to compile this driver as a module.
+  Instead of 'dummy', the devices will then be called 'dummy0',
+  'dummy1' etc.
 
 Bonding driver support
 CONFIG_BONDING
@@ -7219,7 +8219,7 @@
   Channels together. This is called 'Etherchannel' by Cisco,
   'Trunking' by Sun, and 'Bonding' in Linux.
 
-  If you have two ethernet connections to some other computer, you can
+  If you have two Ethernet connections to some other computer, you can
   make them behave like one double speed connection using this driver.
   Naturally, this has to be supported at the other end as well, either
   with a similar Bonding Linux driver, a Cisco 5500 switch or a
@@ -7230,8 +8230,8 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called bonding.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bonding.o.
 
 SLIP (serial line) support
 CONFIG_SLIP
@@ -7247,23 +8247,23 @@
   Normally, your access provider has to support SLIP in order for you
   to be able to use it, but there is now a SLIP emulator called SLiRP
   around (available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/system/network/serial/ ) which
+  <ftp://metalab.unc.edu/pub/Linux/system/network/serial/>) which
   allows you to use SLIP over a regular dial up shell connection. If
   you plan to use SLiRP, make sure to say Y to CSLIP, below. The
   NET-3-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , explains how to
+  <http://www.linuxdoc.org/docs.html#howto>, explains how to
   configure SLIP. Note that you don't need this option if you just
   want to run term (term is a program which gives you almost full
   Internet connectivity if you have a regular dial up shell account on
   some Internet connected Unix computer. Read
-  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html ). SLIP
+  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>). SLIP
   support will enlarge your kernel by about 4 KB. If unsure, say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  slip.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>. The module will be
+  called slip.o.
 
 CSLIP compressed headers
 CONFIG_SLIP_COMPRESSED
@@ -7272,10 +8272,10 @@
   on both ends. Ask your access provider if you are not sure and
   answer Y, just in case. You will still be able to use plain SLIP. If
   you plan to use SLiRP, the SLIP emulator (available from
-  ftp://metalab.unc.edu/pub/Linux/system/network/serial/ ) which
+  <ftp://metalab.unc.edu/pub/Linux/system/network/serial/>) which
   allows you to use SLIP over a regular dial up shell connection, you
   definitely want to say Y here. The NET-3-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , explains how to configure
+  <http://www.linuxdoc.org/docs.html#howto>, explains how to configure
   CSLIP. This won't enlarge your kernel.
 
 Keepalive and linefill
@@ -7296,24 +8296,24 @@
 
 PPP (point-to-point protocol) support
 CONFIG_PPP
-  PPP (Point to Point Protocol) is a newer and better SLIP. It serves
+  PPP (Point to Point Protocol) is a newer and better SLIP.  It serves
   the same purpose: sending Internet traffic over telephone (and other
-  serial) lines. Ask your access provider if they support it, because
-  otherwise you can't use it; most internet access providers these
+  serial) lines.  Ask your access provider if they support it, because
+  otherwise you can't use it; most Internet access providers these
   days support PPP rather than SLIP.
 
   To use PPP, you need an additional program called pppd as described
-  in Documentation/networking/ppp.txt and in the PPP-HOWTO, available
-  at http://www.linuxdoc.org/docs.html#howto . If you upgrade
-  from an older kernel, you might need to upgrade pppd as well. The
-  PPP option enlarges your kernel by about 16 KB.
+  in the PPP-HOWTO, available at
+  <http://www.linuxdoc.org/docs.html#howto>.  Make sure that you have
+  the version of pppd recommended in <file:Documentation/Changes>.
+  The PPP option enlarges your kernel by about 16 KB.
 
   There are actually two versions of PPP: the traditional PPP for
   asynchronous lines, such as regular analog phone lines, and
   synchronous PPP which can be used over digital ISDN lines for
-  example. If you want to use PPP over phone lines or other
+  example.  If you want to use PPP over phone lines or other
   asynchronous serial lines, you need to say Y (or M) here and also to
-  the next option, "PPP support for async serial ports". For PPP over
+  the next option, "PPP support for async serial ports".  For PPP over
   synchronous lines, you should say Y (or M) here and to "Support
   synchronous PPP", below.
 
@@ -7321,12 +8321,12 @@
   inserted in and removed from the running kernel whenever you want).
   If you said Y to "Version information on all symbols" above, then
   you cannot compile the PPP driver into the kernel; you can then only
-  compile it as a module. The module will be called ppp_generic.o. If
-  you want to compile it as a module, say M here and read
-  Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  compile it as a module.  The module will be called ppp_generic.o.
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.
 
-PPP multilink support (EXPERIMENTAL)
+PPP multilink support
 CONFIG_PPP_MULTILINK
   PPP multilink is a protocol (defined in RFC 1990) which allows you
   to combine several (logical or physical) lines into one logical PPP
@@ -7337,7 +8337,7 @@
 
   If unsure, say N.
 
-PPP filtering (EXPERIMENTAL)
+PPP filtering
 CONFIG_PPP_FILTER
   Say Y here if you want to be able to filter the packets passing over
   PPP interfaces.  This allows you to control which packets count as
@@ -7357,7 +8357,7 @@
 
   This code is also available as a module (code which can be inserted
   into and removed from the running kernel).  If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  it as a module, say M here and read <file:Documentation/modules.txt>.
 
   If unsure, say Y.
 
@@ -7369,20 +8369,22 @@
 
   This code is also available as a module (code which can be inserted
   into and removed from the running kernel).  If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
 
 PPP Deflate compression
 CONFIG_PPP_DEFLATE
   Support for the Deflate compression method for PPP, which uses the
   Deflate algorithm (the same algorithm that gzip uses) to compress
-  each PPP packet before it is sent over the wire. The machine at the
+  each PPP packet before it is sent over the wire.  The machine at the
   other end of the PPP link (usually your ISP) has to support the
-  Deflate compression method as well for this to be useful. Even if
+  Deflate compression method as well for this to be useful.  Even if
   they don't support it, it is safe to say Y here.
 
   This code is also available as a module (code which can be inserted
   into and removed from the running kernel).  If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
 
 PPP BSD-Compress compression
 CONFIG_PPP_BSDCOMP
@@ -7401,14 +8403,14 @@
   module; it is called bsd_comp.o and will show up in the directory
   modules once you have said "make modules". If unsure, say N.
 
-PPP over Ethernet (EXPERIMENTAL)
+PPP over Ethernet
 CONFIG_PPPOE
   Support for PPP over Ethernet.
 
   This driver requires a specially patched pppd daemon.  The patch to
   pppd, along with binaries of a patched pppd package can be found at:
-  http://www.shoshin.uwaterloo.ca/~mostrows
- 
+  <http://www.shoshin.uwaterloo.ca/~mostrows>.
+
 Wireless LAN (non-hamradio)
 CONFIG_NET_RADIO
   Support for wireless LANs and everything having to do with radio,
@@ -7425,18 +8427,18 @@
   driver (or Linux). If you wish to use Wireless Extensions with
   wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch
   the tools from
-  http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html .
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
 
   Some user-level drivers for scarab devices which don't require
   special kernel support are available from
-  ftp://shadow.cabi.net/pub/Linux .
+  <ftp://shadow.cabi.net/pub/Linux>.
 
 STRIP (Metricom Starmode radio IP)
 CONFIG_STRIP
   Say Y if you have a Metricom radio and intend to use Starmode Radio
   IP. STRIP is a radio protocol developed for the MosquitoNet project
-  (on the WWW at http://mosquitonet.stanford.edu/ ) to send Internet
-  traffic using Metricom radios. Metricom radios are small, battery
+  (on the WWW at <http://mosquitonet.stanford.edu/>) to send Internet
+  traffic using Metricom radios.  Metricom radios are small, battery
   powered, 100kbit/sec packet radio transceivers, about the size and
   weight of a cellular telephone. (You may also have heard them called
   "Metricom modems" but we avoid the term "modem" because it misleads
@@ -7447,50 +8449,51 @@
   it is obviously most useful for people with laptop computers. If you
   think you might get a Metricom radio in the future, there is no harm
   in saying Y to STRIP now, except that it makes the kernel a bit
-  bigger. 
+  bigger.
 
   You can also compile this as a module ( = code which can be inserted
   in and removed from the running kernel whenever you want), say M
-  here and read Documentation/modules.txt. The module will be called
-  strip.o.
+  here and read <file:Documentation/modules.txt>.  The module will be
+  called strip.o.
 
 AT&T WaveLAN & DEC RoamAbout DS support
 CONFIG_WAVELAN
   The Lucent WaveLAN (formerly NCR and AT&T; or DEC RoamAbout DS) is
   a Radio LAN (wireless Ethernet-like Local Area Network) using the
   radio frequencies 900 MHz and 2.4 GHz.
-  
-  This driver support the ISA version of the WaveLAN card. A separate
+
+  This driver support the ISA version of the WaveLAN card.  A separate
   driver for the PCMCIA (PC-card) hardware is available in David
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for
-  location).
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).
 
   If you want to use an ISA WaveLAN card under Linux, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Some more specific
-  information is contained in Documentation/networking/wavelan.txt and
-  in the source code drivers/net/wavelan.p.h.
+  <http://www.linuxdoc.org/docs.html#howto>. Some more specific
+  information is contained in
+  <file:Documentation/networking/wavelan.txt> and in the source code
+  <file:drivers/net/wavelan.p.h>.
 
   You will also need the wireless tools package available from
-  http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html .
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
   Please read the man pages contained therein.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called wavelan.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called wavelan.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 Aironet Arlan 655 & IC2200 DS support
 CONFIG_ARLAN
   Aironet makes Arlan, a class of wireless LAN adapters. These use the
   www.Telxon.com chip, which is also used on several similar cards.
   This driver is tested on the 655 and IC2200 series cards. Look at
-  http://www.ylenurme.ee/~elmer/655/ for the latest information.
-  
+  <http://www.ylenurme.ee/~elmer/655/> for the latest information.
+
   The driver is built as two modules, arlan and arlan-proc. The latter
   is the /proc interface and is not needed most of time.
-  
+
   On some computers the card ends up in non-valid state after some
   time. Use a ping-reset script to clear it.
 
@@ -7499,27 +8502,27 @@
   www.aironet.com (recently bought by Cisco) makes these 802.11 DS
   adapters.  Driver by Elmer Joandi (elmer@ylenurme.ee).
 
-  Say Y here if you have such an adapter, and then say Y below to 
-  the option that applies to your particular type of card (PCI, ISA, 
+  Say Y here if you have such an adapter, and then say Y below to
+  the option that applies to your particular type of card (PCI, ISA,
   or PCMCIA).
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_core.o. If you want to 
-  compile it as a module, say M here and read 
-  Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called aironet4500_core.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.
 
-  quick config parameters: 
+  quick config parameters:
 	SSID=tsunami - "The Password"
 	adhoc=1  	there are no Access Points around
-	master=1 	Adhoc master (the one who creates network 
+	master=1 	Adhoc master (the one who creates network
                         sync)
-	slave=1		Adhoc slave (btw, it is still forming own net 
+	slave=1		Adhoc slave (btw, it is still forming own net
 			sometimes, and has problems with firmware...
 			change IbssJoinNetTimeout from /proc...)
 	channel=1..? 	meaningful in adhoc mode
-  
+
   If you have problems with screwing up card, both_bap_lock=1 is a
   conservative value (performance hit 15%).
 
@@ -7527,107 +8530,107 @@
 
 Aironet 4500/4800 ISA/PCI/PNP/365 support
 CONFIG_AIRONET4500_NONCS
-  If you have an ISA, PCI or PCMCIA Aironet 4500/4800 wireless LAN 
-  card, say Y here, and then also to the options below that apply 
+  If you have an ISA, PCI or PCMCIA Aironet 4500/4800 wireless LAN
+  card, say Y here, and then also to the options below that apply
   to you.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_card.o. If you want to 
-  compile it as a module, say M here and read 
-  Documentation/modules.txt
+  The module will be called aironet4500_card.o.  If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
 
 Aironet 4500/4800 PNP support
 CONFIG_AIRONET4500_PNP
-  If you have an ISA Aironet 4500/4800 card which you want to use in 
-  PNP (Plug and Play) mode, say Y here. This is the recommended mode
-  for ISA cards. Remember however to enable the PNP jumper on the
+  If you have an ISA Aironet 4500/4800 card which you want to use in
+  PnP (Plug and Play) mode, say Y here. This is the recommended mode
+  for ISA cards. Remember however to enable the PnP jumper on the
   board if you say Y here.
 
 Aironet 4500/4800 PCI support
 CONFIG_AIRONET4500_PCI
   If you have an PCI Aironet 4500/4800 card, say Y here.
 
-Aironet 4500/4800 ISA broken support (EXPERIMENTAL)
+Aironet 4500/4800 ISA broken support
 CONFIG_AIRONET4500_ISA
   If you have an ISA Aironet 4500/4800 card which you want to run in
-  non-PNP mode, say Y here. This is not recommended and does not work
+  non-PnP mode, say Y here. This is not recommended and does not work
   correctly at this point. Say N.
 
-Aironet 4500/4800 I365 broken support (EXPERIMENTAL)
+Aironet 4500/4800 I365 broken support
 CONFIG_AIRONET4500_I365
-  If you have a PCMCIA Aironet 4500/4800 card which you want to use 
-  without the standard PCMCIA cardservices provided by the pcmcia-cs 
+  If you have a PCMCIA Aironet 4500/4800 card which you want to use
+  without the standard PCMCIA cardservices provided by the pcmcia-cs
   package, say Y here. This is not recommended, so say N.
 
 Aironet 4500/4800 PCMCIA support
 CONFIG_AIRONET4500_CS
-  Say Y here if you have a PCMCIA Aironet 4500/4800 card which you 
+  Say Y here if you have a PCMCIA Aironet 4500/4800 card which you
   want to use with the standard PCMCIA cardservices provided by the
   pcmcia-cs package.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_cs.o. If you want to 
-  compile it as a module, say M here and read 
-  Documentation/modules.txt.
-	
+  The module will be called aironet4500_cs.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
 Aironet 4500/4800 PROC interface
 CONFIG_AIRONET4500_PROC
-  If you say Y here (and to the "/proc file system" below), you will 
-  be able to configure your Aironet card via the 
+  If you say Y here (and to the "/proc file system" below), you will
+  be able to configure your Aironet card via the
   /proc/sys/aironet4500 interface.
 
-  Additional info: look in drivers/net/aironet4500_rids.c.
+  Additional info: look in <file:drivers/net/aironet4500_rid.c>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_proc.o. If you want to 
-  compile it as a module, say M here and read 
-  Documentation/modules.txt.
+  The module will be called aironet4500_proc.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
 
   NOTE: the proc interface uses a lot of memory, so it is recommended
-        to compile it as a module and remove the module after 
+        to compile it as a module and remove the module after
         configuration.
 
 LAPB over Ethernet driver
 CONFIG_LAPBETHER
   This is a driver for a pseudo device (typically called /dev/lapb0)
   which allows you to open an LAPB point-to-point connection to some
-  other computer on your Ethernet network. In order to do this, you
+  other computer on your Ethernet network.  In order to do this, you
   need to say Y or M to the driver for your Ethernet card as well as
-  to "LAPB Data Link Driver". 
+  to "LAPB Data Link Driver".
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called lapbether.o. If unsure, say N.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called lapbether.o.  If unsure, say N.
 
 X.25 async driver
 CONFIG_X25_ASY
   This is a driver for sending and receiving X.25 frames over regular
   asynchronous serial lines such as telephone lines equipped with
-  ordinary modems. Experts should note that this driver doesn't
+  ordinary modems.  Experts should note that this driver doesn't
   currently comply with the asynchronous HDLS framing protocols in
-  CCITT recommendation X.25. 
+  CCITT recommendation X.25.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called x25_asy.o. If unsure, say N.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called x25_asy.o.  If unsure, say N.
 
 PCMCIA network device support
 CONFIG_NET_PCMCIA
   Say Y if you would like to include support for any PCMCIA or CardBus
   network adapters, then say Y to the driver for your particular card
-  below. PCMCIA- or PC-cards are credit-card size devices often used
+  below.  PCMCIA- or PC-cards are credit-card size devices often used
   with laptops computers; CardBus is the newer and faster version of
-  PCMCIA. 
+  PCMCIA.
 
   To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for
-  location). You also want to check out the PCMCIA-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   If unsure, say N.
 
@@ -7638,9 +8641,9 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c589_cs.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called 3c589_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>. If
+  unsure, say N.
 
 3Com 3c574 PCMCIA support
 CONFIG_PCMCIA_3C574
@@ -7649,9 +8652,9 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c574_cs.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called 3c574_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
 
 Fujitsu FMV-J18x PCMCIA support
 CONFIG_PCMCIA_FMVJ18X
@@ -7660,9 +8663,9 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called fmvj18x_cs.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called fmvj18x_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 NE2000 compatible PCMCIA support
 CONFIG_PCMCIA_PCNET
@@ -7671,9 +8674,9 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called pcnet_cs.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called pcnet_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>. If
+  unsure, say N.
 
 New Media PCMCIA support
 CONFIG_PCMCIA_NMCLAN
@@ -7682,9 +8685,9 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called nmclan_cs.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called nmclan_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
 
 SMC 91Cxx PCMCIA support
 CONFIG_PCMCIA_SMC91C92
@@ -7693,20 +8696,20 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called smc91c92_cs.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt. If
-  unsure, say N.
+  The module will be called smc91c92_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 Xircom 16-bit PCMCIA support
 CONFIG_PCMCIA_XIRC2PS
-  Say Y here if you intend to attach a Xircom 16-bit PCMCIA
-  (PC-card) Ethernet or Fast Ethernet card to your computer.
+  Say Y here if you intend to attach a Xircom 16-bit PCMCIA (PC-card)
+  Ethernet or Fast Ethernet card to your computer.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called xirc2ps_cs.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called xirc2ps_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 COM20020 ARCnet PCMCIA support
 CONFIG_ARCNET_COM20020_CS
@@ -7715,20 +8718,20 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called com20020_cs.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt. If
-  unsure, say N.
+  The module will be called com20020_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 IBM PCMCIA Token Ring adapter support
 CONFIG_PCMCIA_IBMTR
   Say Y here if you intend to attach this type of Token Ring PCMCIA
   card to your computer. You then also need to say Y to "Token Ring
-  driver support". 
+  driver support".
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ibmtr_cs.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  The module will be called ibmtr_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Xircom Tulip-like CardBus support
 CONFIG_PCMCIA_XIRTULIP
@@ -7739,20 +8742,20 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called xircom_tulip_cb.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. If
-  unsure, say N.
+  The module will be called xircom_tulip_cb.o.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. If unsure, say N.
 
-Pcmcia Wireless LAN
+PCMCIA Wireless LAN
 CONFIG_NET_PCMCIA_RADIO
   Say Y here if you would like to use a PCMCIA (PC-card) device to
   connect to a wireless local area network. Then say Y to the driver
   for your particular card below.
 
   To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for
-  location). You also want to check out the PCMCIA-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location). You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
 Hermes chipset 802.11b support (Orinoco/Prism2/Symbol cards)
 CONFIG_HERMES
@@ -7772,7 +8775,7 @@
 
   You will also very likely also need the Wireless Tools in order to
   configure your card and that /etc/pcmcia/wireless.opts works :
-    http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>
 
 Apple Airport support (built-in)
 CONFIG_APPLE_AIRPORT
@@ -7796,24 +8799,24 @@
 CONFIG_PCMCIA_HERMES
   A driver for "Hermes" chipset based PCMCIA wireless adaptors, such
   as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/
-  EnteraSys RoamAbout 802.11, ELSA Airlancer, Melco Buffalo and others).
-  It should also be usable on various Prism II based cards such as the
-  Linksys, D-Link and Farallon Skyline. It should also work on Symbol
-  cards such as the 3Com AirConnect and Ericsson WLAN.
+  EnteraSys RoamAbout 802.11, ELSA Airlancer, Melco Buffalo and
+  others).  It should also be usable on various Prism II based cards
+  such as the Linksys, D-Link and Farallon Skyline.  It should also
+  work on Symbol cards such as the 3Com AirConnect and Ericsson WLAN.
 
   To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for
-  location). You also want to check out the PCMCIA-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   You will also very likely also need the Wireless Tools in order to
-  configure your card and that /etc/pcmcia/wireless.opts works :
-    http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
+  configure your card and that /etc/pcmcia/wireless.opts works:
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
 
 Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards
 CONFIG_AIRO
-  This is the standard Linux driver to support Cisco/Aironet ISA
-  and PCI 802.11 wireless cards.
+  This is the standard Linux driver to support Cisco/Aironet ISA and
+  PCI 802.11 wireless cards.
   It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X
   - with or without encryption) as well as card before the Cisco
   aquisition (Aironet 4500, Aironet 4800, Aironet 4800B).
@@ -7827,7 +8830,7 @@
 Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards
 CONFIG_AIRO_CS
   This is the standard Linux driver to support Cisco/Aironet PCMCIA
-  802.11 wireless cards. This driver is the same as the Aironet
+  802.11 wireless cards.  This driver is the same as the Aironet
   driver part of the Linux Pcmcia package.
   It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X
   - with or without encryption) as well as card before the Cisco
@@ -7840,22 +8843,28 @@
   Cisco Linux utilities can be used to configure the card.
 
   To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file Documentation/Changes for
-  location). You also want to check out the PCMCIA-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
 Aviator/Raytheon 2.4MHz wireless support
 CONFIG_PCMCIA_RAYCS
   Say Y here if you intend to attach an Aviator/Raytheon PCMCIA
   (PC-card) wireless Ethernet networking card to your computer.
-  Please read the file Documentation/networking/ray_cs.txt for
+  Please read the file <file:Documentation/networking/ray_cs.txt> for
   details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ray_cs.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called ray_cs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+Apple Airport support (built-in)
+CONFIG_APPLE_AIRPORT
+  Say Y here to support the Airport 802.11b wireless Ethernet hardware
+  built into the Macintosh iBook and other recent PowerPC-based
+  Macintosh machines.
 
 Xircom Netwave AirSurfer wireless support
 CONFIG_PCMCIA_NETWAVE
@@ -7864,9 +8873,9 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called netwave_cs.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called netwave_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 AT&T/Lucent Wavelan wireless support
 CONFIG_PCMCIA_WAVELAN
@@ -7876,44 +8885,45 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called wavelan_cs.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called wavelan_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
 
 PLIP (parallel port) support
 CONFIG_PLIP
   PLIP (Parallel Line Internet Protocol) is used to create a
   reasonably fast mini network consisting of two (or, rarely, more)
-  local machines. A PLIP link from a Linux box is a popular means to
-  install a Linux distribution on a machine which doesn't have a CDROM
-  drive (a minimal system has to be transferred with floppies first).
-  The kernels on both machines need to have this PLIP option enabled
-  for this to work.
-
-  The PLIP driver has two modes, mode 0 and mode 1. The parallel ports
-  (the connectors at the computers with 25 holes) are connected with
-  "null printer" or "Turbo Laplink" cables which can transmit 4 bits
-  at a time (mode 0) or with special PLIP cables, to be used on
+  local machines.  A PLIP link from a Linux box is a popular means to
+  install a Linux distribution on a machine which doesn't have a
+  CD-ROM drive (a minimal system has to be transferred with floppies
+  first). The kernels on both machines need to have this PLIP option
+  enabled for this to work.
+
+  The PLIP driver has two modes, mode 0 and mode 1.  The parallel
+  ports (the connectors at the computers with 25 holes) are connected
+  with "null printer" or "Turbo Laplink" cables which can transmit 4
+  bits at a time (mode 0) or with special PLIP cables, to be used on
   bidirectional parallel ports only, which can transmit 8 bits at a
   time (mode 1); you can find the wiring of these cables in
-  Documentation/networking/PLIP.txt. The cables can be up to 15m long.
-  Mode 0 works also if one of the machines runs DOS/Windows and has
-  some PLIP software installed, e.g. the Crynwr PLIP packet driver
-  (http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html ) and
-  winsock or NCSA's telnet.
+  <file:Documentation/networking/PLIP.txt>.  The cables can be up to
+  15m long.  Mode 0 works also if one of the machines runs DOS/Windows
+  and has some PLIP software installed, e.g. the Crynwr PLIP packet
+  driver (<http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html>)
+  and winsock or NCSA's telnet.
 
   If you want to use PLIP, say Y and read the PLIP mini-HOWTO as well
   as the NET-3-HOWTO, both available from
-  http://www.linuxdoc.org/docs.html#howto . Note that the PLIP
+  <http://www.linuxdoc.org/docs.html#howto>.  Note that the PLIP
   protocol has been changed and this PLIP driver won't work together
-  with the PLIP support in Linux versions 1.0.x. This option enlarges
+  with the PLIP support in Linux versions 1.0.x.  This option enlarges
   your kernel by about 8 KB.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  plip.o. If unsure, say Y or M, in case you buy a laptop later.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called plip.o.  If unsure, say Y or M, in case you buy a laptop
+  later.
 
 EQL (serial line load balancing) support
 CONFIG_EQUALIZER
@@ -7921,39 +8931,41 @@
   usually requires two modems and two telephone lines) and you use
   SLIP (the protocol for sending Internet traffic over telephone
   lines) or PPP (a better SLIP) on them, you can make them behave like
-  one double speed connection using this driver. Naturally, this has
+  one double speed connection using this driver.  Naturally, this has
   to be supported at the other end as well, either with a similar EQL
-  Linux driver or with a Livingston Portmaster 2e. 
+  Linux driver or with a Livingston Portmaster 2e.
 
-  Say Y if you want this and read Documentation/networking/eql.txt.
-  You may also want to read section 6.2 of the NET-3-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  Say Y if you want this and read
+  <file:Documentation/networking/eql.txt>.  You may also want to read
+  section 6.2 of the NET-3-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called eql.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called eql.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
 
-Universal TUN/TAP device driver.
+Universal TUN/TAP device driver support
 CONFIG_TUN
-  TUN/TAP provides packet reception and transmission for user space programs.
-  It can be viewed as a simple Point-to-Point or Ethernet device, which
-  instead of receiving packets from a physical media, receives them from
-  user space program and instead of sending packets via physical media
-  writes them to the user space program.
+  TUN/TAP provides packet reception and transmission for user space
+  programs.  It can be viewed as a simple Point-to-Point or Ethernet
+  device, which instead of receiving packets from a physical media,
+  receives them from user space program and instead of sending packets
+  via physical media writes them to the user space program.
+
+  When a program opens /dev/net/tun, driver creates and registers
+  corresponding net device tunX or tapX.  After a program closed above
+  devices, driver will automatically delete tunXX or tapXX device and
+  all routes corresponding to it.
 
-  When a program opens /dev/net/tun, driver creates and registers 
-  corresponding net device tunX or tapX. After a program closed above 
-  devices, driver will automatically delete tunXX or tapXX device and all 
-  routes corresponding to it.
-
-  Please read Documentation/networking/tuntap.txt for more information.
+  Please read <file:Documentation/networking/tuntap.txt> for more
+  information.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called tun.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called tun.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
   If you don't know what to use this for, you don't need it.
 
@@ -7963,7 +8975,7 @@
   driver", above) and create a character special file /dev/tap0 with
   major number 36 and minor number 16 using mknod ("man mknod"), you
   will be able to have a user space program read and write raw
-  Ethernet frames from/to that special file. tap0 can be configured
+  Ethernet frames from/to that special file.  tap0 can be configured
   with ifconfig and route like any other Ethernet device but it is not
   connected to any physical LAN; everything written by the user to
   /dev/tap0 is treated by the kernel as if it had come in from a LAN
@@ -7971,19 +8983,19 @@
   device tap0 can instead be read by the user from /dev/tap0: the user
   mode program replaces the LAN that would be attached to an ordinary
   Ethernet device. Please read the file
-  Documentation/networking/ethertap.txt for more information. 
+  <file:Documentation/networking/ethertap.txt> for more information.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called ethertap.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. 
+  module, say M here and read <file:Documentation/modules.txt>.
 
   If you don't know what to use this for, you don't need it.
 
 Sealevel Systems 4021 support
 CONFIG_SEALEVEL_4021
   This is a driver for the Sealevel Systems ACB 56 serial I/O adapter.
-  
+
   This driver can only be compiled as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to do that, say M here. The module will be called
@@ -7997,6 +9009,21 @@
   of the Cisco HDLC/PPP driver (syncppp.c).
   The SyncLink WAN driver (in character devices) must also be enabled.
 
+FarSync T-Series support
+CONFIG_FARSYNC
+  This driver supports the FarSync T-Series X.21 (and V.35/V.24) cards
+  from FarSite Communications Ltd.
+  Synchronous communication is supported on all ports at speeds up to
+  8Mb/s (128K on V.24) using synchronous PPP or Cisco HDLC.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want)
+  say M here and read <file:Documentation/modules.txt>.
+  The module will be called farsync.o and if you want the module to be
+  automatically loaded when the interface is referenced then you
+  should add "alias syncX farsync" to /etc/modules.conf for each
+  interface, where X is 0, 1, 2, ...
+
 Frame Relay (DLCI) support
 CONFIG_DLCI
   This is support for the frame relay protocol; frame relay is a fast
@@ -8006,15 +9033,15 @@
   network, usually at the phone company) can carry several logical
   point-to-point connections to other computers connected to the frame
   relay network. For a general explanation of the protocol, check out
-  http://www.frforum.com/ on the WWW. To use frame relay, you need
+  <http://www.frforum.com/> on the WWW. To use frame relay, you need
   supporting hardware (called FRAD) and certain programs from the
   net-tools package as explained in
-  Documentation/networking/framerelay.txt.
+  <file:Documentation/networking/framerelay.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called dlci.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Max open DLCI
 CONFIG_DLCI_COUNT
@@ -8029,19 +9056,19 @@
   handled by each of your hardware frame relay access devices. Go with
   the default.
 
-Sangoma S502A FRAD support
+SDLA (Sangoma S502/S508) support
 CONFIG_SDLA
   Say Y here if you need a driver for the Sangoma S502A, S502E, and
   S508 Frame Relay Access Devices. These are multi-protocol cards, but
   only frame relay is supported by the driver at this time. Please
-  read Documentation/framerelay.txt. 
+  read <file:Documentation/framerelay.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called sdla.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Acorn Econet/AUN protocols (EXPERIMENTAL)
+Acorn Econet/AUN protocols
 CONFIG_ECONET
   Econet is a fairly old and slow networking protocol mainly used by
   Acorn computers to access file and print servers. It uses native
@@ -8057,7 +9084,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called econet.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 AUN over UDP
 CONFIG_ECONET_AUNUDP
@@ -8070,7 +9097,7 @@
   Say Y here if you have a native Econet network card installed in
   your computer.
 
-WAN Router
+WAN router
 CONFIG_WAN_ROUTER
   Wide Area Networks (WANs), such as X.25, frame relay and leased
   lines, are used to interconnect Local Area Networks (LANs) over vast
@@ -8082,16 +9109,17 @@
   As an alternative, WAN routing can be built into the Linux kernel.
   With relatively inexpensive WAN interface cards available on the
   market, a perfectly usable router can be built for less than half
-  the price of an external router. If you have one of those cards and
+  the price of an external router.  If you have one of those cards and
   wish to use your Linux box as a WAN router, say Y here and also to
-  the WAN driver for your card, below. You will then need the
-  wan-tools package which is available from ftp://ftp.sangoma.com .
-  Read Documentation/networking/wan-router.txt for more information.
+  the WAN driver for your card, below.  You will then need the
+  wan-tools package which is available from <ftp://ftp.sangoma.com>.
+  Read <file:Documentation/networking/wan-router.txt> for more
+  information.
 
   The WAN routing support is also available as a module called
   wanrouter.o ( = code which can be inserted in and removed from the
-  running kernel whenever you want). If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  running kernel whenever you want).  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
   If unsure, say N.
 
@@ -8103,13 +9131,13 @@
   IMPORTANT NOTE: This option is NOT COMPATIBLE with "Network packet
   filtering" (CONFIG_NETFILTER). Say N here if you say Y there.
 
-  However, it will work with all options in the "IP: advanced router"
-  section (except for "IP: use TOS value as routing key" and
-  "IP: use FWMARK value as routing key").
+  However, it will work with all options in the "Advanced router"
+  section (except for "Use TOS value as routing key" and
+  "Use FWMARK value as routing key").
 
   At the moment, few devices support fast switching (tulip is one of
   them, a modified 8390 driver can be found at
-  ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz ).
+  <ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz>).
 
   If unsure, say N.
 
@@ -8119,7 +9147,7 @@
   during periods of extremal congestion. At the moment only a couple
   of device drivers support it (really only one -- tulip, a modified
   8390 driver can be found at
-  ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz ). 
+  <ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz>).
 
   Really, this option is applicable to any machine attached to a fast
   enough network, and even a 10 Mb NIC is able to kill a not very slow
@@ -8146,68 +9174,75 @@
   This code is considered to be experimental.
 
   To administer these schedulers, you'll need the user-level utilities
-  from the package iproute2+tc at ftp://ftp.inr.ac.ru/ip-routing/ .
+  from the package iproute2+tc at <ftp://ftp.inr.ac.ru/ip-routing/>.
   That package also contains some documentation; for more, check out
-  http://snafu.freedom.org/linux2.2/iproute-notes.html .
+  <http://snafu.freedom.org/linux2.2/iproute-notes.html>.
 
   This Quality of Service (QoS) support will enable you to use
   Differentiated Services (diffserv) and Resource Reservation Protocol
   (RSVP) on your Linux router if you also say Y to "QoS support",
   "Packet classifier API" and to some classifiers below. Documentation
-  and software is at http://icawww1.epfl.ch/linux-diffserv/ .
+  and software is at <http://icawww1.epfl.ch/linux-diffserv/>.
 
   If you say Y here and to "/proc file system" below, you will be able
   to read status information about packet schedulers from the file
   /proc/net/psched.
-  
+
   The available schedulers are listed in the following questions; you
   can say Y to as many as you like. If unsure, say N now.
 
 CBQ packet scheduler
 CONFIG_NET_SCH_CBQ
   Say Y here if you want to use the Class-Based Queueing (CBQ) packet
-  scheduling algorithm for some of your network devices. This
+  scheduling algorithm for some of your network devices.  This
   algorithm classifies the waiting packets into a tree-like hierarchy
   of classes; the leaves of this tree are in turn scheduled by
   separate algorithms (called "disciplines" in this context).
 
-  See the top of net/sched/sch_cbq.c for references about the CBQ
-  algorithm.
-  
+  See the top of <file:net/sched/sch_cbq.c> for references about the
+  CBQ algorithm.
+
   CBQ is a commonly used scheduler, so if you're unsure, you should
   say Y here. Then say Y to all the queueing algorithms below that you
-  want to use as CBQ disciplines. Then say Y to "Packet classifier
+  want to use as CBQ disciplines.  Then say Y to "Packet classifier
   API" and say Y to all the classifiers you want to use; a classifier
   is a routine that allows you to sort your outgoing traffic into
   classes based on a certain criterion.
 
   This code is also available as a module called sch_cbq.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 CSZ packet scheduler
 CONFIG_NET_SCH_CSZ
   Say Y here if you want to use the Clark-Shenker-Zhang (CSZ) packet
-  scheduling algorithm for some of your network devices. At the
+  scheduling algorithm for some of your network devices.  At the
   moment, this is the only algorithm that can guarantee service for
-  real-time applications (see the top of net/sched/sch_csz.c for
-  details and references about the algorithm). 
-  
+  real-time applications (see the top of <file:net/sched/sch_csz.c>
+  for details and references about the algorithm).
+
   Note: this scheduler is currently broken.
 
   This code is also available as a module called sch_csz.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-#ATM pseudo-scheduler
-#CONFIG_NET_SCH_ATM
-#
-# ???
-#
-  
-The simplest PRIO pseudo scheduler
+ATM pseudo-scheduler
+CONFIG_NET_SCH_ATM
+  Say Y here if you want to use the ATM pseudo-scheduler.  This
+  provides a framework for invoking classifiers (aka "filters"), which
+  in turn select classes of this queuing discipline.  Each class maps
+  the flow(s) it is handling to a given virtual circuit (see the top of
+  <file:net/sched/sch_atm.c>).
+
+  This code is also available as a module called sch_atm.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+The simplest PRIO pseudo-scheduler
 CONFIG_NET_SCH_PRIO
   Say Y here if you want to use an n-band priority queue packet
   "scheduler" for some of your network devices or as a leaf discipline
@@ -8216,32 +9251,56 @@
   This code is also available as a module called sch_prio.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
+
+Diffserv field marker
+CONFIG_NET_SCH_DSMARK
+  Say Y if you want to schedule packets avccording to the
+  Differentiated Services architecture proposed in RFC 2475.
+  Technical information on this method, with pointers to associated
+  RFCs, is available at <http://www.gta.ufrj.br/diffserv/>.
+
+  This code is also available as a module called sch_dsmark.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+GRED queue
+CONFIG_NET_SCH_GRED
+  Say Y here if you want to use the Generic Random Early Detection
+  (RED) packet scheduling algorithm for some of your network devices
+  (see the top of <file:net/sched/sch_red.c> for details and
+  references about the algorithm).
+
+  This code is also available as a module called sch_gred.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 RED queue
 CONFIG_NET_SCH_RED
   Say Y here if you want to use the Random Early Detection (RED)
   packet scheduling algorithm for some of your network devices (see
-  the top of net/sched/sch_red.c for details and references about the
-  algorithm).
+  the top of <file:net/sched/sch_red.c> for details and references
+  about the algorithm).
 
   This code is also available as a module called sch_red.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 SFQ queue
 CONFIG_NET_SCH_SFQ
   Say Y here if you want to use the Stochastic Fairness Queueing (SFQ)
   packet scheduling algorithm for some of your network devices or as a
   leaf discipline for the CBQ scheduling algorithm (see the top of
-  net/sched/sch_sfq.c for details and references about the SFQ
-  algorithm). 
+  <file:net/sched/sch_sfq.c> for details and references about the SFQ
+  algorithm).
 
   This code is also available as a module called sch_sfq.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 TEQL queue
 CONFIG_NET_SCH_TEQL
@@ -8249,30 +9308,36 @@
   scheduling algorithm for some of your network devices or as a leaf
   discipline for the CBQ scheduling algorithm. This queueing
   discipline allows the combination of several physical devices into
-  one virtual device. (see the top of net/sched/sch_teql.c for
+  one virtual device. (see the top of <file:net/sched/sch_teql.c> for
   details).
 
   This code is also available as a module called sch_teql.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 TBF queue
 CONFIG_NET_SCH_TBF
   Say Y here if you want to use the Simple Token Bucket Filter (TBF)
   packet scheduling algorithm for some of your network devices or as a
   leaf discipline for the CBQ scheduling algorithm (see the top of
-  net/sched/sch_tbf.c for a description of the TBF algorithm). 
+  <file:net/sched/sch_tbf.c> for a description of the TBF algorithm).
 
   This code is also available as a module called sch_tbf.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
+
+Ingress Qdisc
+CONFIG_NET_SCH_INGRESS
+  If you say Y here, you will be able to police incoming bandwidth
+  and drop packets when this bandwidth exceeds your desired rate.
+  If unsure, say Y.
 
-### Add these
-#+tristate '  GRED queue' CONFIG_NET_SCH_GRED
-#+tristate '  Diffserv field marker' CONFIG_NET_SCH_DSMARK
-#+tristate '  Ingress Qdisc' CONFIG_NET_SCH_INGRESS
+  This code is also available as a module called cls_ingress.o
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want).  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
 
 QoS support
 CONFIG_NET_QOS
@@ -8284,10 +9349,10 @@
   Differentiated Services (diffserv) and Resource Reservation Protocol
   (RSVP) on your Linux router if you also say Y to "Packet classifier
   API" and to some classifiers below. Documentation and software is at
-  http://icawww1.epfl.ch/linux-diffserv/ .
+  <http://icawww1.epfl.ch/linux-diffserv/>.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about QoS support.
 
 Rate estimator
@@ -8307,10 +9372,24 @@
   This will enable you to use Differentiated Services (diffserv) and
   Resource Reservation Protocol (RSVP) on your Linux router.
   Documentation and software is at
-  http://icawww1.epfl.ch/linux-diffserv/ .
+  <http://icawww1.epfl.ch/linux-diffserv/>.
 
-### Add
-#tristate '    TC index classifier' CONFIG_NET_CLS_TCINDEX
+Traffic policing (needed for in/egress)
+CONFIG_NET_CLS_POLICE
+  Say Y to support traffic policing (bandwidth limits).  Needed for
+  ingress and egress rate limiting.
+
+TC index classifier
+CONFIG_NET_CLS_TCINDEX
+  If you say Y here, you will be able to classify outgoing packets
+  according to the tc_index field of the skb. You will want this
+  feature if you want to implement Differentiated Services using
+  sch_dsmark. If unsure, say Y.
+
+  This code is also available as a module called cls_tcindex.o
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want). If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
 
 Routing tables based classifier
 CONFIG_NET_CLS_ROUTE4
@@ -8319,8 +9398,8 @@
 
   This code is also available as a module called cls_route.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 Firewall based classifier
 CONFIG_NET_CLS_FW
@@ -8329,8 +9408,8 @@
 
   This code is also available as a module called cls_fw.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 U32 classifier
 CONFIG_NET_CLS_U32
@@ -8339,8 +9418,8 @@
 
   This code is also available as a module called cls_u32.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 Special RSVP classifier
 CONFIG_NET_CLS_RSVP
@@ -8353,8 +9432,8 @@
 
   This code is also available as a module called cls_rsvp.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 Special RSVP classifier for IPv6
 CONFIG_NET_CLS_RSVP6
@@ -8368,15 +9447,8 @@
 
   This code is also available as a module called cls_rsvp6.o ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt
-
-#
-# Traffic policing (needed for in/egress)
-# CONFIG_NET_CLS_POLICE
-###
-### Some expert please fill these in
-###
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
 
 Network code profiler
 CONFIG_NET_PROFILE
@@ -8405,10 +9477,10 @@
 CONFIG_HOSTESS_SV11
   This is a network card for low speed synchronous serial links, at
   up to 256Kbps. It supports both PPP and Cisco HDLC.
-  
+
   At this point, the driver can only be compiled as a module.
 
-COSA/SRP sync serial boards support
+COSA/SRP sync serial board support
 CONFIG_COSA
   This is a driver for COSA and SRP synchronous serial boards. These
   boards allow to connect synchronous serial devices (for example
@@ -8419,59 +9491,60 @@
 
   To actually use the COSA or SRP board, you will need user-space
   utilities for downloading the firmware to the cards and to set them
-  up. Look at the http://www.fi.muni.cz/~kas/cosa/ for more
+  up. Look at the <http://www.fi.muni.cz/~kas/cosa/> for more
   information about the cards (including the pointer to the user-space
   utilities). You can also read the comment at the top of the
-  drivers/net/cosa.c for details about the cards and the driver
+  <file:drivers/net/cosa.c> for details about the cards and the driver
   itself.
 
   The driver will be compiled as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called cosa.o. For general information about
-  modules read Documentation/modules.txt.
+  modules read <file:Documentation/modules.txt>.
 
-Etinc PCISYNC serial boards support
+Etinc PCISYNC serial board support
 CONFIG_DSCC4
   This is a driver for Etinc PCISYNC boards based on the Infineon
   (ex. Siemens) DSCC4 chipset. It is supposed to work with the four
-  ports card. Take a look at http://www.cogenit.fr/dscc4
+  ports card. Take a look at <http://www.cogenit.fr/dscc4>
   for further informations about the driver and his configuration.
 
   The driver will be compiled as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called dscc4.o. For general information about
-  modules read Documentation/modules.txt.
+  modules read <file:Documentation/modules.txt>.
 
-Lan Media sync serial boards support
+LanMedia Corp. serial boards (SSI/V.35, T1/E1, HSSI, T3)
 CONFIG_LANMEDIA
-  This is a driver for the following Lan Media family of serial boards.
- 
+  This is a driver for the following Lan Media family of serial
+  boards.
+
   LMC 1000 board allows you to connect synchronous serial devices (for
   example base-band modems, or any other device with the X.21, V.24,
   V.35 or V.36 interface) to your Linux box.
- 
+
   LMC 1200 with on board DSU board allows you to connect your Linux
   box dirrectly to a T1 or E1 circuit.
- 
-  LMC 5200 board provides a HSSI interface capable of runnig up to
+
+  LMC 5200 board provides a HSSI interface capable of running up to
   52 mbits per second.
- 
+
   LMC 5245 board connects directly to a T3 circuit saving the
   additional external hardware.
- 
+
   To change setting such as syncPPP vs cisco HDLC or clock source you
-  will need lmcctl.  It it available at ftp.lanmedia.com.
- 
+  will need lmcctl.  It is available at <ftp://ftp.lanmedia.com>.
+
   This code is also available as a module called lmc.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Fibre Channel driver support
 CONFIG_NET_FC
   Fibre Channel is a high speed serial protocol mainly used to connect
   large storage devices to the computer; it is compatible with and
-  intended to replace SCSI. 
+  intended to replace SCSI.
 
   If you intend to use Fibre Channel, you need to have a Fibre channel
   adaptor card in your computer; say Y here and to the driver for your
@@ -8485,9 +9558,9 @@
   The driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called iph5526.o. For general information about
-  modules read Documentation/modules.txt.
-  
-Red Creek Hardware VPN (EXPERIMENTAL)
+  modules read <file:Documentation/modules.txt>.
+
+Red Creek Hardware VPN
 CONFIG_RCPCI
   This is a driver for hardware which provides a Virtual Private
   Network (VPN). Say Y if you have it.
@@ -8495,19 +9568,28 @@
   This code is also available as a module called rcpci.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
-  
-SBNI12-xx support
+  here and read <file:Documentation/modules.txt>.
+
+Granch SBNI12 Leased Line adapter driver
 CONFIG_SBNI
   This is a driver for ISA SBNI12-xx cards which are low cost
   alternatives to leased line modems. Say Y if you want to insert
   the driver into the kernel or say M to compile it as a module (the
-  module will be called sbni.o). 
-  
-  You can find more information and last versions of drivers and 
-  utilities at http://www.granch.ru . If you have any question you
+  module will be called sbni.o).
+
+  You can find more information and last versions of drivers and
+  utilities at <http://www.granch.ru>. If you have any question you
   can send email to sbni@granch.ru.
-  
+
+  Say N if unsure.
+
+SBNI Adapters Multiline feature
+CONFIG_SBNI_MULTILINE
+  Schedule traffic for some parallel lines, via SBNI12 adapters.
+  If you have two computers connected with two parallel lines it's
+  possible to increase transfer rate nearly twice. You should have
+  a program named 'sbniconfig' to configure adapters.
+
   Say N if unsure.
 
 WAN router drivers
@@ -8519,27 +9601,26 @@
   Router".
 
   You will need the wan-tools package which is available from
-  ftp://ftp.sangoma.com . Read Documentation/networking/wan-router.txt
-  for more information.
+  <ftp://ftp.sangoma.com>. Read
+  <file:Documentation/networking/wan-router.txt> for more information.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about WAN router drivers. If unsure, say N.
 
 Sangoma WANPIPE(tm) multiprotocol cards
 CONFIG_VENDOR_SANGOMA
+  WANPIPE from Sangoma Technologies Inc. (<http://www.sangoma.com>)
+  is a family of intelligent multiprotocol WAN adapters with data
+  transfer rates up to 4Mbps. They are also known as Synchronous
+  Data Link Adapters (SDLA) and are designated as S514-PCI or
+  S508-ISA.  These cards support
+
+    - X.25, Frame Relay, PPP, Cisco HDLC protocols.
+
+    - API support for protocols like HDLC (LAPB),
+      HDLC Streaming, X.25, Frame Relay and BiSync.
 
-  WANPIPE from Sangoma Technologies Inc. (http://www.sangoma.com)
-  is a family of intelligent multiprotocol WAN adapters with data 
-  transfer rates up to 4Mbps. They are also known as Synchronous 
-  Data Link Adapters (SDLA) and are designated as S514-PCI or S508-ISA. 
-  These cards support
-  
-    - X.25, Frame Relay, PPP, Cisco HDLC protocols. 
-  
-    - API support for protocols like HDLC (LAPB), 
-      HDLC Streaming, X.25, Frame Relay and BiSync. 
-  
     - Ethernet Bridging over Frame Relay protocol.
 
     - MULTILINK PPP
@@ -8547,32 +9628,32 @@
     - Async PPP (Modem Dialup)
 
   If you have one or more of these cards, say M to this option; you
-  may then also want to read the file  
-  Documentation/networking/wanpipe.txt. The next questions will ask
-  you about the protocols you want the driver to support.
+  may then also want to read the file
+  <file:Documentation/networking/wanpipe.txt>.  The next questions
+  will ask you about the protocols you want the driver to support.
 
   The driver will be compiled as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called wanpipe.o. For general information about
-  modules read Documentation/modules.txt.
+  The module will be called wanpipe.o.  For general information about
+  modules read <file:Documentation/modules.txt>.
 
 WANPIPE X.25 support
 CONFIG_WANPIPE_X25
   Say Y to this option if you are planning to connect a WANPIPE card
   to an X.25 network.  Note, this feature also includes the X.25 API
   support used to develope custom applications over the X.25 protocol.
-  If you say N, the X.25 support will not be included in the driver. 
+  If you say N, the X.25 support will not be included in the driver.
   The X.25 option is supported on S514-PCI and S508-ISA cards.
 
 WANPIPE Frame Relay support
 CONFIG_WANPIPE_FR
   Say Y to this option if you are planning to connect a WANPIPE card
-  to a frame relay network, or use frame relay API to develope 
-  custom applications over the Frame  Relay protocol.  
+  to a frame relay network, or use frame relay API to develope
+  custom applications over the Frame  Relay protocol.
   This feature also contains the Ethernet Bridging over Frame Relay,
-  where a WANPIPE frame relay link can be directly connected to the Linux
-  kernel bridge. If you say N, the frame relay support will
-  not be included in the driver. The Frame Relay option is 
+  where a WANPIPE frame relay link can be directly connected to the
+  Linux kernel bridge.  If you say N, the frame relay support will
+  not be included in the driver. The Frame Relay option is
   supported on S514-PCI and S508-ISA cards.
 
 WANPIPE PPP support
@@ -8582,70 +9663,71 @@
   the PPP support will not be included in the driver. The PPP option
   is supported on S514-PCI/S508-ISA cards.
 
-WANPIPE MultiPort PPP support
+WANPIPE Multi-Port PPP support
 CONFIG_WANPIPE_MULTPPP
   Say Y to this option if you are planning to connect a WANPIPE card
-  to a leased line using Point-to-Point protocol (PPP). Note, the
-  MultiPort PPP uses the Linux Kernel SyncPPP protocol over the Sangoma
-  HDLC Streaming adapter.  In this case each Sangoma adapter port 
-  can support an independent PPP connection.  For example, a single
-  Quad-Port PCI adapter can support up to four independent 
-  PPP links. If you say N,the PPP support will not be included 
-  in the driver. The PPP option is supported on S514-PCI/S508-ISA cards.
- 	
+  to a leased line using Point-to-Point protocol (PPP).  Note, the
+  MultiPort PPP uses the Linux Kernel SyncPPP protocol over the
+  Sangoma HDLC Streaming adapter.  In this case each Sangoma adapter
+  port can support an independent PPP connection.  For example, a
+  single Quad-Port PCI adapter can support up to four independent
+  PPP links. If you say N,the PPP support will not be included in the
+  driver.  The PPP option is supported on S514-PCI/S508-ISA cards.
+
 WANPIPE Cisco HDLC support
 CONFIG_WANPIPE_CHDLC
   Say Y to this option if you are planning to connect a WANPIPE card
   to a leased line using the Cisco HDLC protocol. This now supports
-  Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards. 
-  This support also allows user to build applications using the 
-  HDLC streaming API. 
-  
+  Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards.
+  This support also allows user to build applications using the
+  HDLC streaming API.
+
   CHDLC Streaming driver also supports MULTILINK PPP
   support that can bind multiple WANPIPE T1 cards into
   a single logical channel.
-  
-  If you say  N, the Cisco HDLC support and 
-  HDLC streaming API and MULTILINK PPP will not be 
+
+  If you say  N, the Cisco HDLC support and
+  HDLC streaming API and MULTILINK PPP will not be
   included in the driver.
 
-MultiGate/COMX support
+MultiGate (COMX) synchronous serial board support
 CONFIG_COMX
   Say Y if you want to use any board from the MultiGate (COMX) family.
   These boards are synchronous serial adapters for the PC,
   manufactured by ITConsult-Pro Co, Hungary.
 
-  Read linux/Documentation/networking/comx.txt for help on configuring
-  and using COMX interfaces. Further info on these cards can be found
-  at http://www.itc.hu or <info@itc.hu>.
+  Read <file:Documentation/networking/comx.txt> for help on
+  configuring and using COMX interfaces.  Further info on these cards
+  can be found at <http://www.itc.hu> or <info@itc.hu>.
 
   You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
   use this driver.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called comx.o.
+  <file:Documentation/modules.txt>.  The module will be called comx.o.
 
-COMX/CMX/HiCOMX board support
+Support for COMX/CMX/HiCOMX boards
 CONFIG_COMX_HW_COMX
   Hardware driver for the 'CMX', 'COMX' and 'HiCOMX' boards from the
-  MultiGate family. Say Y if you have one of these. 
+  MultiGate family. Say Y if you have one of these.
 
   You will need additional firmware to use these cards, which are
-  downloadable from ftp://ftp.itc.hu/.
+  downloadable from <ftp://ftp.itc.hu/>.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called comx-hw-comx.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  comx-hw-comx.o.
 
-LoCOMX board support
+Support for LoCOMX board
 CONFIG_COMX_HW_LOCOMX
   Hardware driver for the 'LoCOMX' board from the MultiGate family.
   Say Y if you have a board like this.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called
+  <file:Documentation/modules.txt>.  The module will be called
   comx-hw-locomx.o.
 
-MixCOM board support
+Support for MixCOM board
 CONFIG_COMX_HW_MIXCOM
   Hardware driver for the 'MixCOM' board from the MultiGate family.
   Say Y if you have a board like this.
@@ -8655,63 +9737,63 @@
   configuration. The ISDN interface of this card is Teles 16.3
   compatible, you should enable it in the ISDN configuration menu. The
   driver for the flash ROM of this card is available separately on
-  ftp://ftp.itc.hu/.
+  <ftp://ftp.itc.hu/>.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called
+  <file:Documentation/modules.txt>. The module will be called
   comx-hw-mixcom.o.
 
-i810 TCO support
+i810 TCO timer/watchdog support
 CONFIG_I810_TCO
   Hardware driver for the TCO timer built into the Intel i810 and i815
-  chipset family. The TCO (Total Cost of Ownership) timer is a watchdog
-  timer that will reboot the machine after it's second expiration. The
-  expiration time can be configured by commandline argument
-  "i810_margin=<n>" where <n> is the counter initial value. It is
-  decremented every 0.6 secs, the default is 50 which gives a timeout
-  of 30 seconds and one minute until reset.
+  chipset family.  The TCO (Total Cost of Ownership) timer is a
+  watchdog timer that will reboot the machine after its second
+  expiration. The expiration time can be configured by commandline
+  argument "i810_margin=<n>" where <n> is the counter initial value.
+  It is decremented every 0.6 secs, the default is 50 which gives a
+  timeout of 30 seconds and one minute until reset.
 
   On some motherboards the driver may fail to reset the chipset's
-  NO_REBOOT flag which prevents the watchdog from rebooting the machine.
-  If this is the case you will get a kernel message like
+  NO_REBOOT flag which prevents the watchdog from rebooting the
+  machine. If this is the case you will get a kernel message like
   "i810tco init: failed to reset NO_REBOOT flag".
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called
+  <file:Documentation/modules.txt>.  The module will be called
   i810-tco.o.
 
-MultiGate Cisco-HDLC and synchronous PPP protocol support
+Support for HDLC and syncPPP protocols on MultiGate boards
 CONFIG_COMX_PROTO_PPP
   Cisco-HDLC and synchronous PPP protocol driver for all MultiGate
   boards. Say Y if you want to use either protocol on your MultiGate
   boards.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called 
+  <file:Documentation/modules.txt>.  The module will be called
   comx-proto-ppp.o.
 
-MultiGate LAPB protocol support
+Support for LAPB protocol on MultiGate boards
 CONFIG_COMX_PROTO_LAPB
-  LAPB protocol driver for all MultiGate boards. Say Y if you 
+  LAPB protocol driver for all MultiGate boards. Say Y if you
   want to use this protocol on your MultiGate boards.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called
+  <file:Documentation/modules.txt>.  The module will be called
   comx-proto-lapb.o.
 
-MultiGate Frame Relay protocol support
+Support for Frame Relay on MultiGate boards
 CONFIG_COMX_PROTO_FR
-  Frame Relay protocol driver for all MultiGate boards. Say Y if you 
+  Frame Relay protocol driver for all MultiGate boards. Say Y if you
   want to use this protocol on your MultiGate boards.
 
   If you want to compile this as a module, say M and read
-  Documentation/modules.txt. The module will be called
+  <file:Documentation/modules.txt>.  The module will be called
   comx-proto-fr.o.
 
-Cyclom 2X(tm) multiprotocol cards (EXPERIMENTAL)
+Cyclom 2X(tm) multiprotocol cards
 CONFIG_CYCLADES_SYNC
-  Cyclom 2X from Cyclades Corporation (http://www.cyclades.com and
-  http://www.cyclades.com.br) is an intelligent multiprotocol WAN
+  Cyclom 2X from Cyclades Corporation (<http://www.cyclades.com> and
+  <http://www.cyclades.com.br)> is an intelligent multiprotocol WAN
   adapter with data transfer rates up to 512 Kbps. These cards support
   the X.25 and SNA related protocols. If you have one or more of these
   cards, say Y to this option. The next questions will ask you about
@@ -8719,10 +9801,11 @@
   supported).
 
   While no documentation is available at this time please grab the
-  wanconfig tarball in http://www.conectiva.com.br/~acme/cycsyn-devel
-  (with minor changes to make it compile with the current wanrouter
-  include files; efforts are being made to use the original package
-  available at ftp://ftp.sangoma.com ).
+  wanconfig tarball in
+  <http://www.conectiva.com.br/~acme/cycsyn-devel> (with minor changes
+  to make it compile with the current wanrouter include files; efforts
+  are being made to use the original package available at
+  <ftp://ftp.sangoma.com>).
 
   Feel free to contact me or the cycsyn-devel mailing list at
   acme@conectiva.com.br and cycsyn-devel@bazar.conectiva.com.br for
@@ -8732,12 +9815,12 @@
   The driver will be compiled as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called cyclomx.o. For general information about
-  modules read Documentation/modules.txt.
+  modules read <file:Documentation/modules.txt>.
 
 Cyclom 2X X.25 support
 CONFIG_CYCLOMX_X25
   Say Y to this option if you are planning to connect a Cyclom 2X card
-  to an X.25 network. 
+  to an X.25 network.
 
   If you say N, the X.25 support will not be included in the driver
   (saves about 11 KB of kernel memory).
@@ -8747,41 +9830,69 @@
   Say Y to this option if your Linux box contains a WAN card supported
   by this driver and you are planning to connect the box to a WAN
   ( = Wide Area Network). You will need supporting software from
-  http://hq.pm.waw.pl/hdlc/.
+  <http://hq.pm.waw.pl/hdlc/>.
   Generic HDLC driver currently supports raw HDLC, Cisco HDLC, Frame
   Relay, synchronous Point-to-Point Protocol (PPP) and X.25.
 
   If unsure, say N here.
 
-Synchronous Point-to-Point Protocol (PPP)
+Raw HDLC support
+CONFIG_HDLC_RAW
+  Say Y to this option if you want generic HDLC driver to support
+  raw HDLC over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+Cisco HDLC support
+CONFIG_HDLC_CISCO
+  Say Y to this option if you want generic HDLC driver to support
+  Cisco HDLC over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+Frame-Relay HDLC support
+CONFIG_HDLC_FR
+  Say Y to this option if you want generic HDLC driver to support
+  Frame-Relay protocol over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+Frame-Relay bridging support
+CONFIG_HDLC_FR_BRIDGE
+  Say Y to this option if you want generic HDLC driver to support
+  bridging LAN frames over Frame-Relay links.
+
+  If unsure, say N here.
+
+Synchronous Point-to-Point Protocol (PPP) support
 CONFIG_HDLC_PPP
   Say Y to this option if you want generic HDLC driver to support
   PPP over WAN (Wide Area Network) connections.
 
   If unsure, say N here.
 
-CCITT X.25 protocol
+CCITT X.25 over HDLC support
 CONFIG_HDLC_X25
   Say Y to this option if you want generic HDLC driver to support
   X.25 protocol over WAN (Wide Area Network) connections.
 
   If unsure, say N here.
 
-SDL RISCom/N2 driver
+SDL RISCom/N2 support
 CONFIG_N2
   This driver is for RISCom/N2 single or dual channel ISA cards
-  made by SDL Communications Inc. If you have such a card,
-  say Y here and see http://hq.pm.waw.pl/pub/hdlc/
+  made by SDL Communications Inc.  If you have such a card,
+  say Y here and see <http://hq.pm.waw.pl/pub/hdlc/>.
 
   Note that N2csu and N2dds cards are not supported by this driver.
 
   If unsure, say N here.
 
-Moxa C101 driver
+Moxa C101 support
 CONFIG_C101
   This driver is for C101 SuperSync ISA cards made by Moxa
   Technologies Co., Ltd. If you have such a card,
-  say Y here and see http://hq.pm.waw.pl/pub/hdlc/
+  say Y here and see <http://hq.pm.waw.pl/pub/hdlc/>
 
   If unsure, say N here.
 
@@ -8803,21 +9914,21 @@
   If your Linux machine will be connected to an Ethernet and you have
   an Ethernet network interface card (NIC) installed in your computer,
   say Y here and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . You will then also have
+  <http://www.linuxdoc.org/docs.html#howto>. You will then also have
   to say Y to the driver for your particular NIC.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about Ethernet network cards. If unsure, say N.
 
 Western Digital/SMC cards
 CONFIG_NET_VENDOR_SMC
   If you have a network (Ethernet) card belonging to this class, say Y
   and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about Western Digital cards. If you say Y, you will be
   asked for your specific card in the following questions.
 
@@ -8825,32 +9936,32 @@
 CONFIG_WD80x3
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called wd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called wd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 SMC Ultra MCA support
 CONFIG_ULTRAMCA
   If you have a network (Ethernet) card of this type and are running
   an MCA based system (PS/2), say Y and read the Ethernet-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called smc-mca.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called smc-mca.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 SMC Ultra support
 CONFIG_ULTRA
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
-  
+  <http://www.linuxdoc.org/docs.html#howto>.
+
   Important: There have been many reports that, with some motherboards
   mixing an SMC Ultra and an Adaptec AHA154x SCSI card (or compatible,
   such as some BusLogic models) causes corruption problems with many
@@ -8860,44 +9971,44 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called smc-ultra.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. 
+  The module will be called smc-ultra.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
 
 SMC Ultra32 EISA support
 CONFIG_ULTRA32
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called smc-ultra32.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt as well
-  as Documentation/networking/net-modules.txt.
+  The module will be called smc-ultra32.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
 
-SMC 9194 Support
+SMC 9194 support
 CONFIG_SMC9194
   This is support for the SMC9xxx based Ethernet cards. Choose this
   option if you have a DELL laptop with the docking station, or
-  another SMC9192/9194 based chipset. Say Y if you want it compiled
+  another SMC9192/9194 based chipset.  Say Y if you want it compiled
   into the kernel, and read the file
-  Documentation/networking/smc9.txt and the Ethernet-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  <file:Documentation/networking/smc9.txt> and the Ethernet-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module will be called smc9194.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt as
-  well as Documentation/networking/net-modules.txt.
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smc9194.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-PCI NE2000 support
+PCI NE2000 and clones support
 CONFIG_NE2K_PCI
   This driver is for NE2000 compatible PCI cards. It will not work
   with ISA NE2000 cards (they have their own driver, "NE2000/NE1000
   support" below). If you have a PCI NE2000 network (Ethernet) card,
   say Y and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver also works for the following NE2000 clone cards:
     RealTek RTL-8029  Winbond 89C940  Compex RL2000  KTI ET32P2
@@ -8906,64 +10017,64 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ne2k-pci.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ne2k-pci.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
 
 Racal-Interlan (Micom) NI cards
 CONFIG_NET_VENDOR_RACAL
   If you have a network (Ethernet) card belonging to this class, such
   as the NI5010, NI5210 or NI6210, say Y and read the Ethernet-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about NI cards. If you say Y, you will be asked for
   your specific card in the following questions.
 
-NI5010 support (EXPERIMENTAL)
+NI5010 support
 CONFIG_NI5010
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Note that this is still
+  <http://www.linuxdoc.org/docs.html#howto>. Note that this is still
   experimental code.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ni5010.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ni5010.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 NI5210 support
 CONFIG_NI52
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ni52.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ni52.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 NI6510 support
 CONFIG_NI65
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ni65.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ni65.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 RealTek RTL-8139C+ 10/100 PCI Fast Ethernet Adapter support
 CONFIG_8139CP
   This is a driver for the Fast Ethernet PCI network cards based on
   the RTL8139C+ chips. If you have one of those, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -8974,21 +10085,23 @@
 CONFIG_8139TOO
   This is a driver for the Fast Ethernet PCI network cards based on
   the RTL8139 chips. If you have one of those, say Y and read
-  Documentation/networking/8139too.txt as well as the Ethernet-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  <file:Documentation/networking/8139too.txt> as well as the
+  Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called 8139too.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called 8139too.o.
 
 Use PIO instead of MMIO
 CONFIG_8139TOO_PIO
   This instructs the driver to use programmed I/O ports (PIO) instead
-  of PCI shared memory (MMIO). This can possibly solve some problems in
-  case your mainboard has memory consistency issues.  If unsure, say N.
+  of PCI shared memory (MMIO).  This can possibly solve some problems
+  in case your mainboard has memory consistency issues.  If unsure,
+  say N.
 
-Support for automatic channel equalization (EXPERIMENTAL)
+Support for automatic channel equalization
 CONFIG_8139TOO_TUNE_TWISTER
   This implements a function which might come in handy in case you are
   using low quality on long cabling. It tries to match the transceiver
@@ -8998,40 +10111,40 @@
 Support for older RTL-8129/8130 boards
 CONFIG_8139TOO_8129
   This enables support for the older and uncommon RTL-8129 and
-  RTL-8130 chips, which support MII via an external transceiver, instead
-  of an internal one.  Disabling this option will save some memory
-  by making the code size smaller.  If unsure, say Y.
+  RTL-8130 chips, which support MII via an external transceiver,
+  instead of an internal one.  Disabling this option will save some
+  memory by making the code size smaller.  If unsure, say Y.
 
-SiS 900 PCI Fast Ethernet Adapter support
+SiS 900/7016 PCI Fast Ethernet Adapter support
 CONFIG_SIS900
   This is a driver for the Fast Ethernet PCI network cards based on
   the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in
-  SiS 630 and SiS 540 chipsets. If you have one of those, say Y and
+  SiS 630 and SiS 540 chipsets.  If you have one of those, say Y and
   read the Ethernet-HOWTO, available at
-  http://www.linuxdoc.org/docs.html#howto . Please read
-  Documentation/networking/sis900.txt and comments at the beginning of
-  drivers/net/sis900.c for more information.
+  <http://www.linuxdoc.org/docs.html#howto>.  Please read
+  <file:Documentation/networking/sis900.txt> and comments at the
+  beginning of <file:drivers/net/sis900.c> for more information.
 
   This driver also supports AMD 79C901 HomePNA so that you can use
   your phone line as a network cable.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called sis900.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called sis900.o.
 
 Packet Engines Yellowfin Gigabit-NIC / Symbios 53c885 support
 CONFIG_YELLOWFIN
   Say Y here if you have a Packet Engines G-NIC PCI Gigabit Ethernet
   adapter or the SYM53C885 Ethernet controller. The Gigabit adapter is
   used by the Beowulf Linux cluster project.  See
-  http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html for more
+  <http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html> for more
   information about this driver in particular and Beowulf in general.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called yellowfin.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called yellowfin.o.
 
 General Instruments Surfboard 1000
 CONFIG_NET_SB1000
@@ -9044,29 +10157,29 @@
 
   At present this driver only compiles as a module, so say M here if
   you have this card. The module will be called sb1000.o. Then read
-  Documentation/networking/README.sb1000 for information on how to use
-  this module, as it needs special ppp scripts for establishing a
-  connection. Further documentation and the necessary scripts can be
+  <file:Documentation/networking/README.sb1000> for information on how
+  to use this module, as it needs special ppp scripts for establishing
+  a connection. Further documentation and the necessary scripts can be
   found at:
 
-  http://www.jacksonville.net/~fventuri/
-  http://home.adelphia.net/~siglercm/sb1000.html
-  http://linuxpower.cx/~cable/
+  <http://www.jacksonville.net/~fventuri/>
+  <http://home.adelphia.net/~siglercm/sb1000.html>
+  <http://linuxpower.cx/~cable/>
 
   If you don't have this card, of course say N.
 
-Adaptec Starfire support (EXPERIMENTAL)
+Adaptec Starfire support
 CONFIG_ADAPTEC_STARFIRE
   Say Y here if you have an Adaptec Starfire (or DuraLAN) PCI network
   adapter. The DuraLAN chip is used on the 64 bit PCI boards from
   Adaptec e.g. the ANA-6922A. The older 32 bit boards use the tulip
   driver.
-  
+
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called starfire.o.
-  
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called starfire.o.
+
 Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support
 CONFIG_ACENIC
   Say Y here if you have an Alteon AceNIC, 3Com 3C985(B), NetGear
@@ -9078,16 +10191,16 @@
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called acenic.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called acenic.o.
 
-Omit support for older Tigon I based AceNICs
+Omit support for old Tigon I based AceNICs
 CONFIG_ACENIC_OMIT_TIGON_I
   Say Y here if you only have Tigon II based AceNICs and want to leave
   out support for the older Tigon I based cards which are no longer
   being sold (ie. the original Alteon AceNIC and 3Com 3C985 (non B
-  version)). This will reduce the size of the driver object by
-  app. 100KB. If you are not sure whether your card is a Tigon I or a
+  version)).  This will reduce the size of the driver object by
+  app. 100KB.  If you are not sure whether your card is a Tigon I or a
   Tigon II, say N here.
 
   The safe and default value for this is N.
@@ -9107,148 +10220,170 @@
   The driver also supports the following adapters from Allied Telesyn:
   - AT2970...
 
-  The dual link adapters support a link-failover feature.
-  Read Documentation/networking/sk98lin.txt for information about
+  The dual link adapters support a link-failover feature.  Read
+  <file:Documentation/networking/sk98lin.txt> for information about
   optional driver parameters.
   Questions concerning this driver may be addressed to:
     linux@syskonnect.de
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called sk98lin.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called sk98lin.o.
+
+Sun GEM support
+CONFIG_SUNGEM
+  Support for the Sun GEM chip, aka Sun GigabitEthernet/P 2.0.  See also
+  <http://www.sun.com/products-n-solutions/hardware/docs/pdf/806-3985-10.pdf>.
 
 MyriCOM Gigabit Ethernet support
 CONFIG_MYRI_SBUS
-  This driver supports MyriCOM Sbus gigabit ethernet cards.
+  This driver supports MyriCOM Sbus gigabit Ethernet cards.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called myri_sbus.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called myri_sbus.o.
 
 D-Link 2000-based Gigabit Ethernet support
 CONFIG_DL2K
   This driver supports D-Link 2000-based gigabit ethernet cards, which
   includes
-	D-Link DGE-550T Gigabit Ethernet Adapter.
-	D-Link DL2000-based Gigabit Ethernet Adapter.
+       D-Link DGE-550T Gigabit Ethernet Adapter.
+       D-Link DL2000-based Gigabit Ethernet Adapter.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called dl2k.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called dl2k.o.
 
 AMD LANCE and PCnet (AT1500 and NE2100) support
 CONFIG_LANCE
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Some LinkSys cards are
+  <http://www.linuxdoc.org/docs.html#howto>. Some LinkSys cards are
   of this type.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called lance.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called lance.o.
 
 SGI IOC3 Ethernet
 CONFIG_SGI_IOC3_ETH
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+National Semiconductor DP83902AV support
+CONFIG_STNIC
+  Support for cards based on the National Semiconductor DP83902AV
+  ST-NIC Serial Network Interface Controller for Twisted Pair.  This
+  is a 10Mbit/sec Ethernet controller.  Product overview and specs at
+  <http://www.national.com/pf/DP/DP83902A.html>.
+
+CompactFlash Connection Area
+CONFIG_CF_AREA5
+  If your board has "Directly Connected" CompactFlash, You should
+  select the area where your CF is connected to.
+
+  - "Area5" if CompactFlash is connected to Area 5 (0x14000000)
+  - "Area6" if it is connected to Area 6 (0x18000000)
+
+  "Area6" will work for most boards. For ADX, select "Area5".
 
 3COM cards
 CONFIG_NET_VENDOR_3COM
   If you have a network (Ethernet) card belonging to this class, say Y
   and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about 3COM cards. If you say Y, you will be asked for
   your specific card in the following questions.
 
-3c501 support
+3c501 "EtherLink" support
 CONFIG_EL1
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Also, consider buying a
+  <http://www.linuxdoc.org/docs.html#howto>.  Also, consider buying a
   new card, since the 3c501 is slow, broken, and obsolete: you will
-  have problems. Some people suggest to ping ("man ping") a nearby
+  have problems.  Some people suggest to ping ("man ping") a nearby
   machine every minute ("man cron") when using this card.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c501.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called 3c501.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-3c503 support
+3c503 "EtherLink II" support
 CONFIG_EL2
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c503.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called 3c503.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-3c505 support
+3c505 "EtherLink Plus" support
 CONFIG_ELPLUS
   Information about this network (Ethernet) card can be found in
-  Documentation/networking/3c505.txt. If you have a card of this type,
-  say Y and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <file:Documentation/networking/3c505.txt>.  If you have a card of
+  this type, say Y and read the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  3c505.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called 3c505.o.
 
-3c507 support (EXPERIMENTAL)
+3c507 (EtherLink 16) support
 CONFIG_EL16
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c507.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called 3c507.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-3c523 support 
+3c523 "EtherlinkMC" support
 CONFIG_ELMC
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c523.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called 3c523.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-3c527 support
+3c527 "EtherLink/MC 32" support
 CONFIG_ELMC_II
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c527.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called 3c527.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-3c509/3c579 support
+3c509/3c529 (MCA)/3c579 "EtherLink III"  support
 CONFIG_EL3
   If you have a network (Ethernet) card belonging to the 3Com
   EtherLinkIII series, say Y and read the Ethernet-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  from <http://www.linuxdoc.org/docs.html#howto>.
 
   If your card is not working you may need to use the DOS
   setup disk to disable Plug & Play mode, and to select the default
@@ -9256,23 +10391,23 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  3c509.o. 
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called 3c509.o.
 
 3c515 ISA Fast EtherLink
 CONFIG_3C515
   If you have a 3Com ISA EtherLink XL "Corkscrew" 3c515 Fast Ethernet
   network card, say Y and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  3c515.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called 3c515.o.
 
-3c59x/3c90x/3c575_Cardbus series "Vortex/Boomerang/Cyclone" support
+3c590/3c900 series (592/595/597) "Vortex/Boomerang/Cyclone" support
 CONFIG_VORTEX
   This option enables driver support for a large number of 10mbps and
   10/100mbps EISA, PCI and PCMCIA 3Com network cards:
@@ -9283,15 +10418,16 @@
   "Tornado"   (3c905)                                  PCI
   "Hurricane" (3c555/3cSOHO)                           PCI
 
-  If you have such a card, say Y and read the Ethernet-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto . More specific
-  information is in Documentation/networking/vortex.txt and in the
-  comments at the beginning of drivers/net/3c59x.c.
+  If you have such a card, say Y and read the Ethernet-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>. More
+  specific information is in
+  <file:Documentation/networking/vortex.txt> and in the comments at
+  the beginning of <file:drivers/net/3c59x.c>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.
 
 Other ISA cards
 CONFIG_NET_ISA
@@ -9299,19 +10435,20 @@
   bus system (that's the way the cards talks to the other components
   of your computer) is ISA (as opposed to EISA, VLB or PCI), say Y.
   Make sure you know the name of your card. Read the Ethernet-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto . 
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   If unsure, say Y.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the remaining ISA network card questions. If you say Y, you will be
   asked for your specific card in the following questions.
 
 Generic ARCnet support
 CONFIG_ARCNET
   If you have a network card of this type, say Y and check out the
-  (arguably) beautiful poetry in Documentation/networking/arcnet.txt.
+  (arguably) beautiful poetry in
+  <file:Documentation/networking/arcnet.txt>.
 
   You need both this driver, and the driver for the particular ARCnet
   chipset of your card. If you don't know, then it's probably a
@@ -9319,26 +10456,14 @@
   support" below.
 
   You might also want to have a look at the Ethernet-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto (even though ARCnet
+  from <http://www.linuxdoc.org/docs.html#howto>(even though ARCnet
   is not really Ethernet).
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called arcnet.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
-
-Enable arc0e (ARCnet "ether-encap" packet format)
-CONFIG_ARCNET_ETH
-  This allows you to use "Ethernet encapsulation" with your ARCnet
-  card via the virtual arc0e device. You only need arc0e if you want
-  to talk to nonstandard ARCnet software, specifically,
-  DOS/Windows-style "NDIS" drivers. You do not need to say Y here to
-  communicate with industry-standard RFC1201 implementations, like the
-  arcether.com packet driver or most DOS/Windows ODI drivers. RFC1201
-  is included automatically as the arc0 device. Please read the
-  ARCnet documentation in Documentation/networking/arcnet.txt for more
-  information about using arc0e and arc0s.
+  The module will be called arcnet.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 Enable old ARCNet packet format (RFC 1051)
 CONFIG_ARCNET_1051
@@ -9350,33 +10475,48 @@
   industry-standard RFC1201 implementations, like the arcether.com
   packet driver or most DOS/Windows ODI drivers. RFC1201 is included
   automatically as the arc0 device. Please read the ARCnet
-  documentation in Documentation/networking/arcnet.txt for more
+  documentation in <file:Documentation/networking/arcnet.txt> for more
   information about using arc0e and arc0s.
 
+Enable standard ARCNet packet format (RFC 1201)
+CONFIG_ARCNET_1201
+  This allows you to use RFC1201 with your ARCnet card via the virtual
+  arc0 device.  You need to say Y here to communicate with
+  industry-standard RFC1201 implementations, like the arcether.com
+  packet driver or most DOS/Windows ODI drivers.  Please read the
+  ARCnet documentation in <file:Documentation/networking/arcnet.txt>
+  for more information about using arc0.
+
+Enable raw mode packet interface
+CONFIG_ARCNET_RAW
+  ARCnet "raw mode" packet encapsulation, no soft headers.  Unlikely
+  to work unless talking to a copy of the same Linux arcnet driver,
+  but perhaps marginally faster in that case.
+
 ARCnet COM90xx (normal) chipset driver
 CONFIG_ARCNET_COM90xx
   This is the chipset driver for the standard COM90xx cards. If you
   have always used the old ARCnet driver without knowing what type of
-  card you had, this is probably the one for you. 
+  card you had, this is probably the one for you.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called com90xx.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called com90xx.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 ARCnet COM90xx (IO mapped) chipset driver
 CONFIG_ARCNET_COM90xxIO
   This is the chipset driver for the COM90xx cards, using them in
   IO-mapped mode instead of memory-mapped mode. This is slower than
   the normal driver. Only use it if your card doesn't support shared
-  memory. 
+  memory.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called com90io.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called com90io.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 ARCnet COM90xx (RIM I) chipset driver
 CONFIG_ARCNET_RIM_I
@@ -9387,197 +10527,198 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
-  want). The module will be called arc-rimi.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt as
-  well as Documentation/networking/net-modules.txt.
+  want). The module will be called arc-rimi.o.  If you want to compile
+  it as a module, say M here and read <file:Documentation/modules.txt>
+  as  well as <file:Documentation/networking/net-modules.txt>.
 
 ARCnet COM20020 chipset driver
 CONFIG_ARCNET_COM20020
   This is the driver for the new COM20020 chipset. It supports such
   things as promiscuous mode, so packet sniffing is possible, and
-  extra diagnostic information. 
+  extra diagnostic information.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called com20020.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called com20020.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
 
 Cabletron E21xx support
 CONFIG_E2100
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called e2100.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called e2100.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-CS89x0 support
+CS89x0 support (Daynaport CS and LC cards)
 CONFIG_CS89x0
   Support for CS89x0 chipset based Ethernet cards. If you have a
   network (Ethernet) card of this type, say Y and read the
   Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto as well as
-  Documentation/networking/cs89x0.txt.
+  <http://www.linuxdoc.org/docs.html#howto> as well as
+  <file:Documentation/networking/cs89x0.txt>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  cs89x.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called cs89x.o.
 
-DEPCA support
+DEPCA, DE10x, DE200, DE201, DE202, DE422 support
 CONFIG_DEPCA
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto as well as
-  drivers/net/depca.c.
+  <http://www.linuxdoc.org/docs.html#howto> as well as
+  <file:drivers/net/depca.c>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called
   depca.o.
 
-EtherWorks 3 support
+EtherWORKS 3 (DE203, DE204, DE205) support
 CONFIG_EWRK3
   This driver supports the DE203, DE204 and DE205 network (Ethernet)
   cards. If this is for you, say Y and read
-  Documentation/networking/ewrk3.txt in the kernel source as well as
-  the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <file:Documentation/networking/ewrk3.txt> in the kernel source as
+  well as the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  ewrk3.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called ewrk3.o.
 
 SEEQ8005 support
 CONFIG_SEEQ8005
-  This is a driver for the SEEQ 8005 network (Ethernet) card. If this
+  This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
   is for you, read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  ewrk3.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called ewrk3.o.
 
 AT1700/1720 support
 CONFIG_AT1700
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  at1700.o.
+  <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called at1700.o.
 
 FMV-181/182/183/184 support
 CONFIG_FMV18X
   If you have a Fujitsu FMV-181/182/183/184 network (Ethernet) card,
   say Y and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you use an FMV-183 or FMV-184 and it is not working, you may need
   to disable Plug & Play mode of the card.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called fmv18x.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. 
+  The module will be called fmv18x.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-EtherExpress PRO support
+EtherExpressPro support/EtherExpress 10 (i82595) support
 CONFIG_EEXPRESS_PRO
   If you have a network (Ethernet) card of this type, say Y. This
-  driver supports intel i82595{FX,TX} based boards. Note however 
+  driver supports intel i82595{FX,TX} based boards. Note however
   that the EtherExpress PRO/100 Ethernet card has its own separate
-  driver. Please read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  driver.  Please read the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called eepro.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called eepro.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-EtherExpress support
+EtherExpress 16 support
 CONFIG_EEXPRESS
   If you have an EtherExpress16 network (Ethernet) card, say Y and
   read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Note that the Intel
+  <http://www.linuxdoc.org/docs.html#howto>.  Note that the Intel
   EtherExpress16 card used to be regarded as a very poor choice
   because the driver was very unreliable. We now have a new driver
   that should do better.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  eexpress.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called eexpress.o.
 
 Packet Engines Hamachi GNIC-II support
 CONFIG_HAMACHI
   If you have a Gigabit Ethernet card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  hamachi.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called hamachi.o.
 
 HP PCLAN+ (27247B and 27252A) support
 CONFIG_HPLAN_PLUS
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called hp-plus.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called hp-plus.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 HP PCLAN (27245 and other 27xxx series) support
 CONFIG_HPLAN
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called hp.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called hp.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 HP 10/100VG PCLAN (ISA, EISA, PCI) support
 CONFIG_HP100
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  hp100.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called hp100.o.
 
 NE2000/NE1000 support
 CONFIG_NE2000
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Many Ethernet cards
+  <http://www.linuxdoc.org/docs.html#howto>.  Many Ethernet cards
   without a specific driver are compatible with NE2000.
 
   If you have a PCI NE2000 card however, say N here and Y to "PCI
@@ -9588,74 +10729,76 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ne.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ne.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-National Semiconductor DP83810 series PCI Ethernet support
+National Semiconductor DP8381x series PCI Ethernet support
 CONFIG_NATSEMI
   This driver is for the National Semiconductor DP83810 series,
-  including the 83815 chip.
-  More specific information and updates are available from 
-  http://www.scyld.com/network/natsemi.html
+  which is used in cards from PureData, NetGear, Linksys
+  and others, including the 83815 chip.
+  More specific information and updates are available from
+  <http://www.scyld.com/network/natsemi.html>.
 
 SK_G16 support
 CONFIG_SK_G16
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
 NE/2 (ne2000 MCA version) support
 CONFIG_NE2_MCA
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ne2.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ne2.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 SKnet MCA support
 CONFIG_SKMC
-  These are Micro Channel ethernet adapters. You need to say Y to "MCA
-  support" in order to use this driver. Supported cards are the SKnet
-  Junior MC2 and the SKnet MC2(+). The driver automatically
+  These are Micro Channel Ethernet adapters. You need to say Y to "MCA
+  support" in order to use this driver.  Supported cards are the SKnet
+  Junior MC2 and the SKnet MC2(+).  The driver automatically
   distinguishes between the two cards. Note that using multiple boards
-  of different type hasn't been tested with this driver. Say Y if you
-  have one of these ethernet adapters.
+  of different type hasn't been tested with this driver.  Say Y if you
+  have one of these Ethernet adapters.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called sk_mca.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module is called sk_mca.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 IBM LAN Adapter/A support
 CONFIG_IBMLANA
-  This is a Micro Channel ethernet adapter.  You need to set CONFIG_MCA
-  to use this driver.  It is both available as an in-kernel driver and
-  as a module ( = code which can be inserted in and removed from the
-  running kernel whenever you want). If you want to compile it as a module,
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. If you plan to use more than
-  one network card under linux, read the Multiple-Ethernet-mini-HOWTO,
-  available from sunsite.unc.edu:/pub/Linux/docs/HOWTO/mini.  The only
-  currently supported card is the IBM LAN Adapter/A for Ethernet.  It will
-  both support 16K and 32K memory windows, however a 32K window gives
-  a better security against packet losses.  Usage of multiple boards with
-  this driver should be possible, but has not been tested up to now due
-  to lack of hardware.
+  This is a Micro Channel Ethernet adapter.  You need to set
+  CONFIG_MCA to use this driver.  It is both available as an in-kernel
+  driver and as a module ( = code which can be inserted in and removed
+  from the running kernel whenever you want).  If you want to compile
+  it as a module, say M here and read <file:Documentation/modules.txt>
+  as well as <file:Documentation/networking/net-modules.txt>.
+  If you plan to use more than one network card under linux, read the
+  Multiple-Ethernet-mini-HOWTO, available from
+  <ftp://sunsite.unc.edu:/pub/Linux/docs/HOWTO/mini>.  The only
+  currently supported card is the IBM LAN Adapter/A for Ethernet.  It
+  will both support 16K and 32K memory windows, however a 32K window
+  gives a better security against packet losses.  Usage of multiple
+  boards with this driver should be possible, but has not been tested
+  up to now due to lack of hardware.
 
 EISA, VLB, PCI and on board controllers
 CONFIG_NET_PCI
   This is another class of network cards which attach directly to the
   bus. If you have one of those, say Y and read the Ethernet-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about this class of network cards. If you say Y, you
   will be asked for your specific card in the following questions. If
   you are unsure, say Y.
@@ -9664,98 +10807,100 @@
 CONFIG_PCNET32
   If you have a PCnet32 or PCnetPCI based network (Ethernet) card,
   answer Y here and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called pcnet32.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called pcnet32.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 Ansel Communications EISA 3200 support
 CONFIG_AC3200
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ac3200.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ac3200.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-Mylex EISA LNE390A/LNE390B support (EXPERIMENTAL)
+Mylex EISA LNE390A/LNE390B support
 CONFIG_LNE390
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called lne390.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called lne390.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 Novell/Eagle/Microdyne NE3210 EISA support
 CONFIG_NE3210
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Note that this driver
+  <http://www.linuxdoc.org/docs.html#howto>.  Note that this driver
   will NOT WORK for NE3200 cards as they are completely different.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ne3210.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called ne3210.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 Apricot Xen-II on board Ethernet
 CONFIG_APRICOT
   If you have a network (Ethernet) controller of this type, say Y and
   read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. The module will be called
-  apricot.o.
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called apricot.o.
 
 Generic DECchip & DIGITAL EtherWORKS PCI/EISA
 CONFIG_DE4X5
   This is support for the DIGITAL series of PCI/EISA Ethernet cards.
-  These include the DE425, DE434, DE435, DE450 and DE500 models. If
+  These include the DE425, DE434, DE435, DE450 and DE500 models.  If
   you have a network card of this type, say Y and read the
   Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . More specific
-  information is contained in Documentation/networking/de4x5.txt.
+  <http://www.linuxdoc.org/docs.html#howto>. More specific
+  information is contained in
+  <file:Documentation/networking/de4x5.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called de4x5.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called de4x5.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 DECchip Tulip (dc21x4x) PCI support
 CONFIG_TULIP
   This driver is developed for the SMC EtherPower series Ethernet
-  cards and also works with cards based on the DECchip
-  21040/21041/21140 (Tulip series) chips. Some LinkSys PCI cards are
-  of this type. (If your card is NOT SMC EtherPower 10/100 PCI
+  cards and also works with cards based on the DECchip 
+  21040/21041/21140 (Tulip series) chips.  Some LinkSys PCI cards are
+  of this type.  (If your card is NOT SMC EtherPower 10/100 PCI
   (smc9332dst), you can also try the driver for "Generic DECchip"
-  cards, above. However, most people with a network card of this type
+  cards, above.  However, most people with a network card of this type
   will say Y here.) Do read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . More specific
-  information is contained in Documentation/networking/tulip.txt.
+  <http://www.linuxdoc.org/docs.html#howto>.  More specific
+  information is contained in 
+  <file:Documentation/networking/tulip.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called tulip.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called tulip.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-New Tulip bus configuration (EXPERIMENTAL)
-CONFIG_TULIP_MWI
+New Tulip bus configuration
+CONFIG_TULIP_MWI 
   This configures your Tulip card specifically for the card and
   system cache line size type you are using.
 
@@ -9763,34 +10908,34 @@
 
   If unsure, say N.
 
-Digi Intl. RightSwitch support
+Digi Intl. RightSwitch SE-X support
 CONFIG_DGRS
   This is support for the Digi International RightSwitch series of
   PCI/EISA Ethernet switch cards. These include the SE-4 and the SE-6
-  models. If you have a network card of this type, say Y and read the
+  models.  If you have a network card of this type, say Y and read the
   Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . More specific
-  information is contained in Documentation/networking/dgrs.txt.
+  <http://www.linuxdoc.org/docs.html#howto>.  More specific
+  information is contained in <file:Documentation/networking/dgrs.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called dgrs.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called dgrs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-EtherExpress PRO/100 support
+EtherExpress Pro/100 support
 CONFIG_EEPRO100
   If you have an Intel EtherExpress PRO/100 PCI network (Ethernet)
   card, say Y and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called eepro100.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called eepro100.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
 
-Enable Power Management (EXPERIMENTAL)
+Enable Power Management
 CONFIG_EEPRO100_PM
   Many Intel EtherExpress PRO/100 PCI network cards are capable
   of providing power management capabilities.  To make use of these
@@ -9802,34 +10947,40 @@
 
   It is recommended to say N here.
 
-ICL EtherTeam 16i/32 support (EXPERIMENTAL)
+Myson MTD-8xx PCI Ethernet support
+CONFIG_FEALNX
+  Say Y here to support the Mysom MTD-800 family of PCI-based Ethernet
+  cards. Specifications and data at
+  <http:www.myson.com.hk/mtd/datasheet>.
+
+ICL EtherTeam 16i/32 support
 CONFIG_ETH16I
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called eth16i.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called eth16i.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-TI ThunderLAN support (EXPERIMENTAL)
+TI ThunderLAN support
 CONFIG_TLAN
   If you have a PCI Ethernet network card based on the ThunderLAN chip
   which is supported by this driver, say Y and read the
   Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Devices currently supported by this driver are Compaq Netelligent,
-  Compaq NetFlex and Olicom cards. Please read the file
-  Documentation/networking/tlan.txt for more details.
+  Compaq NetFlex and Olicom cards.  Please read the file
+  <file:Documentation/networking/tlan.txt> for more details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called tlan.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called tlan.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
   Please email feedback to  torben.mathiasen@compaq.com.
 
@@ -9840,131 +10991,164 @@
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called via-rhine.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called via-rhine.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
 
-PCI DM9102(A)/DM9132/DM9801 support 
+Davicom DM910x/DM980x support
 CONFIG_DM9102
   This driver is for DM9102(A)/DM9132/DM9801 compatible PCI cards from
-  Davicom ( http://www.davicom.com.tw ). If you have such a network
-  (Ethernet) card, say Y. Some information is contained in the file 
-  Documentation/networking/dmfe.txt.
- 
+  Davicom (<http://www.davicom.com.tw>).  If you have such a network
+  (Ethernet) card, say Y.  Some information is contained in the file
+  <file:Documentation/networking/dmfe.txt>.
+
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called dmfe.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called dmfe.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
-Racal-Interlan EISA ES3210 support (EXPERIMENTAL)
+Racal-Interlan EISA ES3210 support
 CONFIG_ES3210
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called es3210.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
+  The module will be called es3210.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
 
 SMC EtherPower II
 CONFIG_EPIC100
   This driver is for the SMC EtherPower II 9432 PCI Ethernet NIC,
   which is based on the SMC83c17x (EPIC/100).
   More specific information and updates are available from
-  http://www.scyld.com/network/epic100.html
+  <http://www.scyld.com/network/epic100.html>.
 
-SGI Seeq ethernet controller support
+DEC LANCE Ethernet controller support
+CONFIG_DECLANCE
+  This driver is for the series of Ethernet controllers produced by
+  DEC (now Compaq) based on the AMD Lance chipset, including the
+  DEPCA series.  (This chipset is better known via the NE2100 cards.)
+
+SGI Seeq Ethernet controller support
 CONFIG_SGISEEQ
   Say Y here if you have an Seeq based Ethernet network card. This is
   used in many Silicon Graphics machines.
 
-Sundance "Alta" PCI Ethernet support
+Sundance Alta PCI Ethernet support
 CONFIG_SUNDANCE
   This driver is for the Sundance "Alta" chip.
   More specific information and updates are available from
-  http://www.scyld.com/network/sundance.html
+  <http://www.scyld.com/network/sundance.html>.
+
+Sun3/Sun3x on-board LANCE support
+CONFIG_SUN3LANCE
+  Most Sun3 and Sun3x motherboards (including the 3/50, 3/60 and 3/80)
+  featured an AMD Lance 10Mbit Ethernet controller on board; say Y
+  here to compile in the Linux driver for this and enable Ethernet.
+  General Linux information on the Sun 3 and 3x series (now
+  discontinued) is at
+  <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+  If you're not building a kernel for a Sun 3, say N.
+
+Sun3 on-board Intel 82586 support
+CONFIG_SUN3_82586
+  This driver enables support for the on-board Intel 82586 based
+  Ethernet adapter found on Sun 3/1xx and 3/2xx motherboards.  Note
+  that this driver does not support 82586-based adapters on additional
+  VME boards.
 
 Winbond W89c840 PCI Ethernet support
 CONFIG_WINBOND_840
   This driver is for the Winbond W89c840 chip.  It also works with
   the TX9882 chip on the Compex RL100-ATX board.
   More specific information and updates are available from
-  http://www.scyld.com/network/drivers.html
+  <http://www.scyld.com/network/drivers.html>.
 
-Zenith Z-Note support (EXPERIMENTAL)
+Zenith Z-Note support
 CONFIG_ZNET
   The Zenith Z-Note notebook computer has a built-in network
   (Ethernet) card, and this is the Linux driver for it. Note that the
   IBM Thinkpad 300 is compatible with the Z-Note and is also supported
   by this driver. Read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+Philips SAA9730 Ethernet support
+CONFIG_LAN_SAA9730
+  The SAA9730 is a combined multimedia and peripheral controller used
+  in thin clients, Internet access terminals, and diskless
+  workstations.
+  See <http://www.semiconductors.philips.com/pip/SAA9730_flyer_1>.
 
 Pocket and portable adapters
 CONFIG_NET_POCKET
   Cute little network (Ethernet) devices which attach to the parallel
   port ("pocket adapters"), commonly used with laptops. If you have
   one of those, say Y and read the Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to plug a network (or some other) card into the PCMCIA
   (or PC-card) slot of your laptop instead (PCMCIA is the standard for
   credit card size extension cards used by all modern laptops), you
   need the pcmcia-cs package (location contained in the file
-  Documentation/Changes) and you can say N here.
+  <file:Documentation/Changes>) and you can say N here.
 
   Laptop users should read the Linux Laptop home page at
-  http://www.cs.utexas.edu/users/kharker/linux-laptop/ .
+  <http://www.cs.utexas.edu/users/kharker/linux-laptop/>.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about this class of network devices. If you say Y, you
   will be asked for your specific device in the following questions.
 
 AT-LAN-TEC/RealTek pocket adapter support
 CONFIG_ATP
   This is a network (Ethernet) device which attaches to your parallel
-  port. Read drivers/net/atp.c as well as the Ethernet-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto , if you
-  want to use this. If you intend to use this driver, you should have
+  port. Read <file:drivers/net/atp.c> as well as the Ethernet-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>, if you
+  want to use this.  If you intend to use this driver, you should have
   said N to the "Parallel printer support", because the two drivers
   don't like each other.
 
   If you want to compile this driver as a module however ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
-  The module will be called atp.o.
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called atp.o.
 
 D-Link DE600 pocket adapter support
 CONFIG_DE600
   This is a network (Ethernet) device which attaches to your parallel
-  port. Read Documentation/networking/DLINK.txt as well as the
+  port. Read <file:Documentation/networking/DLINK.txt> as well as the
   Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , if you want to use
+  <http://www.linuxdoc.org/docs.html#howto>, if you want to use
   this. It is possible to have several devices share a single parallel
   port and it is safe to compile the corresponding drivers into the
   kernel.
 
   If you want to compile this driver as a module however ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
   The module will be called de600.o.
 
 D-Link DE620 pocket adapter support
 CONFIG_DE620
   This is a network (Ethernet) device which attaches to your parallel
-  port. Read Documentation/networking/DLINK.txt as well as the
+  port. Read <file:Documentation/networking/DLINK.txt> as well as the
   Ethernet-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , if you want to use
+  <http://www.linuxdoc.org/docs.html#howto>, if you want to use
   this. It is possible to have several devices share a single parallel
   port and it is safe to compile the corresponding drivers into the
   kernel.
 
   If you want to compile this driver as a module however ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
   The module will be called de620.o.
 
 Token Ring driver support
@@ -9975,41 +11159,41 @@
   connected to such a Token Ring network and want to use your Token
   Ring card under Linux, say Y here and to the driver for your
   particular card below and read the Token-Ring mini-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto . Most people can
+  from <http://www.linuxdoc.org/docs.html#howto>. Most people can
   say N here.
 
 IBM Tropic chipset based adapter support
 CONFIG_IBMTR
   This is support for all IBM Token Ring cards that don't use DMA. If
   you have such a beast, say Y and read the Token-Ring mini-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   Warning: this driver will almost definitely fail if more than one
-  active Token Ring card is present. 
+  active Token Ring card is present.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called ibmtr.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 IBM Olympic chipset PCI adapter support
 CONFIG_IBMOL
-  This is support for all non-Lanstreamer IBM PCI Token Ring Cards. 
+  This is support for all non-Lanstreamer IBM PCI Token Ring Cards.
   Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
   Wake On Lan, and PCI 100/16/4 adapters.
 
   If you have such an adapter, say Y and read the Token-Ring
   mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called olympic.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
-  Also read the file Documentation/networking/olympic.txt or check the
+  Also read <file:Documentation/networking/olympic.txt> or check the
   Linux Token Ring Project site for the latest information at
-  http://www.linuxtr.net .
+  <http://www.linuxtr.net>.
 
 IBM Lanstreamer chipset PCI adapter support
 CONFIG_IBMLS
@@ -10017,12 +11201,12 @@
 
   If you have such an adapter, say Y and read the Token-Ring
   mini-HOWTO available via FTP (user:anonymous) from
-  ftp://metalab.unc/edu/pub/Linux/docs/HOWTO.
+  <ftp://metalab.unc/edu/pub/Linux/docs/HOWTO>.
 
   This driver is also available as a modules ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The modules will be called lanstreamer.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 Generic TMS380 Token Ring ISA/PCI/MCA/EISA adapter support
 CONFIG_TMS380TR
@@ -10037,15 +11221,15 @@
 
   If you have such an adapter and would like to use it, say Y and
   read the Token-Ring mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
-  Also read the file Documentation/networking/tms380tr.txt or
-  check http://www.auk.cx/tms380tr/ .
+  Also read the file <file:Documentation/networking/tms380tr.txt> or
+  check <http://www.auk.cx/tms380tr/>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called tms380tr.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 Generic TMS380 PCI support
 CONFIG_TMSPCI
@@ -10060,19 +11244,31 @@
   This driver is available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called tmspci.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Generic TMS380 ISA support
+CONFIG_TMSISA
+  This tms380 module supports generic TMS380-based ISA cards.
+
+  These cards are known to work:
+     - SysKonnect TR4/16 ISA (SK-4190)
+
+  This driver is available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tmsisa.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 Madge Smart 16/4 PCI Mk2 support
 CONFIG_ABYSS
-  This tms380 module supports the Madge Smart 16/4 PCI Mk2 
+  This tms380 module supports the Madge Smart 16/4 PCI Mk2
   cards (51-02).
 
   This driver is available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called abyss.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
-Madge Smart 16/4 Ringode MicroChannel 
+Madge Smart 16/4 Ringnode MicroChannel
 CONFIG_MADGEMC
   This tms380 module supports the Madge Smart 16/4 MC16 and MC32
   MicroChannel adapters.
@@ -10080,9 +11276,9 @@
   This driver is available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called madgemc.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
-SMC ISA TokenRing adapter support
+SMC ISA/MCA Token Ring adapter support
 CONFIG_SMCTR
   This is support for the ISA and MCA SMC Token Ring cards,
   specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A
@@ -10090,13 +11286,13 @@
 
   If you have such an adapter and would like to use it, say Y or M and
   read the Token-Ring mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto and the file
-  Documentation/networking/smctr.txt.
+  <http://www.linuxdoc.org/docs.html#howto> and the file
+  <file:Documentation/networking/smctr.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called smctr.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 Sun Happy Meal 10/100baseT support
 CONFIG_HAPPYMEAL
@@ -10108,60 +11304,62 @@
   This support is also available as a module called sunhme.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Sun Lance support
 CONFIG_SUNLANCE
   This driver supports the "le" interface present on all 32-bit Sparc
-  systems, on some older Ultra systems and as an Sbus option.
+  systems, on some older Ultra systems and as an Sbus option.  These
+  cards are based on the AMD Lance chipset, which is better known
+  via the NE2100 cards.
 
   This support is also available as a module called sunlance.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-Sun BigMAC 10/100baseT support (EXPERIMENTAL)
+Sun BigMAC 10/100baseT support
 CONFIG_SUNBMAC
   This driver supports the "be" interface available as an Sbus option.
-  This is Sun's older 100baseT ethernet device.
+  This is Sun's older 100baseT Ethernet device.
 
   This support is also available as a module called sunbmac.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Sun QuadEthernet support
 CONFIG_SUNQE
-  This driver supports the "qe" 10baseT ethernet device, available as
+  This driver supports the "qe" 10baseT Ethernet device, available as
   an Sbus option. Note that this is not the same as Quad FastEthernet
   "qfe" which is supported by the Happy Meal driver instead.
 
   This support is also available as a module called sunqe.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-Traffic Shaper (EXPERIMENTAL)
+Traffic Shaper
 CONFIG_SHAPER
   The traffic shaper is a virtual network device that allows you to
   limit the rate of outgoing data flow over some other network device.
   The traffic that you want to slow down can then be routed through
-  these virtual devices. See Documentation/networking/shaper.txt for
-  more information.
+  these virtual devices. See
+  <file:Documentation/networking/shaper.txt> for more information.
 
   An alternative to this traffic shaper is the experimental
   Class-Based Queueing (CBQ) scheduling support which you get if you
   say Y to "QoS and/or fair queueing" above.
 
   To set up and configure shaper devices, you need the shapecfg
-  program, available from ftp://shadow.cabi.net/pub/Linux in the
+  program, available from <ftp://shadow.cabi.net/pub/Linux> in the
   shaper package.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called shaper.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called shaper.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
 
 FDDI driver support
 CONFIG_FDDI
@@ -10196,8 +11394,8 @@
   - Netelligent 100 FDDI DAS UTP
   - Netelligent 100 FDDI SAS UTP
   - Netelligent 100 FDDI SAS Fibre MIC
-  
-  Read Documentation/networking/skfp.txt for information about
+
+  Read <file:Documentation/networking/skfp.txt> for information about
   the driver.
 
   Questions concerning this driver can be addressed to:
@@ -10205,10 +11403,10 @@
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called skfp.o.
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called skfp.o.
 
-HIgh Performance Parallel Interface support (EXPERIMENTAL)
+HIgh Performance Parallel Interface (HIPPI) support
 CONFIG_HIPPI
   HIgh Performance Parallel Interface (HIPPI) is a 800Mbit/sec and
   1600Mbit/sec dual-simplex switched or point-to-point network. HIPPI
@@ -10218,16 +11416,16 @@
   and have a HIPPI network card in your computer that you want to use
   under Linux, say Y here (you must also remember to enable the driver
   for your HIPPI card below). Most people will say N here.
-  
+
 Essential RoadRunner HIPPI PCI adapter support
 CONFIG_ROADRUNNER
   Say Y here if this is your PCI HIPPI network card.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called rrunner.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If unsure,
-  say N.
+  The module will be called rrunner.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
 
 Use large TX/RX rings
 CONFIG_ROADRUNNER_LARGE_RINGS
@@ -10237,80 +11435,92 @@
   kernel code or by user space programs. Say Y here only if you have
   the memory.
 
-Acorn Ether1 card
+Acorn Ether1 support
 CONFIG_ARM_ETHER1
   If you have an Acorn system with one of these (AKA25) network cards,
   you should say Y to this option if you wish to use it with Linux.
 
-Acorn/ANT Ether3 card
+Acorn/ANT Ether3 support
 CONFIG_ARM_ETHER3
   If you have an Acorn system with one of these network cards, you
   should say Y to this option if you wish to use it with Linux.
 
-I Cubed EtherH card
+I-Cubed EtherH support
 CONFIG_ARM_ETHERH
   If you have an Acorn system with one of these network cards, you
   should say Y to this option if you wish to use it with Linux.
 
-EBSA-110 Ethernet interface
+EBSA-110 Ethernet interface (AM79C961A)
 CONFIG_ARM_AM79C961A
   If you wish to compile a kernel for the EBSA-110, then you should
   always answer Y to this.
 
-Support CDROM drives that are not SCSI or IDE/ATAPI
+Support Thumb instructions
+CONFIG_ARM_THUMB
+  Say Y if you want to have kernel support for ARM Thumb instructions,
+  fault handlers, and system calls.
+
+  The Thumb instruction set is a compressed form of the standard ARM
+  instruction set resulting in smaller binaries at the expense of
+  slightly less efficient code.
+
+  If you don't know what this all is, saying Y is a safe choice.
+
+Support CD-ROM drives that are not SCSI or IDE/ATAPI
 CONFIG_CD_NO_IDESCSI
-  If you have a CDROM drive that is neither SCSI nor IDE/ATAPI, say Y
-  here, otherwise N. Read the CDROM-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  If you have a CD-ROM drive that is neither SCSI nor IDE/ATAPI, say Y
+  here, otherwise N. Read the CD-ROM-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause this configure script to skip all
-  the questions about these CDROM drives. If you are unsure what you
+  kernel: saying N will just cause the configurator to skip all
+  the questions about these CD-ROM drives. If you are unsure what you
   have, say Y and find out whether you have one of the following
-  drives. 
+  drives.
 
-  For each of these drivers, a file Documentation/cdrom/<driver_name>
+  For each of these drivers, a file Documentation/cdrom/{driver_name}
   exists. Especially in cases where you do not know exactly which kind
   of drive you have you should read there. Most of these drivers use a
-  file drivers/cdrom/<driver_name>.h where you can define your
-  interface parameters and switch some internal goodies. 
+  file drivers/cdrom/{driver_name}.h where you can define your
+  interface parameters and switch some internal goodies.
 
-  All these CDROM drivers are also usable as a module ( = code which
+  All these CD-ROM drivers are also usable as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
   want). If you want to compile them as module, say M instead of Y and
-  read Documentation/modules.txt. 
+  read <file:Documentation/modules.txt>.
 
-  If you want to use any of these CDROM drivers, you also have to
-  answer Y or M to "ISO 9660 CDROM file system support" below (this
+  If you want to use any of these CD-ROM drivers, you also have to
+  answer Y or M to "ISO 9660 CD-ROM file system support" below (this
   answer will get "defaulted" for you if you enable any of the Linux
-  CDROM drivers).
+  CD-ROM drivers).
 
-Sony CDU31A/CDU33A CDROM support
+Sony CDU31A/CDU33A CD-ROM support
 CONFIG_CDU31A
-  These CDROM drives have a spring-pop-out caddyless drawer, and a
-  rectangular green LED centered beneath it. NOTE: these CDROM drives
-  will not be auto detected by the kernel at boot time; you have to
-  provide the interface address as an option to the kernel at boot
-  time as described in Documentation/cdrom/cdu31a or fill in your
-  parameters into drivers/cdrom/cdu31a.c. Try "man bootparam" or
-  see the documentation of your boot loader (lilo or loadlin) about
-  how to pass options to the kernel.
+  These CD-ROM drives have a spring-pop-out caddyless drawer, and a
+  rectangular green LED centered beneath it.  NOTE: these CD-ROM
+  drives will not be auto detected by the kernel at boot time; you
+  have to provide the interface address as an option to the kernel at
+  boot time as described in <file:Documentation/cdrom/cdu31a> or fill
+  in your parameters into <file:drivers/cdrom/cdu31a.c>.  Try "man
+  bootparam" or see the documentation of your boot loader (lilo or
+  loadlin) about how to pass options to the kernel.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called cdu31a.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called cdu31a.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Standard Mitsumi [no XA/Multisession] CDROM support
+Standard Mitsumi [no XA/Multisession] CD-ROM support
 CONFIG_MCD
   This is the older of the two drivers for the older Mitsumi models
   LU-005, FX-001 and FX-001D. This is not the right driver for the
   FX-001DE and the triple or quad speed models (all these are
-  IDE/ATAPI models). Please also the file Documentation/cdrom/mcd.
+  IDE/ATAPI models). Please also the file
+  <file:Documentation/cdrom/mcd>.
 
   With the old LU-005 model, the whole drive chassis slides out for cd
   insertion. The FX-xxx models use a motorized tray type mechanism.
@@ -10318,184 +11528,201 @@
   (PhotoCDs). There is a new driver (next question) which can do
   this. If you want that one, say N here.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called mcd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 IRQ channel for Mitsumi CD-ROM
 CONFIG_MCD_IRQ
   This allows you to specify the default value of the IRQ used by the
   driver. This setting can be overridden by passing the "mcd="
   parameter to the kernel at boot time (or at module load time if you
-  said M to "Standard Mitsumi CDROM support").
+  said M to "Standard Mitsumi CD-ROM support").
 
 I/O base address for Mitsumi CD-ROM
 CONFIG_MCD_BASE
   This allows you to specify the default value of the I/O base address
   used by the driver. This setting can be overridden by passing the
   "mcd=" parameter to the kernel at boot time (or at module load time
-  if you said M to "Standard Mitsumi CDROM support").
+  if you said M to "Standard Mitsumi CD-ROM support").
 
-Mitsumi [XA/MultiSession] support
+Mitsumi [XA/MultiSession] CD-ROM support
 CONFIG_MCDX
   Use this driver if you want to be able to read XA or MultiSession
   CDs (PhotoCDs) as well as ordinary CDs with your Mitsumi LU-005,
-  FX-001 or FX-001D CDROM drive. In addition, this driver uses much
+  FX-001 or FX-001D CD-ROM drive. In addition, this driver uses much
   less kernel memory than the old one, if that is a concern. This
   driver is able to support more than one drive, but each drive needs
   a separate interface card. Please read the file
-  Documentation/cdrom/mcdx.
+  <file:Documentation/cdrom/mcdx>.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called mcdx.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Matsushita/Panasonic/Creative, Longshine, TEAC CDROM support
+Matsushita/Panasonic/Creative, Longshine, TEAC CD-ROM support
 CONFIG_SBPCD
   This driver supports most of the drives which use the Panasonic or
-  Sound Blaster interface. Please read the file
-  Documentation/cdrom/sbpcd.
+  Sound Blaster interface.  Please read the file
+  <file:Documentation/cdrom/sbpcd>.
 
   The Matsushita CR-521, CR-522, CR-523, CR-562, CR-563 drives
   (sometimes labeled "Creative"), the Creative Labs CD200, the
-  Longshine LCS-7260, the "IBM External ISA CDROM" (in fact a CR-56x
-  model), the TEAC CD-55A fall under this category. Some other
+  Longshine LCS-7260, the "IBM External ISA CD-ROM" (in fact a CR-56x
+  model), the TEAC CD-55A fall under this category.  Some other
   "electrically compatible" drives (Vertos, Genoa, some Funai models)
   are currently not supported; for the Sanyo H94A drive currently a
-  separate driver (asked later) is responsible. Most drives have a
+  separate driver (asked later) is responsible.  Most drives have a
   uniquely shaped faceplate, with a caddyless motorized drawer, but
-  without external brand markings. The older CR-52x drives have a
-  caddy and manual loading/eject, but still no external markings. The
+  without external brand markings.  The older CR-52x drives have a
+  caddy and manual loading/eject, but still no external markings.  The
   driver is able to do an extended auto-probing for interface
   addresses and drive types; this can help to find facts in cases you
   are not sure, but can consume some time during the boot process if
-  none of the supported drives gets found. Once your drive got found,
-  you should enter the reported parameters into drivers/cdrom/sbpcd.h
-  and set "DISTRIBUTION 0" there.
-
-  This driver can support up to four CDROM controller cards, and each
-  card can support up to four CDROM drives; if you say Y here, you
-  will be asked how many controller cards you have. If compiled as a
+  none of the supported drives gets found.  Once your drive got found,
+  you should enter the reported parameters into
+  <file:drivers/cdrom/sbpcd.h> and set "DISTRIBUTION 0" there.
+
+  This driver can support up to four CD-ROM controller cards, and each
+  card can support up to four CD-ROM drives; if you say Y here, you
+  will be asked how many controller cards you have.  If compiled as a
   module, only one controller card (but with up to four drives) is
   usable.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called sbpcd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called sbpcd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Matsushita/Panasonic, ... second CDROM controller support
+Matsushita/Panasonic, ... second CD-ROM controller support
 CONFIG_SBPCD2
-  Say Y here only if you have two CDROM controller cards of this type
-  (usually only if you have more than four drives). You should enter
+  Say Y here only if you have two CD-ROM controller cards of this type
+  (usually only if you have more than four drives).  You should enter
   the parameters for the second, third and fourth interface card into
-  include/linux/sbpcd.h before compiling the new kernel. Read
-  the file Documentation/cdrom/sbpcd.
+  <file:include/linux/sbpcd.h> before compiling the new kernel.  Read
+  the file <file:Documentation/cdrom/sbpcd>.
+
+Matsushita/Panasonic, ... third CD-ROM controller support
+CONFIG_SBPCD3
+  Say Y here only if you have three CD-ROM controller cards of this
+  type (usually only if you have more than six drives).  You should
+  enter the parameters for the second, third and fourth interface card
+  into <file:include/linux/sbpcd.h> before compiling the new kernel.
+  Read the file <file:Documentation/cdrom/sbpcd>.
+
+Matsushita/Panasonic, ... fourth CD-ROM controller support
+CONFIG_SBPCD4
+  Say Y here only if you have four CD-ROM controller cards of this
+  type (usually only if you have more than eight drives).  You should
+  enter the parameters for the second, third and fourth interface card
+  into <file:include/linux/sbpcd.h> before compiling the new kernel.
+  Read the file <file:Documentation/cdrom/sbpcd>.
 
-Aztech/Orchid/Okano/Wearnes/TXC/CyDROM CDROM support
+Aztech/Orchid/Okano/Wearnes/TXC/CyDROM CD-ROM support
 CONFIG_AZTCD
   This is your driver if you have an Aztech CDA268-01A, Orchid
-  CD-3110, Okano or Wearnes CDD110, Conrad TXC, or CyCDROM CR520 or
-  CR540 CDROM drive. This driver -- just like all these CDROM drivers
-  -- is NOT for CDROM drives with IDE/ATAPI interfaces, such as Aztech
-  CDA269-031SE. Please read the file Documentation/cdrom/aztcd. 
+  CD-3110, Okano or Wearnes CDD110, Conrad TXC, or CyCD-ROM CR520 or
+  CR540 CD-ROM drive.  This driver -- just like all these CD-ROM
+  drivers -- is NOT for CD-ROM drives with IDE/ATAPI interfaces, such
+  as Aztech CDA269-031SE. Please read the file
+  <file:Documentation/cdrom/aztcd>.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs.
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called aztcd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called aztcd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Sony CDU535 CDROM support
+Sony CDU535 CD-ROM support
 CONFIG_CDU535
-  This is the driver for the older Sony CDU-535 and CDU-531 CDROM
-  drives. Please read the file Documentation/cdrom/sonycd535.
+  This is the driver for the older Sony CDU-535 and CDU-531 CD-ROM
+  drives. Please read the file <file:Documentation/cdrom/sonycd535>.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs.
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called sonycd535.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
-Goldstar R420 CDROM support
+Goldstar R420 CD-ROM support
 CONFIG_GSCD
-  If this is your CDROM drive, say Y here. As described in the file
-  Documentation/cdrom/gscd, you might have to change a setting
-  in the file drivers/cdrom/gscd.h before compiling the
-  kernel. Please read the file Documentation/cdrom/gscd. 
+  If this is your CD-ROM drive, say Y here.  As described in the file
+  <file:Documentation/cdrom/gscd>, you might have to change a setting
+  in the file <file:drivers/cdrom/gscd.h> before compiling the
+  kernel.  Please read the file <file:Documentation/cdrom/gscd>.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called gscd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called gscd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Philips/LMS CM206 CDROM support
+Philips/LMS CM206 CD-ROM support
 CONFIG_CM206
-  If you have a Philips/LMS CDROM drive cm206 in combination with a
+  If you have a Philips/LMS CD-ROM drive cm206 in combination with a
   cm260 host adapter card, say Y here. Please also read the file
-  Documentation/cdrom/cm206. 
+  <file:Documentation/cdrom/cm206>.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called cm206.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Optics Storage DOLPHIN 8000AT CDROM support
+Optics Storage DOLPHIN 8000AT CD-ROM support
 CONFIG_OPTCD
   This is the driver for the 'DOLPHIN' drive with a 34-pin Sony
   compatible interface. It also works with the Lasermate CR328A. If
   you have one of those, say Y. This driver does not work for the
-  Optics Storage 8001 drive; use the IDE-ATAPI CDROM driver for that
-  one. Please read the file Documentation/cdrom/optcd. 
+  Optics Storage 8001 drive; use the IDE-ATAPI CD-ROM driver for that
+  one. Please read the file <file:Documentation/cdrom/optcd>.
 
-  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
   file system support" below, because that's the file system used on
-  CDROMs. 
+  CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called optcd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Sanyo CDR-H94A CDROM support
+Sanyo CDR-H94A CD-ROM support
 CONFIG_SJCD
-  If this is your CDROM drive, say Y here and read the file
-  Documentation/cdrom/sjcd. You should then also say Y or M to
-  "ISO 9660 CDROM file system support" below, because that's the
-  file system used on CDROMs.
+  If this is your CD-ROM drive, say Y here and read the file
+  <file:Documentation/cdrom/sjcd>. You should then also say Y or M to
+  "ISO 9660 CD-ROM file system support" below, because that's the
+  file system used on CD-ROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called sjcd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 ISP16/MAD16/Mozart soft configurable cdrom interface support
 CONFIG_ISP16_CDI
@@ -10503,12 +11730,17 @@
   82C928 or 82C929 chips. Say Y here to have them detected and
   possibly configured at boot time. In addition, You'll have to say Y
   to a driver for the particular cdrom drive you have attached to the
-  card. Read Documentation/cdrom/isp16 for details.
+  card. Read <file:Documentation/cdrom/isp16> for details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called isp16.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
+
+iSeries Virtual I/O CD Support
+CONFIG_VIOCD
+  If you are running Linux on an IBM iSeries system and you want to
+  read a CD drive owned by OS/400, say Y here.
 
 Quota support
 CONFIG_QUOTA
@@ -10516,13 +11748,13 @@
   usage (also called disk quotas). Currently, it works only for the
   ext2 file system. You need additional software in order to use quota
   support; for details, read the Quota mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . Probably the quota
+  <http://www.linuxdoc.org/docs.html#howto>. Probably the quota
   support is only useful for multi user systems. If unsure, say N.
 
 Memory Technology Device (MTD) support
 CONFIG_MTD
   Memory Technology Devices are flash, RAM and similar chips, often
-  used for solid state filesystems on embedded devices. This option
+  used for solid state file systems on embedded devices. This option
   will provide the generic support for MTD drivers to register
   themselves with the kernel and for potential users of MTD devices
   to enumerate the devices which are present and obtain a handle on
@@ -10548,18 +11780,17 @@
 RedBoot partition table parsing
 CONFIG_MTD_REDBOOT_PARTS
   RedBoot is a ROM monitor and bootloader which deals with multiple
-  'images' in flash devices by putting a table in the last erase
-  block of the device, similar to a partition table, which gives
-  the offsets, lengths and names of all the images stored in the 
-  flash. 
+  'images' in flash devices by putting a table in the last erase block
+  of the device, similar to a partition table, which gives the
+  offsets, lengths and names of all the images stored in the flash.
 
   If you need code which can detect and parse this table, and register
   MTD 'partitions' corresponding to each image in the table, enable
-  this option. 
+  this option.
 
   You will still need the parsing functions to be called by the driver
-  for your particular device. It won't happen automatically. The 
-  SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for 
+  for your particular device. It won't happen automatically. The
+  SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for
   example.
 
 Compaq bootldr partition table parsing
@@ -10567,11 +11798,11 @@
   The Compaq bootldr deals with multiple 'images' in flash devices
   by putting a table in one of the first erase blocks of the device,
   similar to a partition table, which gives the offsets, lengths and
-  names of all the images stored in the flash. 
+  names of all the images stored in the flash.
 
   If you need code which can detect and parse this table, and register
   MTD 'partitions' corresponding to each image in the table, enable
-  this option. 
+  this option.
 
   You will still need the parsing functions to be called by the driver
   for your particular device. It won't happen automatically. The 
@@ -10582,21 +11813,20 @@
 CONFIG_MTD_AFS_PARTS
   The ARM Firmware Suite allows the user to divide flash devices into
   multiple 'images'. Each such image has a header containing its name
-  and offset/size etc. 
+  and offset/size etc.
 
-  If you need code which can detect and parse these tables, and register
-  MTD 'partitions' corresponding to each image detected, enable
-  this option. 
+  If you need code which can detect and parse these tables, and
+  register MTD 'partitions' corresponding to each image detected,
+  enable this option.
 
   You will still need the parsing functions to be called by the driver
-  for your particular device. It won't happen automatically. The 
+  for your particular device.  It won't happen automatically.  The 
   'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.
 
-MTD debugging verbosity
+MTD debugging verbosity (0 = quiet, 3 = noisy)
 CONFIG_MTD_DEBUG_VERBOSE
   Determines the verbosity level of the MTD debugging messages.
 
-
 Direct chardevice access to MTD devices
 CONFIG_MTD_CHAR
   This provides a character device for each MTD device present in
@@ -10608,8 +11838,8 @@
 CONFIG_MTD_BLOCK
   Although most flash chips have an erase size too large to be useful
   as block devices, it is possible to use MTD devices which are based
-  on RAM chips in this manner. This block device is a user of MTD devices
-  performing that function.
+  on RAM chips in this manner. This block device is a user of MTD
+  devices performing that function.
 
   At the moment, it is also required for the Journalling Flash File
   System(s) to obtain a handle on the MTD device when it's mounted
@@ -10618,7 +11848,7 @@
 
   Later, it may be extended to perform read/erase/modify/write cycles
   on flash chips to emulate a smaller block size. Needless to say,
-  this is very unsafe, but could be useful for filesystems which are
+  this is very unsafe, but could be useful for file systems which are
   almost never written to.
 
   You do not need this option for use with the DiskOnChip devices. For
@@ -10626,9 +11856,9 @@
 
 Readonly block device access to MTD devices
 CONFIG_MTD_BLOCK_RO
-  This allows you to mount read-only filesystems (such as cramfs) from
-  an MTD device, without the overhead (and danger) of the caching 
-  driver. 
+  This allows you to mount read-only file systems (such as cramfs)
+  from an MTD device, without the overhead (and danger) of the caching
+  driver.
 
   You do not need this option for use with the DiskOnChip devices. For
   those, enable NFTL support (CONFIG_NFTL) instead.
@@ -10637,8 +11867,8 @@
 CONFIG_FTL
   This provides support for the original Flash Translation Layer which
   is part of the PCMCIA specification. It uses a kind of pseudo-
-  filesystem on a flash device to emulate a block device with 512-byte
-  sectors, on top of which you put a 'normal' filesystem.
+  file system on a flash device to emulate a block device with
+  512-byte sectors, on top of which you put a 'normal' file system.
 
   You may find that the algorithms used in this code are patented
   unless you live in the Free World where software patents aren't
@@ -10651,8 +11881,8 @@
 CONFIG_NFTL
   This provides support for the NAND Flash Translation Layer which is
   used on M-Systems' DiskOnChip devices. It uses a kind of pseudo-
-  filesystem on a flash device to emulate a block device with 512-byte
-  sectors, on top of which you put a 'normal' filesystem.
+  file system on a flash device to emulate a block device with
+  512-byte sectors, on top of which you put a 'normal' file system.
 
   You may find that the algorithms used in this code are patented
   unless you live in the Free World where software patents aren't
@@ -10663,9 +11893,10 @@
 
 Write support for NFTL (EXPERIMENTAL)
 CONFIG_NFTL_RW
-  If you're lucky, this will actually work. Don't whinge if it doesn't.
-  Send mail to the MTD mailing list <linux-mtd@lists.infradead.org> if
-  you want to help to make it more reliable.
+  If you're lucky, this will actually work. Don't whinge if it
+  doesn't.  Send mail to the MTD mailing list
+  <linux-mtd@lists.infradead.org> if you want to help to make it more
+  reliable.
 
 Common Flash Interface (CFI) support
 CONFIG_MTD_CFI
@@ -10673,7 +11904,7 @@
   AMD and other flash manufactures that provides a universal method
   for probing the capabilities of flash devices. If you wish to
   support any device that is CFI-compliant, you need to enable this
-  option. Visit (http://www.amd.com/products/nvd/overview/cfi.html)
+  option. Visit <http://www.amd.com/products/nvd/overview/cfi.html>
   for more information on CFI.
 
 CFI Advanced configuration options
@@ -10724,6 +11955,7 @@
   If your flash chips are interleaved in fours - i.e. you have four
   flash chips addressed by each bus cycle, then say 'Y'.
 
+# Choice: mtd_swap_data
 Flash cmd/query data swapping
 CONFIG_MTD_CFI_NOSWAP
   This option defines the way in which the CPU attempts to arrange
@@ -10732,7 +11964,7 @@
   enabled, means that the CPU will not do any swapping; the chips
   are expected to be wired to the CPU in 'host-endian' form. 
   Specific arrangements are possible with the BIG_ENDIAN_BYTE and
-  LITTLE_ENDIAN_BYTE, if the bytes are reversed. 
+  LITTLE_ENDIAN_BYTE, if the bytes are reversed.
 
   If you have a LART, on which the data (and address) lines were
   connected in a fashion which ensured that the nets were as short
@@ -10741,14 +11973,14 @@
 
   Yes, there really exists something sicker than PDP-endian :)
 
-CFI support for Intel/Sharp Extended Commands
+CFI support for Intel/Sharp Extended Command Set chips
 CONFIG_MTD_CFI_INTELEXT
   The Common Flash Interface defines a number of different command
   sets which a CFI-compliant chip may claim to implement. This code
   provides support for one of those command sets, used on Intel
   StrataFlash and other parts.
 
-CFI support for AMD/Fujitsu Standard Commands
+CFI support for AMD/Fujitsu Standard Command Set chips
 CONFIG_MTD_CFI_AMDSTD
   The Common Flash Interface defines a number of different command
   sets which a CFI-compliant chip may claim to implement. This code
@@ -10785,26 +12017,36 @@
   This option enables basic support for ROM chips accessed through 
   a bus mapping driver.
 
+JEDEC device support
 CONFIG_MTD_JEDEC
-  Enable older older JEDEC flash interface devices for self programming
-  flash. It is commonly used in older AMD chips. It is only called
-  JEDEC because the JEDEC association (http://www.jedec.org/)
-  distributes the identification codes for the chips. WARNING!!!! This
-  code does not compile and is incomplete as are the specific JEDEC
-  devices drivers.
+  Enable older older JEDEC flash interface devices for self
+  programming flash.  It is commonly used in older AMD chips.  It is
+  only called JEDEC because the JEDEC association
+  <http://www.jedec.org/> distributes the identification codes for the
+  chips. WARNING!!!! This code does not compile and is incomplete as
+  are the specific JEDEC devices drivers.
 
 CFI Flash device mapped on StrongARM SA11x0
 CONFIG_MTD_SA1100
-  This enables access to the flash chips on most platforms based on the
-  SA1100 and SA1110, including the Assabet and the Compaq iPAQ. If you
-  have such a board, say 'Y'.
+  This enables access to the flash chips on most platforms based on
+  the SA1100 and SA1110, including the Assabet and the Compaq iPAQ.
+  If you have such a board, say 'Y'.
 
+Support for Compaq bootldr partition tables on SA11x0
 CONFIG_MTD_SA1100_REDBOOT_PARTITIONS
   Enabling this option will cause the kernel to look for a RedBoot 
   FIS (Flash Image System) table in the last erase block of the flash
   chips detected. If you are using RedBoot on your SA11x0-based board
   and want Linux to present 'partitions' matching the images which
-  RedBoot has listed, say 'Y'. 
+  RedBoot has listed, say 'Y'.
+
+Support for Compaq bootldr partition tables on SA11x0
+CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS
+  Enabling this option will cause the kernel to look for a Compaq
+  bootldr partition table on the flash chips detected.  If you are
+  using the Compaq bootldr on your SA11x0-based board and want Linux 
+  to present 'partitions' matching the images which the bootldr has
+  listed, say 'Y'.
 
 Flash chip mapping in physical memory
 CONFIG_MTD_PHYSMAP
@@ -10830,6 +12072,7 @@
   map which should hopefully be in the documentation for your
   board.
 
+Buswidth of flash in bytes
 CONFIG_MTD_PHYSMAP_BUSWIDTH
   This is the total width of the data bus of the flash devices
   in octets. For example, if you have a data bus width of 32
@@ -10847,7 +12090,7 @@
 CONFIG_MTD_NORA
   If you had to ask, you don't have one. Say 'N'.
 
-Flash chip mapping on PNC2000
+Flash chip mapping on Photron PNC-2000
 CONFIG_MTD_PNC2000
   PNC-2000 is the name of Network Camera product from PHOTRON
   Ltd. in Japan. It uses CFI-compliant flash.
@@ -10858,7 +12101,7 @@
   a strange sparse mapping. This 'mapping' driver supports that
   arrangement, allowing the CFI probe and command set driver code
   to communicate with the chips on the RPXLite board. More at
-  (http://www.embeddedplanet.com/rpx_lite_specification_sheet.htm).
+  <http://www.embeddedplanet.com/rpx_lite_specification_sheet.htm>.
 
 Flash chip mapping on AMD SC520 CDP board
 CONFIG_MTD_SC520CDP
@@ -10866,47 +12109,67 @@
   Dual-in-line JEDEC chip. This 'mapping' driver supports that
   arrangement, implementing three MTD devices.
 
-Flash chip mapping on Arcom Control Systems' SBC-MediaGX
-CONFIG_MTD_SBC_MEDIAGX
+Flash chip mapping on Arcom Control Systems SBC-MediaGX
+CONFIG_MTD_SBC_GXX
   This provides a driver for the on-board flash of Arcom Control
-  Systems' SBC-MediaGX development board. By default the flash
-  is split into 3 partitions which are accessed as separate MTD
-  devices. This board utilizes Intel StrataFlash. More info at
-  (http://www.arcomcontrols.com/products/icp/pc104/processors/).
+  Systems' SBC-GXn family of boards, formerly known as SBC-MediaGX.
+  By default the flash is split into 3 partitions which are accessed
+  as separate MTD devices.  This board utilizes Intel StrataFlash.
+  More info at
+  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
+
+CFI Flash device mapped on D-Box2
+CONFIG_MTD_DBOX2
+  This enables access routines for the flash chips on the Nokia/Sagem
+  D-Box 2 board. If you have one of these boards and would like to use
+  the flash chips on it, say 'Y'.
+
+CFI Flash device mapped on the XScale IQ80310 board
+CONFIG_MTD_IQ80310
+  This enables access routines for the flash chips on the Intel XScale
+  IQ80310 evaluation board. If you have one of these boards and would 
+  like to use the flash chips on it, say 'Y'.
+
+CFI Flash device mapped on AMD NetSc520
+CONFIG_MTD_NETSC520
+  This enables access routines for the flash chips on the AMD NetSc520
+  demonstration board. If you have one of these boards and would like 
+  to use the flash chips on it, say 'Y'.
 
-Flash chip mapping on Arcom Control Systems' ELAN-104NC
+Flash chip mapping on Arcom Control Systems ELAN-104NC
 CONFIG_MTD_ELAN_104NC
   This provides a driver for the on-board flash of the Arcom Control
   System's ELAN-104NC development board. By default the flash
   is split into 3 partitions which are accessed as separate MTD
   devices. This board utilizes Intel StrataFlash. More info at
-  (http://www.arcomcontrols.com/products/icp/pc104/processors/).
+  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
 
 Flash chip mapping on Compaq iPAQ/Bitsy
 CONFIG_MTD_BITSY
   This provides a driver for the on-board flash found in Compaq's
   iPAQ Palm PC and their research prototype the Itsy. iPAQ info at
-  (http://www5.compaq.com/products/handhelds/pocketpc/) and the
-  Itsy (http://www.research.digital.com/wrl/projects/Itsy/index.html).
+  <http://www5.compaq.com/products/handhelds/pocketpc/> and the
+  Itsy <http://www.research.digital.com/wrl/projects/Itsy/index.html>.
  
 Flash chip mapping on Compaq iPAQ/Bitsy
 CONFIG_MTD_DC21285
   This provides a driver for the flash accessed using Intel's
   21285 bridge used with Intel's StrongARM processors. More info at
-  (http://developer.intel.com/design/bridge/quicklist/dsc-21285.htm).
+  <http://developer.intel.com/design/bridge/quicklist/dsc-21285.htm>.
 
 Flash chip mapping on ITE QED-4N-S01B, Globespan IVR or custom board
 CONFIG_MTD_CSTM_MIPS_IXX
-  This provides a mapping driver for the Integrated Tecnology
-  Express, Inc (ITE) QED-4N-S01B eval board and the Globespan IVR Reference
-  Board. It provides the necessary addressing, length, buswidth, vpp code 
-  and addition setup of the flash device for these boards. In addition,
-  this mapping driver can be used for other boards via setting of the
-  CONFIG_MTD_CSTM_MIPS_IXX_START/LEN/BUSWIDTH parameters.  This mapping
-  will provide one mtd device using one partition.  The start address can
-  be offset from the beginning of flash and the len can be less than the
-  total flash device size to allow a window into the flash.  Both CFI and 
-  JEDEC probes are called.
+  This provides a mapping driver for the Integrated Tecnology Express,
+  Inc (ITE) QED-4N-S01B eval board and the Globespan IVR Reference
+  Board.  It provides the necessary addressing, length, buswidth, vpp
+  code and addition setup of the flash device for these boards.  In
+  addition, this mapping driver can be used for other boards via
+  setting of the CONFIG_MTD_CSTM_MIPS_IXX_START/LEN/BUSWIDTH
+  parameters.  This mapping will provide one mtd device using one
+  partition.  The start address can be offset from the beginning of
+  flash and the len can be less than the total flash device size to
+  allow a window into the flash.  Both CFI and JEDEC probes are
+  called.
 
 Physical start location of flash mapping
 CONFIG_MTD_CSTM_MIPS_IXX_START
@@ -10920,7 +12183,7 @@
   This is the total length that the MTD driver will use for the 
   flash chips on your particular board.  Refer to the memory
   map which should hopefully be in the documentation for your
-  board. 
+  board.
 
 Physical bus width of flash mapping
 CONFIG_MTD_CSTM_MIPS_IXX_BUSWIDTH
@@ -10934,26 +12197,26 @@
   to get on with their job of driving the flash chips without
   having to know about the paging. If you have one of these boards,
   you probably want to enable this mapping driver. More info is at
-  (http://www.itc.hu/).
+  <http://www.itc.hu/>.
 
 Flash chip mapping on Octagon 5066 SBC
 CONFIG_MTD_OCTAGON
   This provides a 'mapping' driver which supports the way in which
   the flash chips are connected in the Octagon-5066 Single Board
   Computer. More information on the board is available at
-  (http://www.octagonsystems.com/Products/5066/5066.html).
+  <http://www.octagonsystems.com/Products/5066/5066.html>.
 
 Flash chip mapping on Tempustech VMAX SBC301
 CONFIG_MTD_VMAX
   This provides a 'mapping' driver which supports the way in which
   the flash chips are connected in the Tempustech VMAX SBC301 Single
   Board Computer. More information on the board is available at
-  (http://www.tempustech.com/tt301.htm).
+  <http://www.tempustech.com/tt301.htm>.
 
 Support for NAND flash devices
 CONFIG_MTD_NAND
   This enables support for accessing all type of NAND flash
-  devices. 
+  devices.
 
 Support for software ECC algorithm
 CONFIG_MTD_NAND_ECC
@@ -10983,96 +12246,102 @@
 M-Systems Disk-On-Chip 2000 and Millennium support
 CONFIG_MTD_DOC2000
   This provides an MTD device driver for the M-Systems DiskOnChip
-  2000 and Millennium devices. Originally designed for the DiskOnChip 
-  2000, it also now includes support for the DiskOnChip Millennium. 
+  2000 and Millennium devices.  Originally designed for the DiskOnChip
+  2000, it also now includes support for the DiskOnChip Millennium.
   If you have problems with this driver and the DiskOnChip Millennium,
   you may wish to try the alternative Millennium driver below. To use
   the alternative driver, you will need to undefine DOC_SINGLE_DRIVER
-  in the drivers/mtd/devices/docprobe.c source code.
+  in the <file:drivers/mtd/devices/docprobe.c> source code.
 
   If you use this device, you probably also want to enable the NFTL
-  'NAND Flash Translation Layer' option below, which is used to emulate
-  a block device by using a kind of filesystem on the flash chips.
+  'NAND Flash Translation Layer' option below, which is used to
+  emulate a block device by using a kind of file system on the flash
+  chips.
 
 Alternative Disk-On-Chip Millennium support
 CONFIG_MTD_DOC2001
   This provides an alternative MTD device driver for the M-Systems 
-  DiskOnChip Millennium devices. Use this if you have problems with
-  the combined DiskOnChip 2000 and Millennium driver above. To get
+  DiskOnChip Millennium devices.  Use this if you have problems with
+  the combined DiskOnChip 2000 and Millennium driver above.  To get
   the DiskOnChip probe code to load and use this driver instead of
   the other one, you will need to undefine DOC_SINGLE_DRIVER near
-  the beginning of drivers/mtd/devices/docprobe.c 
+  the beginning of <file:drivers/mtd/devices/docprobe.c>.
 
   If you use this device, you probably also want to enable the NFTL
-  'NAND Flash Translation Layer' option below, which is used to emulate
-  a block device by using a kind of filesystem on the flash chips.
+  'NAND Flash Translation Layer' option below, which is used to
+  emulate a block device by using a kind of file system on the flash
+  chips.
 
 Probe for DiskOnChip devices
 CONFIG_MTD_DOCPROBE
-  This isn't a real config option, it's derived. 
+  This isn't a real config option, it's derived.
 
 Advanced detection options for DiskOnChip
 CONFIG_MTD_DOCPROBE_ADVANCED
   This option allows you to specify nonstandard address at which to
-  probe for a DiskOnChip, or to change the detection options. You're
-  unlikely to need any of this unless you're using LinuxBIOS. Say 'N'.
+  probe for a DiskOnChip, or to change the detection options.  You
+  are unlikely to need any of this unless you are using LinuxBIOS.
+  Say 'N'.
 
-Probe for 0x55 0xAA BIOS Extension Signature.
+Probe for 0x55 0xAA BIOS Extension Signature
 CONFIG_MTD_DOCPROBE_55AA
-  Check for the 0x55 0xAA signature of a DiskOnChip, and do not continue
-  with probing if it is absent. The signature will always be present for
-  a DiskOnChip 2000 or a normal DiskOnChip Millennium. Only if you have
-  overwritten the first block of a DiskOnChip Millennium will it be 
-  absent. Enable this option if you are using LinuxBIOS or if you need
-  to recover a DiskOnChip Millennium on which you have managed to wipe
-  the first block.
+  Check for the 0x55 0xAA signature of a DiskOnChip, and do not
+  continue with probing if it is absent.  The signature will always be
+  present for a DiskOnChip 2000 or a normal DiskOnChip Millennium.
+  Only if you have overwritten the first block of a DiskOnChip
+  Millennium will it be  absent.  Enable this option if you are using
+  LinuxBIOS or if you need to recover a DiskOnChip Millennium on which
+  you have managed to wipe the first block.
 
 Physical address of DiskOnChip
 CONFIG_MTD_DOCPROBE_ADDRESS
-  By default, the probe for DiskOnChip devices will look for a DiskOnChip
-  at every multiple of 0x2000 between 0xC8000 and 0xEE000. This option 
-  allows you to specify a single address at which to probe for the device,
-  which is useful if you have other devices in that range which get upset
-  when they're probed. 
+  By default, the probe for DiskOnChip devices will look for a
+  DiskOnChip at every multiple of 0x2000 between 0xC8000 and 0xEE000.
+  This option allows you to specify a single address at which to probe
+  for the device, which is useful if you have other devices in that
+  range which get upset when they are probed.
 
-  (Note that on PowerPC, the normal probe will only check at 0xE4000000.)
+  (Note that on PowerPC, the normal probe will only check at
+  0xE4000000.)
 
-  Normally, you should leave this set to zero, to allow the probe at the
-  normal addresses.
+  Normally, you should leave this set to zero, to allow the probe at
+  the normal addresses.
 
 Probe high addresses
 CONFIG_MTD_DOCPROBE_HIGH
-  By default, the probe for DiskOnChip devices will look for a DiskOnChip
-  at every multiple of 0x2000 between 0xC8000 and 0xEE000. This option 
-  changes to make it probe between 0xFFFC8000 and 0xFFFEE000. Unless
-  you're using LinuxBIOS, this is unlikely to be useful to you. Say 'N'. 
+  By default, the probe for DiskOnChip devices will look for a
+  DiskOnChip at every multiple of 0x2000 between 0xC8000 and 0xEE000.
+  This option changes to make it probe between 0xFFFC8000 and
+  0xFFFEE000.  Unless you are using LinuxBIOS, this is unlikely to be
+  useful to you.  Say 'N'.
 
 Ramix PMC551 PCI Mezzanine ram card support
 CONFIG_MTD_PMC551
   This provides a MTD device driver for the Ramix PMC551 RAM PCI card
-  from Ramix Inc. (http://www.ramix.com/products/memory/pmc551.html).
+  from Ramix Inc. <http://www.ramix.com/products/memory/pmc551.html>.
   These devices come in memory configurations from 32M - 1G.  If you
   have one, you probably want to enable this.
 
-  If this driver is compiled as a module you get the ability to select the
-  size of the aperture window pointing into the devices memory.  What this 
-  means is that if you have a 1G card, normally the kernel will use a 1G
-  memory map as it's view of the device.  As a module, you can select a
-  1M window into the memory and the driver will "slide" the window around
-  the PMC551's memory.  This was particularly useful on the 2.2 kernels 
-  on PPC architectures as there was limited kernel space to deal with.
+  If this driver is compiled as a module you get the ability to select
+  the size of the aperture window pointing into the devices memory.
+  What this means is that if you have a 1G card, normally the kernel
+  will use a 1G memory map as its view of the device.  As a module,
+  you can select a 1M window into the memory and the driver will
+  "slide" the window around the PMC551's memory.  This was
+  particularly useful on the 2.2 kernels on PPC architectures as there
+  was limited kernel space to deal with.
 
 PMC551 256M DRAM Bugfix
 CONFIG_MTD_PMC551_BUGFIX
-  Some of Ramix's PMC551 boards with 256M configurations have invalid column
-  and row mux values. This option will fix them, but will break other memory
-  configurations.  If unsure say N.
+  Some of Ramix's PMC551 boards with 256M configurations have invalid
+  column and row mux values.  This option will fix them, but will
+  break other memory configurations.  If unsure say N.
 
 PMC551 Debugging
 CONFIG_MTD_PMC551_DEBUG
-  This option makes the PMC551 more verbose during it's operation and is only
-  really usefull if you are developing on this driver or suspect a possible
-  hardware or driver bug.  If unsure say N.
+  This option makes the PMC551 more verbose during its operation and
+  is only really useful if you are developing on this driver or
+  suspect a possible hardware or driver bug.  If unsure say N.
 
 Use extra onboard system memory as MTD device
 CONFIG_MTD_SLRAM
@@ -11083,24 +12352,24 @@
 Debugging RAM test driver
 CONFIG_MTD_MTDRAM
   This enables a test MTD device driver which uses vmalloc() to
-  provide storage. You probably want to say 'N' unless you're
+  provide storage.  You probably want to say 'N' unless you're
   testing stuff.
 
-MTDRAM erase block size in KiB
+MTDRAM erase block size in KB
 CONFIG_MTDRAM_ERASE_SIZE
   This allows you to configure the size of the erase blocks in the
-  device emulated by the MTDRAM driver. If the MTDRAM driver is built
+  device emulated by the MTDRAM driver.  If the MTDRAM driver is built
   as a module, it is also possible to specify this as a parameter when
   loading the module.
 
-MTDRAM device size in KiB
+MTDRAM device size in KB
 CONFIG_MTDRAM_TOTAL_SIZE
   This allows you to configure the total size of the MTD device
-  emulated by the MTDRAM driver. If the MTDRAM driver is built
+  emulated by the MTDRAM driver.  If the MTDRAM driver is built
   as a module, it is also possible to specify this as a parameter when
   loading the module.
 
-SRAM absolute position
+SRAM Hexadecimal Absolute position or 0
 CONFIG_MTDRAM_ABS_POS
   If you have system RAM accessible by the CPU but not used by Linux
   in normal operation, you can give the physical address at which the
@@ -11110,34 +12379,40 @@
 
 Flash chip mapping on the Flaga Digital Module
 CONFIG_MTD_CFI_FLAGADM
-  Mapping for the Flaga digital module. If you don´t have one, ignore this
-  setting.
+  Mapping for the Flaga digital module.  If you don´t have one, ignore
+  this setting.
+
+Momenco Ocelot boot flash device
+CONFIG_MTD_OCELOT
+  This enables access routines for the boot flash device and for the
+  NVRAM on the Momenco Ocelot board.  If you have one of these boards
+  and would like access to either of these, say 'Y'.
 
-Support for USB
+USB (Universal Serial Bus) support
 CONFIG_USB
   Universal Serial Bus (USB) is a specification for a serial bus
   subsystem which offers higher speeds and more features than the
-  traditional PC serial port. The bus supplies power to peripherals
-  and allows for hot swapping. Up to 127 USB peripherals can be
-  connected to a single USB port in a tree structure. The USB port is
+  traditional PC serial port.  The bus supplies power to peripherals
+  and allows for hot swapping.  Up to 127 USB peripherals can be
+  connected to a single USB port in a tree structure.  The USB port is
   the root of the tree, the peripherals are the leaves and the inner
-  nodes are special USB devices called hubs. Many newer PC's have USB
+  nodes are special USB devices called hubs.  Many newer PC's have USB
   ports and newer peripherals such as scanners, keyboards, mice,
   modems, and printers support the USB protocol and can be connected
   to the PC via those ports.
 
   Say Y here if your computer has a USB port and you want to use USB
-  devices. You then need to say Y to at least one of "UHCI support" or
-  "OHCI support" below (the type of interface that the USB hardware in
-  your computer provides to the operating system) and then choose from
-  among the drivers for USB peripherals. You may want to check out the
-  information provided in Documentation/usb/ and especially the links
-  given in Documentation/usb/usb-help.txt.
+  devices.  You then need to say Y to at least one of "UHCI support"
+  or "OHCI support" below (the type of interface that the USB hardware
+  in your computer provides to the operating system) and then choose
+  from among the drivers for USB peripherals.  You may want to check
+  out the information provided in <file:Documentation/usb/> and
+  especially the links given in <file:Documentation/usb/usb-help.txt>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called usbcore.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called usbcore.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB verbose debug messages
 CONFIG_USB_DEBUG
@@ -11160,14 +12435,14 @@
 USB long timeout
 CONFIG_USB_LONG_TIMEOUT
   This option makes the standard time out a bit longer.  Basically,
-  some devices are just slow to respond, so this makes usb more 
+  some devices are just slow to respond, so this makes usb more
   patient.  There should be no harm in selecting this, but it is
   needed for some MGE Ellipse UPSes.
 
   If you have an MGE Ellipse UPS, or you see timeouts in HID
   transactions, say Y; otherwise say N.
 
-UHCI (intel PIIX4, VIA, ...) support
+UHCI (Intel PIIX4, VIA, ...) support
 CONFIG_USB_UHCI
   The Universal Host Controller Interface is a standard by Intel for
   accessing the USB hardware in the PC (which is also called the USB
@@ -11179,15 +12454,15 @@
   133).
 
   Currently there exist two drivers for UHCI host controllers: this
-  one and the so-called JE driver, which you can get from 
+  one and the so-called JE driver, which you can get from
   "UHCI alternate (JE) support", below. You need only one.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called usb-uhci.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-UHCI (intel PIIX4, VIA, ...) alternate (JE) support?
+UHCI (Intel PIIX4, VIA, ...) alternate (JE) support
 CONFIG_USB_UHCI_ALT
   The Universal Host Controller Interface is a standard by Intel for
   accessing the USB hardware in the PC (which is also called the USB
@@ -11205,11 +12480,7 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called uhci.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
-
-UHCI unlink optimizations (EXPERIMENTAL)
-CONFIG_USB_UHCI_ALT_UNLINK_OPTIMIZE
-  This option currently does nothing. You may say Y or N.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
 CONFIG_USB_OHCI
@@ -11221,12 +12492,12 @@
   -- like SiS (aktual 610, 610 and so on) or ALi (ALi IV, ALi V,
   Aladdin Pro..) -- conform to this standard.
 
-  You may want to read the file Documentation/usb/ohci.txt.
+  You may want to read <file:Documentation/usb/ohci.txt>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called usb-ohci.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Human Interface Device (full HID) support
 CONFIG_USB_HID
@@ -11234,22 +12505,20 @@
   mice, joysticks, graphic tablets, or any other HID based devices
   to your computer via USB. You can't use this driver and the
   HIDBP (Boot Protocol) keyboard and mouse drivers at the same time.
-  More information is available: Documentation/input/input.txt.
+  More information is available: <file:Documentation/input/input.txt>.
 
   If unsure, say Y.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called hid.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 /dev/usb/hiddev raw HID device support
 CONFIG_USB_HIDDEV
   Say Y here if you want to support HID devices (from the USB
   specification standpoint) that aren't strictly user interface
   devices, like monitor controls and Uninterruptable Power Supplies.
-  It is also used for "consumer keys" on multimedia keyboards and
-  USB speakers.
 
   This module supports these devices separately using a separate
   event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
@@ -11266,7 +12535,7 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called usbkbd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
   If unsure, say N.
 
@@ -11279,41 +12548,41 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called usbmouse.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
   If unsure, say N.
 
 Wacom Intuos/Graphire tablet support
 CONFIG_USB_WACOM
   Say Y here if you want to use the USB version of the Wacom Intuos
-  or Graphire tablet. Make sure to say Y to "Mouse support"
+  or Graphire tablet.  Make sure to say Y to "Mouse support"
   (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support"
   (CONFIG_INPUT_EVDEV) as well.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called wacom.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called wacom.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Logitech WingMan Force joystick support
-CONFIG_USB_WMFORCE
-  Say Y here if you want to use the Logitech WingMan Force with Linux
-  on the USB port. No force-feedback support yet, but other than that
-  it should work like a normal joystick.
+Aiptek 8000U tablet support
+CONFIG_USB_AIPTEK
+  Say Y here if you want to use the USB version of the Aiptek 8000U
+  tablet.  Make sure to say Y to "Event interface support"
+  (CONFIG_INPUT_EVDEV) as well.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called wmforce.o. If you want to compile it as a
+  The module will be called aiptek.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
 Use input layer for ADB devices
 CONFIG_INPUT_ADBHID
   Say Y here if you want to have ADB (Apple Desktop Bus) HID devices
-  such as keyboards, mice, joysticks, or graphic tablets handled by the
-  input layer.  If you say Y here, make sure to say Y to the
+  such as keyboards, mice, joysticks, or graphic tablets handled by
+  the input layer.  If you say Y here, make sure to say Y to the
   corresponding drivers "Keyboard support" (CONFIG_INPUT_KEYBDEV),
-  "Mouse Support" (CONFIG_INPUT_MOUSEDEV) and "Event interface support"
-  (CONFIG_INPUT_EVDEV) as well.
+  "Mouse Support" (CONFIG_INPUT_MOUSEDEV) and "Event interface
+  support" (CONFIG_INPUT_EVDEV) as well.
 
   If you say N here, you still have the option of using the old ADB
   keyboard and mouse drivers.
@@ -11333,12 +12602,13 @@
 Keyboard support
 CONFIG_INPUT_KEYBDEV
   Say Y here if you want your USB HID keyboard (or an ADB keyboard
-  handled by the input layer) to be able to serve as a system keyboard.
+  handled by the input layer) to be able to serve as a system
+  keyboard.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called keybdev.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called keybdev.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Mouse support
 CONFIG_INPUT_MOUSEDEV
@@ -11347,13 +12617,13 @@
   /dev/input/mouseX and 13:63 - /dev/input/mice as an emulated ImPS/2
   mouse.  That way, all user space programs will be able to use your
   mouse.
-  
+
   If unsure, say Y.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called mousedev.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Horizontal screen resolution
 CONFIG_INPUT_MOUSEDEV_SCREEN_X
@@ -11372,71 +12642,81 @@
 Joystick support
 CONFIG_INPUT_JOYDEV
   Say Y here if you want your USB HID joystick or gamepad to be
-  accessible as char device 13:0+ - /dev/input/jsX device. 
+  accessible as char device 13:0+ - /dev/input/jsX device.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called joydev.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Event interface support
 CONFIG_INPUT_EVDEV
-  Say Y here if you want your USB or ADB HID device events be accessible
-  under char device 13:64+ - /dev/input/eventX in a generic way.
-  This is the future ...
+  Say Y here if you want your USB or ADB HID device events be
+  accessible under char device 13:64+ - /dev/input/eventX in a generic
+  way.  This is the future ...
 
 USB Scanner support
 CONFIG_USB_SCANNER
   Say Y here if you want to connect a USB scanner to your computer's
-  USB port. Please read Documentation/usb/scanner.txt and
-  Documentation/usb/scanner-hp-sane.txt for more information.
+  USB port. Please read <file:Documentation/usb/scanner.txt> and
+  <file:Documentation/usb/scanner-hp-sane.txt> for more information.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called scanner.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+HP 5300C scanner support 
+CONFIG_USB_HP5300
+  Say Y here if you want to connect a HP5300C scanner to your
+  computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hp5300.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Audio support
 CONFIG_USB_AUDIO
-  Say Y here if you want to connect UAB audio equipment such as
+  Say Y here if you want to connect USB audio equipment such as
   speakers to your computer's USB port.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called audio.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB Modem (CDC ACM) support
 CONFIG_USB_ACM
   This driver supports USB modems and ISDN adapters which support the
   Communication Device Class Abstract Control Model interface.
-  Please read Documentation/usb/acm.txt for details.
+  Please read <file:Documentation/usb/acm.txt> for details.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called acm.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-USB Serial converter support
+USB serial converter support
 CONFIG_USB_SERIAL
   Say Y here if you have a USB device that provides normal serial
   ports, or acts like a serial device, and you want to connect it to
   your USB bus.
 
-  Please read Documentation/usb/usb-serial.txt for more information
-  on the specifics of the different devices that are supported, and
-  on how to use them.
-  
+  Please read <file:Documentation/usb/usb-serial.txt> for more
+  information on the specifics of the different devices that are
+  supported, and on how to use them.
+
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called usbserial.o. If you want to compile it 
-  as a module, say M here and read Documentation/modules.txt.
+  The module will be called usbserial.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Generic Serial Driver
 CONFIG_USB_SERIAL_GENERIC
-  Say Y here if you want to use the generic USB serial driver. Please
-  read Documentation/usb/usb-serial.txt for more information on using
-  this driver. It is recommended that the "USB Serial converter
+  Say Y here if you want to use the generic USB serial driver.  Please
+  read <file:Documentation/usb/usb-serial.txt> for more information on
+  using this driver.  It is recommended that the "USB Serial converter
   support" be compiled as a module for this driver to be used
   properly.
 
@@ -11447,20 +12727,20 @@
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called whiteheat.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called whiteheat.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Handspring Visor Driver
 CONFIG_USB_SERIAL_VISOR
-  Say Y here if you want to connect to your HandSpring Visor, Palm m500
-  or m505 through its USB docking station.
-  See http://usbvisor.sourceforge.net for more information on using this
+  Say Y here if you want to connect to your HandSpring Visor, Palm
+  m500 or m505 through its USB docking station. See
+  <http://usbvisor.sourceforge.net> for more information on using this
   driver.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called visor.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB Belkin and Paracom Single Port Serial Driver
 CONFIG_USB_SERIAL_BELKIN
@@ -11471,20 +12751,21 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called belkin_sa.o.  If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 USB FTDI Single Port Serial Driver
 CONFIG_USB_SERIAL_FTDI_SIO
   Say Y here if you want to use a FTDI SIO single port USB to serial
   converter device. The implementation I have is called the USC-1000.
+  This driver has also be tested with the 245 and 232 devices.
 
-  See http://reality.sgi.com/bryder_wellington/ftdi_sio for more
+  See  http://ftdi-usb-sio.sourceforge.net for more
   information on this driver and the device.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ftdi_sio.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called ftdi_sio.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Keyspan PDA Single Port Serial Driver
 CONFIG_USB_SERIAL_KEYSPAN_PDA
@@ -11494,8 +12775,8 @@
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called keyspan_pda.o. If you want to compile it 
-  as a module, say M here and read Documentation/modules.txt.
+  The module will be called keyspan_pda.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Xircom / Entregra Single Port Serial Driver
 CONFIG_USB_SERIAL_XIRCOM
@@ -11513,14 +12794,14 @@
   Say Y here if you want to use Keyspan USB to serial converter
   devices.  This driver makes use of Keyspan's official firmware
   and was developed with their support.  You must also include
-  firmware to support your particular device(s). 
+  firmware to support your particular device(s).
+
+  See <http://misc.nu/hugh/keyspan.html> for more information.
 
-  See http://misc.nu/hugh/keyspan.html for more information.
- 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called keyspan.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB Keyspan USA-28 Firmware
 CONFIG_USB_SERIAL_KEYSPAN_USA28
@@ -11566,8 +12847,8 @@
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called omninet.o. If you want to compile it as a 
-  module, say M here and read Documentation/modules.txt.
+  The module will be called omninet.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB Digi International AccelePort USB Serial Driver
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT
@@ -11581,33 +12862,34 @@
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called digi_acceleport.o. If you want to compile 
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called digi_acceleport.o.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
 
 USB Empeg empeg-car Mark I/II Driver
 CONFIG_USB_SERIAL_EMPEG
   Say Y here if you want to connect to your Empeg empeg-car Mark I/II
   mp3 player via USB.  The driver uses a single ttyUSB{0,1,2,...}
-  device node.  See Documentation/usb/usb-serial.txt for more
+  device node.  See <file:Documentation/usb/usb-serial.txt> for more
   tidbits of information.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called empeg.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB MCT Single Port Serial Driver
 CONFIG_USB_SERIAL_MCT_U232
   Say Y here if you want to use a USB Serial single port adapter from
   Magic Control Technology Corp. (U232 is one of the model numbers).
-  
+
   This driver also works with Sitecom U232-P25 and D-Link DU-H3SP USB
   BAY devices.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called mct_u232.o.  If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Prolific 2303 Single Port Serial Driver
 CONFIG_USB_SERIAL_PL2303
@@ -11617,19 +12899,19 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called pl2303.o.  If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 USB REINER SCT cyberJack pinpad/e-com chipcard reader
 CONFIG_USB_SERIAL_CYBERJACK
   Say Y here if you want to use a cyberJack pinpad/e-com USB chipcard
   reader. This is an interface to ISO 7816 compatible contactbased
   chipcards, e.g. GSM SIMs.
- 
+
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called cyberjack.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
- 
+  a module, say M here and read <file:Documentation/modules.txt>.
+
   If unsure, say N.
 
 USB Edgeport Serial Driver
@@ -11655,8 +12937,8 @@
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called io_edgeport.o.  If you want to compile it 
-  as a module, say M here and read Documentation/modules.txt.
+  The module will be called io_edgeport.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Serial Converter verbose debug
 CONFIG_USB_SERIAL_DEBUG
@@ -11671,57 +12953,85 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called printer.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB IBM (Xirlink) C-It Camera support
 CONFIG_USB_IBMCAM
   Say Y here if you want to connect a IBM "C-It" camera, also known as
-  "Xirlink PC Camera" to your computer's USB port. For more
-  information, read Documentation/usb/ibmcam.txt.
+  "Xirlink PC Camera" to your computer's USB port.  For more
+  information, read <file:Documentation/usb/ibmcam.txt>.
 
   This driver uses the Video For Linux API.  You must enable
   (Y or M in config) Video For Linux (under Character Devices)
   to use this driver.  Information on this API and pointers to
   "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ibmcam.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. This camera
-  has several configuration options which can be specified when you
-  load the module. Read Documentation/usb/ibmcam.txt to learn more.
+  The module will be called ibmcam.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>. This
+  camera has several configuration options which can be specified when
+  you load the module.  Read <file:Documentation/usb/ibmcam.txt> to
+  learn more.
 
 USB OV511 Camera support
 CONFIG_USB_OV511
   Say Y here if you want to connect this type of camera to your
-  computer's USB port. See Documentation/usb/ov511.txt for more
+  computer's USB port. See <file:Documentation/usb/ov511.txt> for more
   information and for a list of supported cameras.
-  
+
   This driver uses the Video For Linux API. You must say Y or M to
   "Video For Linux" (under Character Devices) to use this driver.
   Information on this API and pointers to "v4l" programs may be found
-  on the WWW at http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called ov511.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Communication Class Ethernet driver
+CONFIG_USB_CDCETHER
+  This driver supports devices conforming to the Communication Device
+  Class Ethernet Control Model.  This is used in some cable modems.
+  For more details on the specification, get the Communication Device
+  Class specification from <http://www.usb.org>.
+
+  This driver should work with the following devices:
+        * Ericsson PipeRider (all variants)
+        * Motorola (DM100 and SB4100)
+        * Broadcom Cable Modem (reference design)
+        * Toshiba PCX1100U and possibly other cable modems
+
+  The device creates a network device (ethX, where X depends on what
+  other networking devices you have in use), as for a normal PCI
+  or ISA based ethernet network card.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called CDCEther.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+NetChip 1080-based USB Host-to-Host Link
+CONFIG_USB_NET1080
+  The NetChip 1080 is a USB 1.1 host controller.  NetChip has a web
+  site with technical information at <http://www.netchip.com/>.
 
 Philips webcam support
 CONFIG_USB_PWC
   Say Y or M here if you want to use one of these Philips USB webcams:
-  PCA645, PCA646, PCVC675, PCVC680, PCVC690, PCVC730, PCVC740, or 
-  the Askey VC010. The PCA635, PCVC665 and PCVC720 are not 
-  supported by this driver and never will be.
-
-  This driver has an optional plugin, which is distributed as a 
-  binary module only. It contains code that allow you to use 
-  higher resolutions and framerates but may not be distributed
-  as source. But even without this plugin you can these cams 
-  for most applications.
+  PCA645, PCA646, PCVC675, PCVC680, PCVC690, PCVC730, PCVC740, or
+  the Askey VC010. The PCA635, PCVC665 and PCVC720 are not supported
+  by this driver and never will be.
+
+  This driver has an optional plugin, which is distributed as a binary
+  module only.  It contains code that allow you to use higher
+  resolutions and framerates but may not be distributed as source.
+  But even without this plugin you can these cams for most
+  applications.
 
-  See Documentation/usb/philips.txt for more information and 
+  See <file:Documentation/usb/philips.txt> for more information and
   installation instructions.
 
   The built-in microphone is enabled by selecting USB Audio support.
@@ -11729,29 +13039,12 @@
   This driver uses the Video For Linux API. You must say Y or M to
   "Video For Linux" (under Character Devices) to use this driver.
   Information on this API and pointers to "v4l" programs may be found
-  on the WWW at http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called pwc.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
-
-
-USB SE401 Camera support
-CONFIG_USB_SE401
-  Say Y here if you want to connect this type of camera to your
-  computer's USB port. See Documentation/usb/se401.txt for more
-  information and for a list of supported cameras.
-  
-  This driver uses the Video For Linux API. You must say Y or M to
-  "Video For Linux" (under Multimedia Devices) to use this driver.
-  Information on this API and pointers to "v4l" programs may be found
-  on the WWW at http://roadrunner.swansea.uk.linux.org/v4l.shtml .
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called se401.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called pwc.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Pegasus/Pegasus II based USB-Ethernet device support
 CONFIG_USB_PEGASUS
@@ -11765,8 +13058,9 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called pegasus.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
+USB KLSI KL5USB101-based Ethernet device support '
 CONFIG_USB_KAWETH
   Say Y here if you want to use one of the following 10Mbps only
   USB Ethernet adapters based on the KLSI KL5KUSB101B chipset:
@@ -11783,7 +13077,7 @@
        Kingston Technology USB Ethernet Adapter
        Linksys USB10T
        Mobility USB-Ethernet Adapter
-        NetGear EA-101
+       NetGear EA-101
        Peracom Enet and Enet2
        Portsmith Express Ethernet Adapter
        Shark Pocket Adapter
@@ -11815,62 +13109,39 @@
     CATC NetMate II
     smartBridges smartNIC
 
+  This driver makes the adapter appear as a normal Ethernet interface,
+  typically on eth0, if it is the only ethernet device, or perhaps on
+  eth1, if you have a PCI or ISA ethernet card installed.
+
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called catc.o. If you want to compile it as a
   module, say M here and read <file:Documentation/modules.txt>.
 
-USB Communication Class Ethernet driver
-CONFIG_USB_CDCETHER
-  This driver supports devices conforming to the Communication Device
-  Class Ethernet Control Model.  This is used in some cable modems.
-  For more details on the specification, get the Communication Device
-  Class specification from <http://www.usb.org>.
-
-  This driver should work with the following devices:
-        * Ericsson PipeRider (all variants)
-        * Motorola (DM100 and SB4100)
-        * Broadcom Cable Modem (reference design)
-        * Toshiba PCX1100U and possibly other cable modems
-
-  The device creates a network device (ethX, where X depends on what
-  other networking devices you have in use), as for a normal PCI
-  or ISA based ethernet network card.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called CDCEther.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-NetChip 1080-based USB Host-to-Host Link
-CONFIG_USB_NET1080
-  The NetChip 1080 is a USB 1.1 host controller.  NetChip has a web
-  site with technical information at http://www.netchip.com/ .
-
 USB Kodak DC-2xx Camera support
 CONFIG_USB_DC2XX
-  Say Y here if you want to connect this type of still camera to
-  your computer's USB port.  See Documentation/usb/dc2xx.txt for more
-  information; some non-Kodak cameras may also work with this
-  driver, given application support (such as www.gPhoto.org).
+  Say Y here if you want to connect this type of still camera to your
+  computer's USB port.  See <file:Documentation/usb/dc2xx.txt> for
+  more information; some non-Kodak cameras may also work with this
+  driver, given application support (such as <http://www.gPhoto.org>).
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called dc2xx.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-USB Mustek MDC800 Digital Camera Support
+USB Mustek MDC800 Digital Camera support
 CONFIG_USB_MDC800
   Say Y here if you want to connect this type of still camera to
   your computer's USB port. This driver can be used with gphoto 0.4.3
-  and higher (look at http://www.gphoto.org ).
+  and higher (look at <http://www.gphoto.org>).
   To use it create a device node with "mknod /dev/mustek c 180 32" and
   configure it in your software.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called mdc800.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 USB Mass Storage support
 CONFIG_USB_STORAGE
@@ -11880,7 +13151,7 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called usb-storage.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 USB Mass Storage verbose debug
 CONFIG_USB_STORAGE_DEBUG
@@ -11907,7 +13178,7 @@
   Technologies USS-720 chip. These cables are plugged into your USB
   port and provide USB compatibility to peripherals designed with
   parallel port interfaces.
-  
+
   The chip has two modes: automatic mode and manual mode. In automatic
   mode, it looks to the computer like a standard USB printer. Only
   printers may be connected to the USS-720 in this mode. The generic
@@ -11927,29 +13198,33 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called uss720.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
-  
+  module, say M here and read <file:Documentation/modules.txt>.
+
 USB device file system
 CONFIG_USB_DEVICEFS
-  If you say Y here (and to "/proc file system support" below), you
-  will get a file /proc/bus/usb/devices which lists the devices
-  currently connected to your USB busses, a file /proc/bus/usb/drivers
-  which lists the USB kernel client drivers currently loaded, and for
-  every connected device a file named "/proc/bus/usb/xxx/yyy", where
-  xxx is the bus number and yyy the device number; the latter files
-  can be used by user space programs to talk directly to the device.
-  These files are "virtual", meaning they are generated on the fly
-  and not stored on the hard drive.
-  
-  For the format of the /proc/bus/usb/ files, please read
-  Documentation/usb/proc_usb_info.txt. 
+  If you say Y here (and to "/proc file system support" in the "File
+  systems section, above), you will get a file /proc/bus/usb/devices
+  which lists the devices currently connected to your USB bus or
+  busses, a file /proc/bus/usb/drivers which lists the USB kernel
+  client drivers currently loaded, and for every connected device a
+  file named  "/proc/bus/usb/xxx/yyy", where xxx is the bus number and
+  yyy the device number; the latter files can be used by user space
+  programs to talk directly to the device. These files are "virtual",
+  meaning they are generated on the fly and not stored on the hard
+  drive.
+
+  You may need to mount the usbdevfs file system to see the files, use
+   mount -t usbdevfs none /proc/bus/usb
+
+  For the format of the various /proc/bus/usb/ files, please read
+  <file:Documentation/usb/proc_usb_info.txt>.
 
   Please note that this code is completely unrelated to devfs, the
   "/dev file system support".
 
   Most users want to say Y here.
 
-USB Bandwidth allocation
+Enforce USB bandwidth allocation
 CONFIG_USB_BANDWIDTH
   If you say Y here, the USB subsystem enforces USB bandwidth
   allocation and will prevent some device opens from succeeding
@@ -11963,23 +13238,25 @@
 DABUSB driver
 CONFIG_USB_DABUSB
   A Digital Audio Broadcasting (DAB) Receiver for USB and Linux
-  brought to you by the DAB-Team (http://dab.in.tum.de). This driver
-  can be taken as an example for URB-based bulk, control, and
+  brought to you by the DAB-Team (<http://dab.in.tum.de>).  This
+  driver can be taken as an example for URB-based bulk, control, and
   isochronous transactions. URB's are explained in
-  Documentation/usb/URB.txt.
+  <file:Documentation/usb/URB.txt>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called dabusb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will be called dabusb.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Host-to-Host USB networking
 CONFIG_USB_USBNET
   This driver supports network links over USB with USB "Network"
   or "data transfer" cables, often used to network laptops to PCs.
-  Such cables have chips from suppliers such as NetChip and Prolific.
-  Intelligent USB devices could also use this approach to provide
-  Internet access, using standard USB cabling.
+  Such cables have chips from suppliers such as Belkin/eTEK, GeneSys
+  (GeneLink), NetChip and Prolific. Intelligent USB devices could also
+  use this approach to provide Internet access, using standard USB
+  cabling. You can find these chips also on some motherboards with
+  USB PC2PC support.
 
   These links will have names like "usb0", "usb1", etc.  They act
   like two-node Ethernets, so you can use 802.1d Ethernet Bridging
@@ -11990,16 +13267,32 @@
   The module will be called usbnet.o. If you want to compile it as a
   module, say M here and read <file:Documentation/modules.txt>.
 
+Freecom USB/ATAPI Bridge support
+CONFIG_USB_STORAGE_FREECOM
+  Support for the Freecom USB to IDE/ATAPI adaptor.
+  Freecom has a web page at <http://www.freecom.de/>.
+
+Microtech CompactFlash/SmartMedia reader
+CONFIG_USB_STORAGE_DPCM
+  Say Y here to support the Microtech ZiO! CompactFlash/SmartMedia
+  reader, details at <http://www.microtechint.com/zio/index.html>.
+  This driver treats the flash card as a removable storage device.
+
+Sandisk SDDR-09 SmartMedia reader support
+CONFIG_USB_STORAGE_SDDR09
+  Say Y here to include additional code to support the Sandisk SDDR-09
+  SmartMedia reader in the USB Mass Storage driver.
+
 USB Diamond Rio500 support
 CONFIG_USB_RIO500
   Say Y here if you want to connect a USB Rio500 mp3 player to your
-  computer's USB port. Please read Documentation/usb/rio.txt
+  computer's USB port. Please read <file:Documentation/usb/rio.txt>
   for more information.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called rio500.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 D-Link DSB-R100 FM radio support
 CONFIG_USB_DSBR
@@ -12012,18 +13305,256 @@
   (Y or M in config) Video For Linux (under Character Devices)
   to use this driver.  Information on this API and pointers to
   "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called dsbr100.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Always do synchronous disk IO for UBD
+CONFIG_BLK_DEV_UBD_SYNC
+  The User-Mode Linux port includes a driver called UBD which will let
+  you access arbitrary files on the host computer as block devices.
+  Writes to such a block device are not immediately written to the
+  host's disk; this may cause problems if, for example, the User-Mode
+  Linux 'Virtual Machine' uses a journalling file system and the host
+  computer crashes.
+
+  Synchronous operation (i.e. always writing data to the host's disk
+  immediately) is configurable on a per-UBD basis by using a special
+  kernel command line option.  Alternatively, you can say Y here to
+  turn on synchronous operation by default for all block.
+
+  If you're running a journalling file system (like reiserfs, for
+  example) in your virtual machine, you will want to say Y here.  If
+  you care for the safety of the data in your virtual machine, Y is a
+  wise choice too.  In all other cases (for example, if you're just
+  playing around with User-Mode Linux) you can choose N.
+
+Enable ptrace proxy
+CONFIG_PT_PROXY
+  This option enables a debugging interface which allows gdb to debug
+  the kernel without needing to actually attach to kernel threads.
+  If you want to do kernel debugging, say Y here; otherwise say N.
+
+Management console
+CONFIG_MCONSOLE
+  The user mode linux management console is a low-level interface to
+  the kernel, somewhat like the i386 SysRq interface.  Since there is
+  a full-blown operating system running under every user mode linux
+  instance, there is much greater flexibility possible than with the
+  SysRq mechanism.
+
+  If you answer 'Y' to this option, to use this feature, you need the
+  mconsole client (called uml_mconsole) which is present in CVS in
+  2.4.5-9um and later (path /tools/mconsole), and is also in the
+  distribution RPM package in 2.4.6 and later.
+
+  It is safe to say 'Y' here.
+
+Enable kernel debugging symbols
+CONFIG_DEBUGSYM
+  When this is enabled, the User-Mode Linux binary will include
+  debugging symbols.  This enlarges the binary by a few megabytes,
+  but aids in tracking down kernel problems in UML.  It is required
+  if you intend to do any kernel development.
+
+  If you're truly short on disk space or don't expect to report any
+  bugs back to the UML developers, say N, otherwise say Y.
+
+Enable gcov support
+CONFIG_GCOV
+  This option allows developers to retrieve coverage data from a UML
+  session.
+
+  See <http://user-mode-linux.sourceforge.net/gcov.html> for more
+  details.
+
+  If you're involved in UML kernel development and want to use gcov,
+  say Y.  If you're unsure, say N.
+
+Enable gprof support
+CONFIG_GPROF
+  This allows profiling of a User-Mode Linux kernel with the gprof
+  utility.
+
+  See <http://user-mode-linux.sourceforge.net/gprof.html> for more
+  details.
+
+  If you're involved in UML kernel development and want to use gprof,
+  say Y.  If you're unsure, say N.
+
+Host filesystem
+CONFIG_HOSTFS
+  While the User-Mode Linux port uses its own root file system for
+  booting and normal file access, this module lets the UML user
+  access files stored on the host.  It does not require any
+  network connection between the Host and UML.  An example use of
+  this might be:
+
+  mount none /tmp/fromhost -t hostfs -o /tmp/umlshare
+
+  where /tmp/fromhost is an empty directory inside UML and
+  /tmp/umlshare is a directory on the host with files the UML user
+  wishes to access.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/hostfs.html>.
+
+  If you'd like to be able to work with files stored on the host, 
+  say Y or M here; otherwise say N.
+
+Example IO Memory driver
+CONFIG_MMAPPER
+  The User-Mode Linux port can provide support for IO Memory
+  emulation with this option.  This allows a host file to be
+  specified as an I/O region on the kernel command line. That file
+  will be mapped into UML's kernel address space where a driver can
+  locate it and do whatever it wants with the memory, including
+  providing an interface to it for UML processes to use.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/iomem.html>.
+
+  If you'd like to be able to provide a simulated IO port space for
+  User-Mode Linux processes, say Y.  If unsure, say N.
+
+Virtual Serial Line
+CONFIG_SSL
+  The User-Mode Linux environment allows you to create virtual serial
+  lines on the UML that are usually made to show up on the host as
+  ttys or ptys.
+
+  See <http://user-mode-linux.sourceforge.net/input.html> for more
+  information and command line examples of how to use this facility.
+
+  Unless you have a specific reason for disabling this, say Y.
+
+Virtual network device
+CONFIG_UML_NET
+  While the User-Mode port cannot directly talk to any physical
+  hardware devices, this choice and the following transport options
+  provide one or more virtual network devices through which the UML
+  kernels can talk to each other, the host, and with the host's help,
+  machines on the outside world.
+
+  For more information, including explations of the networking and
+  sample configurations, see
+  <http://user-mode-linux.sourceforge.net/networking.html>.
+
+  If you'd like to be able to enable networking in the User-Mode
+  linux environment, say Y; otherwise say N.  Note that you must
+  enable at least one of the following transport options to actually
+  make use of UML networking.
+
+Daemon transport
+CONFIG_UML_NET_DAEMON
+  This User-Mode Linux network transport allows one or more running
+  UMLs on a single host to communicate with each other, but not to
+  the host.
+
+  To use this form of networking, you'll need to run the UML
+  networking daemon on the host.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>  That site
+  has examples of the UML command line to use to enable Daemon
+  networking.
+
+  If you'd like to set up a network with other UMLs on a single host,
+  say Y.  If you need a network between UMLs on multiple physical
+  hosts, choose the Multicast Transport.  To set up a network with
+  the host and/or other IP machines, say Y to the Ethertap or Slip
+  transports.  You'll need at least one of them, but may choose
+  more than one without conflict.  If you don't need UML networking,
+  say N.
+
+Ethertap transport
+CONFIG_UML_NET_ETHERTAP
+  The Ethertap User-Mode Linux network transport allows a single
+  running UML to exchange packets with its host over one of the
+  host's Ethertap devices, such as /dev/tap0.  Additional running
+  UMLs can use additional Ethertap devices, one per running UML.
+  While the UML believes its on a (multi-device, broadcast) virtual
+  Ethernet network, it's in fact communicating over a point-to-point
+  link with the host.
+
+  To use this, your host kernel must have support for Ethertap
+  devices.  Also, if your host kernel is 2.4.x, it must have 
+  CONFIG_NETLINK_DEV configured as Y or M.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>  That site
+  has examples of the UML command line to use to enable Ethertap
+  networking.
+
+  If you'd like to set up an IP network with the host and/or the
+  outside world, say Y to this, the Daemon Transport and/or the 
+  Slip Transport.  You'll need at least one of them, but may choose
+  more than one without conflict.  If you don't need UML networking,
+  say N.
+
+TUN/TAP transport
+CONFIG_UML_NET_TUNTAP
+  The UML TUN/TAP network transport allows a UML instance to exchange
+  packets with the host over a TUN/TAP device.  This option will only
+  work with a 2.4 host, unless you've applied the TUN/TAP patch to
+  your 2.2 host kernel.
+
+  To use this transport, your host kernel must have support for TUN/TAP
+  devices, either built-in or as a module.
+
+Multicast transport
+CONFIG_UML_NET_MCAST
+  This Multicast User-Mode Linux network transport allows multiple
+  UMLs (even ones running on different host machines!) to talk to
+  each other over a virtual ethernet network.  However, it requires
+  at least one UML with one of the other transports to act as a
+  bridge if any of them need to be able to talk to their hosts or any
+  other IP machines.
+
+  To use this, your host kernel(s) must support IP Multicasting.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>  That site
+  has examples of the UML command line to use to enable Multicast
+  networking, and notes about the security of this approach.
+
+  If you need UMLs on multiple physical hosts to communicate as if
+  they shared an Ethernet network, say Y.  If you need to communicate
+  with other IP machines, make sure you select one of the other
+  transports (possibly in addition to Multicast; they're not
+  exclusive).  If you don't need to network UMLs say N to each of
+  the transports.
+
+SLIP transport
+CONFIG_UML_NET_SLIP
+  The Slip User-Mode Linux network transport allows a running UML to
+  network with its host over a point-to-point link.  Unlike Ethertap,
+  which can carry any Ethernet frame (and hence even non-IP packets),
+  the Slip transport can only carry IP packets.
+
+  To use this, your host must support Slip devices.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>.  That site
+  has examples of the UML command line to use to enable Slip
+  networking, and details of a few quirks with it.
+
+  The Ethertap Transport is preferred over Slip because of its
+  limitation.  If you prefer Slip, however, say Y here.  Otherwise
+  choose the Multicast transport (to network multiple UMLs on 
+  multiple hosts), Ethertap (to network with the host and the
+  outside world), and/or the Daemon transport (to network multiple
+  UMLs on a single host).  You may choose more than one without
+  conflict.  If you don't need UML networking, say N.
 
 Microtek USB scanner support
 CONFIG_USB_MICROTEK
   Say Y here if you want support for the Microtek X6USB and
   possibly the Phantom 336CX, Phantom C6 and ScanMaker V6U(S)L.
-  Support for anything but the X6 is experimetal.
+  Support for anything but the X6 is experimental.
   Please report failures and successes.
   The scanner will appear as a scsi generic device to the rest
   of the system. Scsi support is required for this driver to compile
@@ -12040,14 +13571,14 @@
 CONFIG_USB_BLUETOOTH
   Say Y here if you want to connect a USB Bluetooth device to your
   computer's USB port. You will need the Bluetooth stack (available
-  at http://developer.axis.com/software/index.shtml) to fully use
+  at <http://developer.axis.com/software/index.shtml)> to fully use
   the device.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called bluetooth.o. If you want to compile it as 
-  a module, say M here and read Documentation/modules.txt.
-  
+  The module will be called bluetooth.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
 Minix fs support
 CONFIG_MINIX_FS
   Minix is a simple operating system used in many classes about OS's.
@@ -12056,58 +13587,75 @@
   but has been superseded by the second extended file system ext2fs.
   You don't want to use the minix file system on your hard disk
   because of certain built-in restrictions, but it is sometimes found
-  on older Linux floppy disks. This option will enlarge your kernel by
-  about 28 KB. If unsure, say N.
+  on older Linux floppy disks.  This option will enlarge your kernel
+  by about 28 KB. If unsure, say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called minix.o. Note that the file system of your root partition
-  (the one containing the directory /) cannot be compiled as a module.
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called minix.o.  Note that the file system of your root
+  partition (the one containing the directory /) cannot be compiled as
+  a module.
 
 Reiserfs support
 CONFIG_REISERFS_FS
-
   Stores not just filenames but the files themselves in a balanced
   tree.  Uses journaling.
 
-  Balanced trees are more efficient than traditional
-  filesystem architectural foundations.
+  Balanced trees are more efficient than traditional file system
+  architectural foundations.
 
-  In general, ReiserFS is as fast as ext2, but is very efficient
-  with large directories and small files.  Additional patches are
-  needed for NFS and quotas, please see www.reiserfs.org for
-  links.
+  In general, ReiserFS is as fast as ext2, but is very efficient with
+  large directories and small files.  Additional patches are needed
+  for NFS and quotas, please see <http://www.reiserfs.org> for links.
 
   It is more easily extended to have features currently found in
-  database and keyword search systems than block allocation based
-  filesystems are.  The next version will be so extended, and will
-  support plugins consistent with our motto ``It takes more than a
-  license to make source code open.''
+  database and keyword search systems than block allocation based file
+  systems are.  The next version will be so extended, and will support
+  plugins consistent with our motto ``It takes more than a license to
+  make source code open.''
 
-  Read www.reiserfs.org to learn more about reiserfs.
+  Read <http://www.reiserfs.org> to learn more about reiserfs.
 
   Sponsored by Threshold Networks, Emusic.com, and Bigstorage.com.
 
   If you like it, you can pay us to add new features to it that you
   need, buy a support contract, or pay us to port it to another OS.
 
-Enable Reiserfs consistency checks
+Enable extra Reiserfs consistency checks
 CONFIG_REISERFS_CHECK
-  If you set this to yes, then ReiserFS will perform every check it
-  can possibly imagine of its internal consistency throughout its
+  If you set this to Y, then ReiserFS will perform every check it can
+  possibly imagine of its internal consistency throughout its
   operation.  It will also go substantially slower.  More than once we
   have forgotten that this was on, and then gone despondent over the
   latest benchmarks.:-) Use of this option allows our team to go all
   out in checking for consistency when debugging without fear of its
   effect on end users.  If you are on the verge of sending in a bug
-  report, say yes and you might get a useful error message.  Almost
-  everyone should say no.
+  report, say Y and you might get a useful error message.  Almost
+  everyone should say N.
+
+Publish some reiserfs-specific info under /proc/fs/reiserfs
+CONFIG_REISERFS_PROC_INFO
+  Create under /proc/fs/reiserfs hierarchy of files, displaying
+  various ReiserFS statistics and internal data on the expense of
+  making your kernel or module slightly larger (+8 KB).  This also
+  increases amount of kernel memory required for each mount.  Almost
+  everyone but ReiserFS developers and people fine-tuning reiserfs or
+  tracing problems should say N.
+
+Publish some reiserfs-specific info under /proc/fs/reiserfs
+CONFIG_REISERFS_PROC_INFO
+  Create under /proc/fs/reiserfs hierarchy of files, displaying
+  various ReiserFS statistics and internal data on the expense of
+  making your kernel or module slightly larger (+8K). This also increases 
+  amount of kernel memory required for each mount. Almost everyone
+  but ReiserFS developers and people fine-tuning reiserfs or tracing
+  problems should say NO.
 
 Second extended fs support
 CONFIG_EXT2_FS
   This is the de facto standard Linux file system (method to organize
-  files on a storage device) for hard disks. 
+  files on a storage device) for hard disks.
 
   You want to say Y here, unless you intend to use Linux exclusively
   from inside a DOS partition using the UMSDOS file system. The
@@ -12125,70 +13673,151 @@
   by about 44 KB.
 
   The Ext2fs-Undeletion mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , gives information about
+  <http://www.linuxdoc.org/docs.html#howto>, gives information about
   how to retrieve deleted files on ext2fs file systems.
 
   To change the behavior of ext2 file systems, you can use the tune2fs
   utility ("man tune2fs"). To modify attributes of files and
   directories on ext2 file systems, use chattr ("man chattr").
-  
+
   Ext2fs partitions can be read from within DOS using the ext2tool
   command line tool package (available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2 ) and from
+  <ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2>) and from
   within Windows NT using the ext2nt command line tool package from
-  ftp://metalab.unc.edu/pub/Linux/utils/dos . Explore2fs is a
+  <ftp://metalab.unc.edu/pub/Linux/utils/dos>.  Explore2fs is a
   graphical explorer for ext2fs partitions which runs on Windows 95
   and Windows NT and includes experimental write support; it is
   available from
-  http://jnewbigin-pc.it.swin.edu.au/Linux/Explore2fs.htm .
+  <http://jnewbigin-pc.it.swin.edu.au/Linux/Explore2fs.htm>.
 
   If you want to compile this file system as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called ext2.o. Be aware however that the file system of your
-  root partition (the one containing the directory /) cannot be
-  compiled as a module, and so this could be dangerous. Most everyone
-  wants to say Y here.
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called ext2.o.  Be aware however that the file system
+  of your root partition (the one containing the directory /) cannot
+  be compiled as a module, and so this could be dangerous.  Most
+  everyone wants to say Y here.
+
+Ext3 journaling file system support (EXPERIMENTAL)
+CONFIG_EXT3_FS
+  This is the journaling version of the Second extended file system
+  (often called ext3), the de facto standard Linux file system
+  (method to organize files on a storage device) for hard disks.
+
+  The journaling code included in this driver means you do not have
+  to run e2fsck (file system checker) on your file systems after a
+  crash.  The journal keeps track of any changes that were being made
+  at the time the system crashed, and can ensure that your file system
+  is consistent without the need for a lengthy check.
+
+  Other than adding the journal to the file system, the on-disk format
+  of ext3 is identical to ext2.  It is possible to freely switch
+  between using the ext3 driver and the ext2 driver, as long as the
+  file system has been cleanly unmounted, or e2fsck is run on the file
+  system.
+
+  To add a journal on an existing ext2 file system or change the
+  behavior of ext3 file systems, you can use the tune2fs utility ("man
+  tune2fs").  To modify attributes of files and directories on ext3
+  file systems, use chattr ("man chattr").  You need to be using
+  e2fsprogs version 1.20 or later in order to create ext3 journals
+  (available at <http://sourceforge.net/projects/e2fsprogs/>).
 
-BFS file system support (EXPERIMENTAL)
+  If you want to compile this file system as a module ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called ext3.o.  Be aware however that the file system
+  of your root partition (the one containing the directory /) cannot
+  be compiled as a module, and so this may be dangerous.
+
+Journal Block Device support (JBD for ext3) (EXPERIMENTAL)
+CONFIG_JBD
+  This is a generic journaling layer for block devices.  It is
+  currently used by the ext3 file system, but it could also be used to
+  add journal support to other file systems or block devices such as
+  RAID or LVM.
+
+  If you are using the ext3 file system, you need to say Y here. If
+  you are not using ext3 then you will probably want to say N.
+
+  If you want to compile this device as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called jbd.o.  If you are compiling ext3 into the kernel,
+  you cannot compile this code as a module.
+
+JBD (ext3) debugging support
+CONFIG_JBD_DEBUG
+  If you are using the ext3 journaled file system (or potentially any
+  other file system/device using JBD), this option allows you to
+  enable debugging output while the system is running, in order to
+  help track down any problems you are having.  By default the
+  debugging output will be turned off.
+
+  If you select Y here, then you will be able to turn on debugging
+  with "echo N > /proc/sys/fs/jbd-debug", where N is a number between
+  1 and 5, the higher the number, the more debugging output is
+  generated.  To turn debugging off again, do
+  "echo 0 > /proc/sys/fs/jbd-debug".
+
+Buffer Head tracing (DEBUG)
+CONFIG_BUFFER_DEBUG
+  If you are a kernel developer working with file systems or in the
+  block device layer, this buffer head tracing may help you to track
+  down bugs in your code.  This enables some debugging macros
+  (BUFFER_TRACE, etc.) which allow you to track the state of a buffer
+  through various layers of code.  The debugging code is used
+  primarily by ext3 and JBD code.
+
+  Because this option adds considerably to the size of each buffer,
+  most people will want to say N here.
+
+BFS file system support
 CONFIG_BFS_FS
   Boot File System (BFS) is a file system used under SCO UnixWare to
   allow the bootloader access to the kernel image and other important
-  files during the boot process. It is usually mounted under /stand
+  files during the boot process.  It is usually mounted under /stand
   and corresponds to the slice marked as "STAND" in the UnixWare
-  partition. You should say Y if you want to read or write
-  the files on your /stand slice from within Linux. You then also 
-  need to say Y to "UnixWare slices support", below. More information
-  about the BFS file system is contained in the file 
-  Documentation/filesystems/bfs.txt. 
+  partition.  You should say Y if you want to read or write the files
+  on your /stand slice from within Linux.  You then also need to say Y
+  to "UnixWare slices support", below.  More information about the BFS
+  file system is contained in the file
+  <file:Documentation/filesystems/bfs.txt>.
 
   If you don't know what this is about, say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called bfs.o. Note that the file system of your root partition (the
-  one containing the directory /) cannot be compiled as a module.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bfs.o.  Note that the file system of your root
+  partition (the one containing the directory /) cannot be compiled as
+  a module.
 
 Compressed ROM file system support
 CONFIG_CRAMFS
   Saying Y here includes support for CramFs (Compressed ROM File
-  System). Cramfs is designed to be a simple, small, and compressed
-  file system for ROM based embedded systems. CramFs is read-only,
+  System).  CramFs is designed to be a simple, small, and compressed
+  file system for ROM based embedded systems.  CramFs is read-only,
   limited to 256MB file systems (with 16MB files), and doesn't support
   16/32 bits uid/gid, hard links and timestamps.
-  
-  See Documentation/filesystems/cramfs.txt and fs/cramfs/README
-  for further information.
+
+  See <file:Documentation/filesystems/cramfs.txt> and
+  <file:fs/cramfs/README> for further information.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called cramfs.o. Note that the root file system (the one containing
-  the directory /) cannot be compiled as a module.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called cramfs.o.  Note that the root file system (the one
+  containing the directory /) cannot be compiled as a module.
 
   If unsure, say N.
-   
+
+CMS file system support
+CONFIG_CMS_FS
+  Read only support for CMS minidisk file systems found on IBM
+  mainframe systems.  Only the basic format is supported so far.  If
+  you don't know what CMS is you probably don't want to know any more.
+
 Virtual memory file system support
 CONFIG_TMPFS
   Tmpfs is a file system which keeps all files in virtual memory.
@@ -12200,8 +13829,8 @@
   Everything is "virtual" in the sense that no files will be created
   on your hard drive; if you reboot, everything in tmpfs will be
   lost.
-  
-  You should mount the filesystem somewhere to be able to use
+
+  You should mount the file system somewhere to be able to use
   POSIX shared memory. Adding the following line to /etc/fstab should
   take care of things:
 
@@ -12211,10 +13840,10 @@
   if necessary (/dev/shm is automagically created if you use devfs).
 
   You can set limits for the number of blocks and inodes used by the
-  filesystem with the mount options "size", "nr_blocks" and
+  file system with the mount options "size", "nr_blocks" and
   "nr_inodes". These parameters accept a suffix k, m or g for kilo,
   mega and giga and can be changed on remount.
-  
+
   The initial permissions of the root directory can be set with the
   mount option "mode".
 
@@ -12223,40 +13852,40 @@
   Ramfs is a file system which keeps all files in RAM. It allows
   read and write access.
 
-  It is more of an programming example than a useable filesystem. If
+  It is more of an programming example than a useable file system.  If
   you need a file system which lives in RAM with limit checking use
   tmpfs.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ramfs.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ramfs.o.
 
-ISO 9660 CDROM file system support
+ISO 9660 CD-ROM file system support
 CONFIG_ISO9660_FS
-  This is the standard file system used on CDROMs. It was previously
+  This is the standard file system used on CD-ROMs.  It was previously
   known as "High Sierra File System" and is called "hsfs" on other
-  Unix systems. The so-called Rock-Ridge extensions which allow for
+  Unix systems.  The so-called Rock-Ridge extensions which allow for
   long Unix filenames and symbolic links are also supported by this
-  driver. If you have a CDROM drive and want to do more with it than
+  driver.  If you have a CD-ROM drive and want to do more with it than
   just listen to audio CDs and watch its LEDs, say Y (and read
-  Documentation/filesystems/isofs.txt and the CDROM-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto ), thereby enlarging
-  your kernel by about 27 KB; otherwise say N.
+  <file:Documentation/filesystems/isofs.txt> and the CD-ROM-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>), thereby
+  enlarging your kernel by about 27 KB; otherwise say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called isofs.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called isofs.o.
 
-Microsoft Joliet CDROM extensions
+Microsoft Joliet CD-ROM extensions
 CONFIG_JOLIET
-  Joliet is a Microsoft extension for the ISO 9660 CDROM file system
+  Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
   which allows for long filenames in unicode format (unicode is the
   new 16 bit character code, successor to ASCII, which encodes the
   characters of almost all languages of the world; see
-  http://www.unicode.org for more information). Say Y here if you want
-  to be able to read Joliet CDROMs under Linux.
+  <http://www.unicode.org> for more information).  Say Y here if you
+  want to be able to read Joliet CD-ROMs under Linux.
 
 Transparent decompression extension
 CONFIG_ZISOFS
@@ -12267,21 +13896,21 @@
   necessary to create such a filesystem.  Say Y here if you want to be
   able to read such compressed CD-ROMs.
 
-UDF File System support (read only)
+UDF file system support (read-only)
 CONFIG_UDF_FS
-  This is the new file system used on some CDROMs and DVDs. Say Y if
+  This is the new file system used on some CD-ROMs and DVDs. Say Y if
   you intend to mount DVD discs or CDRW's written in packet mode, or
   if written to by other UDF utilities, such as DirectCD. This UDF
   file system support is read-only. If you want to write to UDF
   file systems on some media, you need to say Y to "UDF read-write
   support" below in addition. Please read
-  Documentation/filesystems/udf.txt.
+  <file:Documentation/filesystems/udf.txt>.
 
   This file system support is also available as a module ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). The module is called udf.o. If you want to
   compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
   If unsure, say N.
 
@@ -12315,23 +13944,23 @@
   Linux box, say Y here, mount the floppy under Linux with an MSDOS
   file system and use GNU tar's M option. GNU tar is a program
   available for Unix and DOS ("man tar" or "info tar").
-  
+
   It is now also becoming possible to read and write compressed FAT
-  file systems; read Documentation/filesystems/fat_cvf.txt for
+  file systems; read <file:Documentation/filesystems/fat_cvf.txt> for
   details.
-  
+
   The FAT support will enlarge your kernel by about 37 KB. If unsure,
   say Y.
 
   If you want to compile this as a module however ( = code which can
   be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called fat.o. Note that if you compile the FAT support as a
-  module, you cannot compile any of the FAT-based file systems into
-  the kernel -- they will have to be modules as well. The file system
-  of your root partition (the one containing the directory /) cannot
-  be a module, so don't say M here if you intend to use UMSDOS as your
-  root file system.
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called fat.o.  Note that if you compile the FAT
+  support as a module, you cannot compile any of the FAT-based file
+  systems into the kernel -- they will have to be modules as well.
+  The file system of your root partition (the one containing the
+  directory /) cannot be a module, so don't say M here if you intend
+  to use UMSDOS as your root file system.
 
 MSDOS fs support
 CONFIG_MSDOS_FS
@@ -12339,8 +13968,8 @@
   they are compressed; to access compressed MSDOS partitions under
   Linux, you can either use the DOS emulator DOSEMU, described in the
   DOSEMU-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , or try dmsdosfs in
-  ftp://metalab.unc.edu/pub/Linux/system/filesystems/dosfs . If you
+  <http://www.linuxdoc.org/docs.html#howto>, or try dmsdosfs in
+  <ftp://metalab.unc.edu/pub/Linux/system/filesystems/dosfs>. If you
   intend to use dosemu with a non-compressed MSDOS partition, say Y
   here) and MSDOS floppies. This means that file access becomes
   transparent, i.e. the MSDOS files look and behave just like all
@@ -12359,32 +13988,33 @@
   answer Y. This will only work if you said Y to "DOS FAT fs support"
   as well. If you want to compile this as a module however ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
   The module will be called msdos.o.
 
 VFAT (Windows-95) fs support
 CONFIG_VFAT_FS
   This option provides support for normal Windows file systems with
-  long filenames. That includes non-compressed FAT-based file systems
+  long filenames.  That includes non-compressed FAT-based file systems
   used by Windows 95, Windows 98, Windows NT 4.0, and the Unix
   programs from the mtools package.
 
   You cannot use the VFAT file system for your Linux root partition
   (the one containing the directory /); use UMSDOS instead if you
   want to run Linux from within a DOS partition (i.e. say Y to
-  "UMSDOS: Unix like fs on top of std MSDOS fs", below).
+  "Unix like fs on top of std MSDOS fs", below).
 
   The VFAT support enlarges your kernel by about 10 KB and it only
-  works if you said Y to the "DOS FAT fs support" above. Please read
-  the file Documentation/filesystems/vfat.txt for details. If unsure,
-  say Y.
+  works if you said Y to the "DOS FAT fs support" above.  Please read
+  the file <file:Documentation/filesystems/vfat.txt> for details.  If
+  unsure, say Y.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called vfat.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called vfat.o.
 
-UMSDOS: Unix-like file system on top of standard MSDOS fs
+Unix-like file system on top of standard MSDOS fs
 CONFIG_UMSDOS_FS
   Say Y here if you want to run Linux from within an existing DOS
   partition of your hard drive. The advantage of this is that you can
@@ -12392,34 +14022,25 @@
   backing everything up and restoring afterwards) and hence you're
   able to quickly try out Linux or show it to your friends; the
   disadvantage is that Linux becomes susceptible to DOS viruses and
-  that UMSDOS is somewhat slower than ext2fs. Another use of UMSDOS
+  that UMSDOS is somewhat slower than ext2fs.  Another use of UMSDOS
   is to write files with long unix filenames to MSDOS floppies; it
   also allows Unix-style soft-links and owner/permissions of files on
-  MSDOS floppies. You will need a program called umssync in order to
-  make use of UMSDOS; read Documentation/filesystems/umsdos.txt. 
+  MSDOS floppies.  You will need a program called umssync in order to
+  make use of UMSDOS; read
+  <file:Documentation/filesystems/umsdos.txt>.
 
   To get utilities for initializing/checking UMSDOS file system, or
   latest patches and/or information, visit the UMSDOS home page at
-  http://www.voyager.hr/~mnalis/umsdos/ .
+  <http://www.voyager.hr/~mnalis/umsdos/>.
 
   This option enlarges your kernel by about 28 KB and it only works if
   you said Y to both "DOS FAT fs support" and "MSDOS fs support"
-  above. If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called umsdos.o. Note that the file system of your root partition
-  (the one containing the directory /) cannot be a module, so saying M
-  could be dangerous. If unsure, say N.
-
-PReP residual data support
-CONFIG_PREP_RESIDUAL
-  Some PReP systems have residual data passed to the kernel by the
-  firmware.  This allows detection of memory size, devices present and
-  other useful pieces of information.  Sometimes this information is not
-  present or incorrect.
-
-  Unless you expect to boot on a PReP system, there is not need to select
-  yes.
+  above.  If you want to compile this as a module ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called umsdos.o.  Note that the file system of your
+  root partition (the one containing the directory /) cannot be a
+  module, so saying M could be dangerous.  If unsure, say N.
 
 /proc file system support
 CONFIG_PROC_FS
@@ -12427,7 +14048,7 @@
   of the system. "Virtual" means that it doesn't take up any space on
   your hard disk: the files are created on the fly by the kernel when
   you try to access them. Also, you cannot read the files with older
-  version of the program less: you need to use more or cat. 
+  version of the program less: you need to use more or cat.
 
   It's totally cool; for example, "cat /proc/interrupts" gives
   information about what the different IRQs are used for at the moment
@@ -12443,13 +14064,23 @@
   /proc" or the equivalent line in /etc/fstab does the job.
 
   The /proc file system is explained in the file
-  Documentation/filesystems/proc.txt and on the proc(5) manpage ("man
-  5 proc").
+  <file:Documentation/filesystems/proc.txt> and on the proc(5) manpage
+  ("man 5 proc").
 
   This option will enlarge your kernel by about 67 KB. Several
   programs depend on this, so everyone should say Y here.
 
-/dev file system support (EXPERIMENTAL)
+Support for PReP Residual Data
+CONFIG_PREP_RESIDUAL
+  Some PReP systems have residual data passed to the kernel by the
+  firmware.  This allows detection of memory size, devices present and
+  other useful pieces of information.  Sometimes this information is
+  not present or incorrect.
+
+  Unless you expect to boot on a PReP system, there is not need to
+  select Y.
+
+/dev file system support
 CONFIG_DEVFS_FS
   This is support for devfs, a virtual file system (like /proc) which
   provides the file system interface to device drivers, normally found
@@ -12460,12 +14091,12 @@
   /dev directory using the mknod command (or MAKEDEV script) anymore.
 
   This is work in progress. If you want to use this, you *must* read
-  the material in Documentation/filesystems/devfs/, especially the
-  file README there.
+  the material in <file:Documentation/filesystems/devfs/>, especially
+  the file README there.
 
   If unsure, say N.
 
-Enable automatic mounting at boot
+Automatically mount devfs at boot time
 CONFIG_DEVFS_MOUNT
   This option appears if you have CONFIG_DEVFS_FS enabled. Setting
   this to 'Y' will make the kernel automatically mount devfs onto /dev
@@ -12478,8 +14109,9 @@
 CONFIG_DEVFS_DEBUG
   If you say Y here, then the /dev file system code will generate
   debugging messages. See the file
-  Documentation/filesystems/devfs/boot-options for more details.
-  
+  <file:Documentation/filesystems/devfs/boot-options> for more
+  details.
+
   If unsure, say N.
 
 NFS file system support
@@ -12493,35 +14125,35 @@
   programs nfsd and mountd (but does not need to have NFS file system
   support enabled in its kernel). NFS is explained in the Network
   Administrator's Guide, available from
-  http://www.linuxdoc.org/docs.html#guide , on its man page: "man
+  <http://www.linuxdoc.org/docs.html#guide>, on its man page: "man
   nfs", and in the NFS-HOWTO.
-  
+
   A superior but less widely used alternative to NFS is provided by
   the Coda file system; see "Coda file system support" below.
 
   If you say Y here, you should have said Y to TCP/IP networking also.
-  This option would enlarge your kernel by about 27 KB. 
+  This option would enlarge your kernel by about 27 KB.
 
   This file system is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module is called nfs.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. 
+  say M here and read <file:Documentation/modules.txt>.
 
   If you are configuring a diskless machine which will mount its root
-  file system over NFS at boot time, say Y here and to "IP: kernel
-  level autoconfiguration" above and to "Root file system on NFS"
+  file system over NFS at boot time, say Y here and to "Kernel
+  level IP autoconfiguration" above and to "Root file system on NFS"
   below. You cannot compile this driver as a module in this case.
   There are two packages designed for booting diskless machines over
   the net: netboot and etherboot, both available via FTP from
-  ftp://metalab.unc.edu/pub/Linux/system/boot/ethernet/ .
+  <ftp://metalab.unc.edu/pub/Linux/system/boot/Ethernet/>.
 
   If you don't know what all this is about, say N.
 
-Provide NFSv3 client support (EXPERIMENTAL)
+Provide NFSv3 client support
 CONFIG_NFS_V3
   Say Y here if you want your NFS client to be able to speak the newer
-  version 3 of the NFS protocol. 
- 
+  version 3 of the NFS protocol.
+
   If unsure, say N.
 
 Root file system on NFS
@@ -12529,12 +14161,12 @@
   If you want your Linux box to mount its whole root file system (the
   one containing the directory /) from some other computer over the
   net via NFS (presumably because your box doesn't have a hard disk),
-  say Y. Read Documentation/nfsroot.txt for details. It is likely that
-  in this case, you also want to say Y to "IP: kernel level
+  say Y. Read <file:Documentation/nfsroot.txt> for details. It is
+  likely that in this case, you also want to say Y to "Kernel level IP
   autoconfiguration" so that your box can discover its network address
   at boot time.
-  
-  Most people say N here. 
+
+  Most people say N here.
 
 NFS server support
 CONFIG_NFSD
@@ -12547,20 +14179,21 @@
   faster.
 
   In either case, you will need support software; the respective
-  locations are given in the file Documentation/Changes in the NFS
-  section.
+  locations are given in the file <file:Documentation/Changes> in the
+  NFS section.
 
   If you say Y here, you will get support for version 2 of the NFS
   protocol (NFSv2). If you also want NFSv3, say Y to the next question
   as well.
 
   Please read the NFS-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   The NFS server is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called nfsd.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. If unsure, say N.
+  The module is called nfsd.o.  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.  If unsure,
+  say N.
 
 Provide NFSv3 server support
 CONFIG_NFSD_V3
@@ -12572,7 +14205,8 @@
   If you are a developer and want to work on fixing problems with
   NFS server over TCP support, say Y here.  If unsure, say N.
 
-  Some problems can be found by looking for FIXME in net/sunrpc/svcsock.c
+  Some problems can be found by looking for FIXME in
+  <file:net/sunrpc/svcsock.c>.
 
 OS/2 HPFS file system support
 CONFIG_HPFS_FS
@@ -12582,29 +14216,13 @@
   write files to an OS/2 HPFS partition on your hard drive. OS/2
   floppies however are in regular MSDOS format, so you don't need this
   option in order to be able to read them. Read
-  Documentation/filesystems/hpfs.txt.
-
-  This file system is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called hpfs.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. If unsure, say N.
-
-FreeVxFS file system support (VERITAS VxFS(TM) compatible)
-CONFIG_VXFS_FS
-  FreeVxFS is a filesystem driver that support the VERITAS VxFS(TM)
-  filesystem format.  VERITAS VxFS(TM) is the standard filesystem
-  of SCO UnixWare (and possibly others) and optionally available
-  for Sunsoft Solaris, HP-UX and many other operating systems.
-  Currently only readonly access is supported.
-
-  NOTE:	the filesystem type as used by mount(1), mount(2) and fstab(5)
-	is 'vxfs' as it describes the filesystem format, not the
-	actual driver.
+  <file:Documentation/filesystems/hpfs.txt>.
 
   This file system is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called freevxfs.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. If unsure, say N.
+  The module is called hpfs.o.  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.  If unsure,
+  say N.
 
 NTFS file system support (read-only)
 CONFIG_NTFS_FS
@@ -12637,94 +14255,98 @@
 
   If unsure, say N.
 
-System V, Version 7, Xenix and Coherent filesystem support
+System V/Xenix/V7/Coherent file system support
 CONFIG_SYSV_FS
   SCO, Xenix and Coherent are commercial Unix systems for Intel
   machines, and Version 7 was used on the DEC PDP-11. Saying Y
   here would allow you to read from their floppies and hard disk
-  partitions. If you also want to write to these media, say Y to
-  "SYSV file system write support" below.
+  partitions.
 
   If you have floppies or hard disk partitions like that, it is likely
   that they contain binaries from those other Unix systems; in order
   to run these binaries, you will want to install linux-abi which is a
-  a set of kernel modules that lets you run SCO, Xenix, Wyse, UnixWare,
-  Dell Unix and System V programs under Linux.  It's available via FTP
-  (user: ftp) from ftp://ftp.openlinux.org/pub/people/hch/linux-abi).
+  a set of kernel modules that lets you run SCO, Xenix, Wyse,
+  UnixWare, Dell Unix and System V programs under Linux.  It is
+  available via FTP (user: ftp) from
+  <ftp://ftp.openlinux.org/pub/people/hch/linux-abi>).
   NOTE: that will work only for binaries from Intel-based systems;
   PDP ones will have to wait until somebody ports Linux to -11 ;-)
 
   If you only intend to mount files from some other Unix over the
   network using NFS, you don't need the System V file system support
-  (but you need NFS file system support obviously). 
+  (but you need NFS file system support obviously).
 
   Note that this option is generally not needed for floppies, since a
   good portable way to transport files and directories between unixes
   (and even other operating systems) is given by the tar program ("man
-  tar" or preferably "info tar"). Note also that this option has
+  tar" or preferably "info tar").  Note also that this option has
   nothing whatsoever to do with the option "System V IPC". Read about
-  the System V file system in Documentation/filesystems/sysv-fs.txt.
+  the System V file system in
+  <file:Documentation/filesystems/sysv-fs.txt>.
   Saying Y here will enlarge your kernel by about 27 KB.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called sysv.o. 
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sysv.o.
 
   If you haven't heard about all of this before, it's safe to say N.
 
 Amiga FFS file system support
 CONFIG_AFFS_FS
   The Fast File System (FFS) is the common file system used on hard
-  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20). Say Y
+  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
   if you want to be able to read and write files from and to an Amiga
-  FFS partition on your hard drive. Amiga floppies however cannot be
+  FFS partition on your hard drive.  Amiga floppies however cannot be
   read with this driver due to an incompatibility of the floppy
   controller used in an Amiga and the standard floppy controller in
-  PCs and workstations. Read Documentation/filesystems/affs.txt and
-  fs/affs/Changes. 
+  PCs and workstations. Read <file:Documentation/filesystems/affs.txt>
+  and <file:fs/affs/Changes>.
 
   With this driver you can also mount disk files used by Bernd
-  Schmidt's Un*X Amiga Emulator (http://www.freiburg.linux.de/~uae/ ).
+  Schmidt's Un*X Amiga Emulator
+  (<http://www.freiburg.linux.de/~uae/>).
   If you want to do this, you will also need to say Y or M to "Loop
   device support", above.
 
   This file system is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called affs.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. If unsure, say N.
+  The module is called affs.o.  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.  If unsure,
+  say N.
 
-Apple Macintosh file system support (EXPERIMENTAL)
+Apple Macintosh file system support
 CONFIG_HFS_FS
   If you say Y here, you will be able to mount Macintosh-formatted
   floppy disks and hard drive partitions with full read-write access.
-  Please read fs/hfs/HFS.txt to learn about the available mount
-  options. 
+  Please read <file:fs/hfs/HFS.txt> to learn about the available mount
+  options.
 
   This file system support is also available as a module ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). The module is called hfs.o. If you want to
+  whenever you want). The module is called hfs.o.  If you want to
   compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 ROM file system support
 CONFIG_ROMFS_FS
   This is a very small read-only file system mainly intended for
   initial ram disks of installation disks, but it could be used for
-  other read-only media as well. Read
-  Documentation/filesystems/romfs.txt for details. 
+  other read-only media as well.  Read
+  <file:Documentation/filesystems/romfs.txt> for details.
 
   This file system support is also available as a module ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want). The module is called romfs.o. If you want to
+  whenever you want). The module is called romfs.o.  If you want to
   compile it as a module, say M here and read
-  Documentation/modules.txt. Note that the file system of your root
-  partition (the one containing the directory /) cannot be a module.
+  <file:Documentation/modules.txt>.  Note that the file system of your
+  root partition (the one containing the directory /) cannot be a
+  module.
 
   If you don't know whether you need it, then you don't need it:
   answer N.
 
-QNX4 file system support (read only) (EXPERIMENTAL)
+QNX4 file system support (read only)
 CONFIG_QNX4FS_FS
   This is the file system used by the operating system QNX 4. Say Y if
   you intend to mount QNX hard disks or floppies. Unless you say Y to
@@ -12735,7 +14357,7 @@
   which can be inserted in and removed from the running kernel
   whenever you want). The module is called qnx4.o. If you want to
   compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
   If you don't know whether you need it, then you don't need it:
   answer N.
@@ -12752,8 +14374,8 @@
   automounter (amd), which is a pure user space daemon.
 
   To use the automounter you need the user-space tools from the autofs
-  package; you can find the location in Documentation/Changes. You
-  also want to answer Y to "NFS file system support", below.
+  package; you can find the location in <file:Documentation/Changes>.
+  You also want to answer Y to "NFS file system support", below.
 
   If you want to use the newer version of the automounter with more
   features, say N here and say Y to "Kernel automounter v4 support",
@@ -12761,13 +14383,13 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called autofs.o. 
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called autofs.o.
 
   If you are not a part of a fairly large, distributed network, you
   probably do not need an automounter, and can say N here.
 
-Kernel automounter v4 support
+Kernel automounter version 4 support (also supports v3)
 CONFIG_AUTOFS4_FS
   The automounter is a tool to automatically mount remote file systems
   on demand. This implementation is partially kernel-based to reduce
@@ -12775,46 +14397,70 @@
   automounter (amd), which is a pure user space daemon.
 
   To use the automounter you need the user-space tools from
-  ftp://ftp.kernel.org/pub/linux/daemons/autofs/testing-v4 ; you also
+  <ftp://ftp.kernel.org/pub/linux/daemons/autofs/testing-v4>; you also
   want to answer Y to "NFS file system support", below.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called autofs4.o.  You will need to add "alias autofs autofs4" to
-  your modules configuration file.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called autofs4.o.  You will need to add "alias autofs
+  autofs4" to your modules configuration file.
 
   If you are not a part of a fairly large, distributed network or
   don't have a laptop which needs to dynamically reconfigure to the
   local network, you probably do not need an automounter, and can say
   N here.
 
-EFS file system support (read-only) (EXPERIMENTAL)
+EFS file system support (read-only)
 CONFIG_EFS_FS
-  EFS is an older file system used for non-ISO9660 CDROMs and hard
+  EFS is an older file system used for non-ISO9660 CD-ROMs and hard
   disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
   uses the XFS file system for hard disk partitions however).
 
   This implementation only offers read-only access. If you don't know
   what all this is about, it's safe to say N. For more information
-  about EFS see its home page at http://aeschi.ch.eu.org/efs/ .
+  about EFS see its home page at <http://aeschi.ch.eu.org/efs/>.
 
   If you want to compile the EFS file system support as a module ( =
   code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
-  The module will be called efs.o. 
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>. The module will be called efs.o.
 
-Support for the Journalling Flash Filesystem
+Journalling Flash File System (JFFS) support
 CONFIG_JFFS_FS
   JFFS is the Journaling Flash File System developed by Axis
   Communications in Sweden, aimed at providing a crash/powerdown-safe
-  filesystem for disk-less embedded devices. Further information is
-  available at (http://developer.axis.com/software/jffs/).
+  file system for disk-less embedded devices. Further information is
+  available at (<http://developer.axis.com/software/jffs/>).
 
-JFFS debugging verbosity
+JFFS debugging verbosity (0 = quiet, 3 = noisy)
 CONFIG_JFFS_FS_VERBOSE
   Determines the verbosity level of the JFFS debugging messages.
 
+Journalling Flash File System v2 (JFFS2) support
+CONFIG_JFFS2_FS
+  JFFS2 is the second generation of the Journalling Flash File System
+  for use on diskless embedded devices. It provides improved wear
+  levelling, compression and support for hard links. You cannot use
+  this on normal block devices, only on 'MTD' devices.
+
+  Further information should be made available soon at
+  <http://sources.redhat.com/jffs2/>.
+
+JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
+CONFIG_JFFS2_FS_DEBUG
+  This controls the amount of debugging messages produced by the JFFS2
+  code. Set it to zero for use in production systems. For evaluation,
+  testing and debugging, it's advisable to set it to one. This will
+  enable a few assertions and will print debugging messages at the
+  KERN_DEBUG loglevel, where they won't normally be visible. Level 2
+  is unlikely to be useful - it enables extra debugging in certain
+  areas which at one point needed debugging, but when the bugs were
+  located and fixed, the detailed messages were relegated to level 2.
+
+  If reporting bugs, please try to have available a full dump of the
+  messages at debug level 1 while the misbehaviour was occurring.
+
 UFS file system support (read-only)
 CONFIG_UFS_FS
   BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
@@ -12823,11 +14469,11 @@
   this file system as well. Saying Y here will allow you to read from
   these partitions; if you also want to write to them, say Y to the
   experimental "UFS file system write support", below. Please read the
-  file Documentation/filesystems/ufs.txt for more information.
+  file <file:Documentation/filesystems/ufs.txt> for more information.
 
   If you only intend to mount files from some other Unix over the
   network using NFS, you don't need the UFS file system support (but
-  you need NFS file system support obviously). 
+  you need NFS file system support obviously).
 
   Note that this option is generally not needed for floppies, since a
   good portable way to transport files and directories between unixes
@@ -12836,12 +14482,12 @@
 
   When accessing NeXTstep files, you may need to convert them from the
   NeXT character set to the Latin1 character set; use the program
-  recode ("info recode") for this purpose. 
+  recode ("info recode") for this purpose.
 
   If you want to compile the UFS file system support as a module ( =
   code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
-  The module will be called ufs.o. 
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>. The module will be called ufs.o.
 
   If you haven't heard about all of this before, it's safe to say N.
 
@@ -12857,11 +14503,38 @@
   architecture than your Linux system.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
-  the questions about foreign partitioning schemes. 
+  kernel: saying N will just cause the configurator to skip all
+  the questions about foreign partitioning schemes.
 
   If unsure, say N.
 
+Acorn partition support
+CONFIG_ACORN_PARTITION
+  Support hard disks partitioned under Acorn operating systems.
+
+Native filecore partition support
+CONFIG_ACORN_PARTITION_ADFS
+  The Acorn Disc Filing System is the standard file system of the
+  RiscOS operating system which runs on Acorn's ARM-based Risc PC
+  systems and the Acorn Archimedes range of machines.  If you say
+  `Y' here, Linux will support disk partitions created under ADFS.
+
+PowerTec partition support
+CONFIG_ACORN_PARTITION_POWERTEC
+  Support reading partition tables created on Acorn machines using
+  the PowerTec SCSI drive.
+
+RISCiX partition support
+CONFIG_ACORN_PARTITION_RISCIX
+  Once upon a time, there was a native Unix port for the Acorn series
+  of machines called RISCiX.  If you say 'Y' here, Linux will be able
+  to read disks partitioned under RISCiX.
+
+ICS partition support
+CONFIG_ACORN_PARTITION_ICS
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned using the ICS interface on Acorn machines.
+
 Alpha OSF partition support
 CONFIG_OSF_PARTITION
   Say Y here if you would like to use hard disks under Linux which
@@ -12884,10 +14557,11 @@
   mirrored, striped or RAID volumes, all without the need for
   rebooting.
 
-  Normal partitions are now called Basic Disks under Windows 2000 and XP.
+  Normal partitions are now called Basic Disks under Windows 2000 and
+  XP.
 
   Technical documentation to accompany this driver is available from:
-  <http://linux-ntfs.sf.net/ldm>
+  <http://linux-ntfs.sf.net/ldm>.
 
   If unsure, say N.
 
@@ -12904,6 +14578,16 @@
   Say Y here if you would like to use hard disks under Linux which
   were partitioned on an x86 PC (not necessarily by DOS).
 
+Amiga partition table support
+CONFIG_AMIGA_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned under AmigaOS.
+
+Atari partition table support
+CONFIG_ATARI_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned under the Atari OS.
+
 BSD disklabel (FreeBSD partition tables) support
 CONFIG_BSD_DISKLABEL
   FreeBSD uses its own hard disk partition scheme on your PC. It
@@ -12921,7 +14605,7 @@
   Say Y here if you want to mount and use Minix 2.0.0/2.0.2
   subpartitions.
 
-Sun partition tables support
+Sun partition table support
 CONFIG_SUN_PARTITION
   Like most systems, SunOS uses its own hard disk partition table
   format, incompatible with all others. Saying Y here allows you to
@@ -12947,13 +14631,19 @@
   Say Y here if you would like to be able to read the hard disk
   partition table format used by SGI machines.
 
-Ultrix partition support
+Ultrix partition table support
 CONFIG_ULTRIX_PARTITION
   Say Y here if you would like to be able to read the hard disk
   partition table format used by DEC (now Compaq) Ultrix machines.
   Otherwise, say N.
 
-ADFS file system support (EXPERIMENTAL)
+IBM disk label and partition support
+CONFIG_IBM_PARTITION
+  Say Y here if you would like to be able to read the hard disk
+  partition table format used by IBM DASD disks operating under CMS.
+  Otherwise, say N.
+
+ADFS file system support
 CONFIG_ADFS_FS
   The Acorn Disc Filing System is the standard file system of the
   RiscOS operating system which runs on Acorn's ARM-based Risc PC
@@ -12964,12 +14654,12 @@
 
   The ADFS partition should be the first partition (i.e.,
   /dev/[hs]d?1) on each of your drives. Please read the file
-  Documentation/filesystems/adfs.txt for further details.
+  <file:Documentation/filesystems/adfs.txt> for further details.
 
   This code is also available as a module called adfs.o ( = code which
   can be inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
   If unsure, say N.
 
@@ -12989,17 +14679,55 @@
   to acquire a pseudo terminal, a process opens /dev/ptmx; the number
   of the pseudo terminal is then made available to the process and the
   pseudo terminal slave can be accessed as /dev/pts/<number>. What was
-  traditionally /dev/ttyp2 will then be /dev/pts/2, for example. 
+  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
 
   The GNU C library glibc 2.1 contains the requisite support for this
   mode of operation; you also need client programs that use the Unix98
-  API. Please read Documentation/Changes for more information about
-  the Unix98 pty devices.
+  API. Please read <file:Documentation/Changes> for more information
+  about the Unix98 pty devices.
 
   Note that the experimental "/dev file system support"
   (CONFIG_DEVFS_FS)  is a more general facility.
 
-UnixWare slices support (EXPERIMENTAL)
+# This is for Linus's tree
+FreeVxFS file system support (VERITAS VxFS(TM) compatible)
+CONFIG_VXFS_FS
+  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
+  file system format.  VERITAS VxFS(TM) is the standard file system
+  of SCO UnixWare (and possibly others) and optionally available
+  for Sunsoft Solaris, HP-UX and many other operating systems.
+  Currently only readonly access is supported.
+
+  NOTE: the file system type as used by mount(1), mount(2) and
+        fstab(5) is 'vxfs' as it describes the file system format, not
+        the actual driver.
+
+  This file system is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called freevxfs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N. 
+
+# This is for Alan's tree.  Note the name difference.
+FreeVxFS file system support (VERITAS VxFS(TM) compatible)
+CONFIG_FREEVXFS_FS
+  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
+  file system format.  VERITAS VxFS(TM) is the standard file system
+  of SCO UnixWare (and possibly others) and optionally available
+  for Sunsoft Solaris, HP-UX and many other operating systems.
+  Currently only readonly access is supported.
+
+  NOTE: the file system type as used by mount(1), mount(2) and
+        fstab(5) is 'vxfs' as it describes the filesystem format, not
+        the actual driver.
+
+  This file system is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called freevxfs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+UnixWare slices support
 CONFIG_UNIXWARE_DISKLABEL
   Like some systems, UnixWare uses its own slice table inside a
   partition (VTOC - Virtual Table of Contents). Its format is
@@ -13013,7 +14741,7 @@
   removable IDE drives. Note, however, that a good portable way to
   transport files and directories between unixes (and even other
   operating systems) is given by the tar program ("man tar" or
-  preferably "info tar"). 
+  preferably "info tar").
 
   If you don't know what all this is about, say N.
 
@@ -13021,29 +14749,29 @@
 CONFIG_SMB_FS
   SMB (Server Message Block) is the protocol Windows for Workgroups
   (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
-  files and printers over local networks. Saying Y here allows you to
+  files and printers over local networks.  Saying Y here allows you to
   mount their file systems (often called "shares" in this context) and
-  access them just like any other Unix directory. Currently, this
+  access them just like any other Unix directory.  Currently, this
   works only if the Windows machines use TCP/IP as the underlying
-  transport protocol, and not NetBEUI. For details, read
-  Documentation/filesystems/smbfs.txt and the SMB-HOWTO, available
-  from http://www.linuxdoc.org/docs.html#howto .
+  transport protocol, and not NetBEUI.  For details, read
+  <file:Documentation/filesystems/smbfs.txt> and the SMB-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   Note: if you just want your box to act as an SMB *server* and make
   files and printing services available to Windows clients (which need
   to have a TCP/IP stack), you don't need to say Y here; you can use
   the program samba (available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/system/network/samba ) for that.
+  <ftp://metalab.unc.edu/pub/Linux/system/network/samba>) for that.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
 
   If you want to compile the SMB support as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called smbfs.o. Most people say N, however.
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called smbfs.o.  Most people say N, however.
 
-use nls by default
+Use a default NLS
 CONFIG_SMB_NLS_DEFAULT
   Enabling this will make smbfs use nls translations by default. You
   need to specify the local charset (CONFIG_NLS_DEFAULT) in the nls
@@ -13055,7 +14783,7 @@
 
   smbmount from samba 2.2.0 or later supports this.
 
-nls support setting
+Default Remote NLS Option
 CONFIG_SMB_NLS_REMOTE
   This setting allows you to specify a default value for which
   codepage the server uses. If this field is left blank no
@@ -13072,72 +14800,85 @@
   Coda is an advanced network file system, similar to NFS in that it
   enables you to mount file systems of a remote server and access them
   with regular Unix commands as if they were sitting on your hard
-  disk. Coda has several advantages over NFS: support for disconnected
-  operation (e.g. for laptops), read/write server replication,
-  security model for authentication and encryption, persistent client
-  caches and write back caching.
+  disk.  Coda has several advantages over NFS: support for
+  disconnected operation (e.g. for laptops), read/write server
+  replication, security model for authentication and encryption,
+  persistent client caches and write back caching.
 
   If you say Y here, your Linux box will be able to act as a Coda
-  *client*. You will need user level code as well, both for the client
-  and server. Servers are currently user level, i.e. they need no
-  kernel support. Please read Documentation/filesystems/coda.txt and
-  check out the Coda home page http://www.coda.cs.cmu.edu .
+  *client*.  You will need user level code as well, both for the
+  client and server.  Servers are currently user level, i.e. they need
+  no kernel support.  Please read
+  <file:Documentation/filesystems/coda.txt> and check out the Coda
+  home page <http://www.coda.cs.cmu.edu>.
 
   If you want to compile the coda client support as a module ( = code
   which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
-  The module will be called coda.o. 
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called coda.o.
+
+InterMezzo file system support (experimental, replicating fs)
+CONFIG_INTERMEZZO_FS
+  InterMezzo is a networked file system with disconnected operation
+  and kernel level write back caching.  It is most often used for
+  replicating potentially large trees or keeping laptop/desktop copies
+  in sync.
+
+  If you say Y or M your kernel or module will provide InterMezzo
+  support.  You will also need a file server daemon, which you can get
+  from <http://www.inter-mezzo.org>.
 
 NCP file system support (to mount NetWare volumes)
 CONFIG_NCP_FS
   NCP (NetWare Core Protocol) is a protocol that runs over IPX and is
-  used by Novell NetWare clients to talk to file servers. It is to IPX
-  what NFS is to TCP/IP, if that helps. Saying Y here allows you to
-  mount NetWare file server volumes and to access them just like any
-  other Unix directory. For details, please read the file
-  Documentation/filesystems/ncpfs.txt in the kernel source and the
-  IPX-HOWTO from http://www.linuxdoc.org/docs.html#howto .
+  used by Novell NetWare clients to talk to file servers.  It is to
+  IPX what NFS is to TCP/IP, if that helps.  Saying Y here allows you
+  to mount NetWare file server volumes and to access them just like
+  any other Unix directory.  For details, please read the file
+  <file:Documentation/filesystems/ncpfs.txt> in the kernel source and
+  the IPX-HOWTO from <http://www.linuxdoc.org/docs.html#howto>.
 
   You do not have to say Y here if you want your Linux box to act as a
   file *server* for Novell NetWare clients.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called ncpfs.o. Say N unless you are connected to a Novell network.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ncpfs.o.  Say N unless you are connected to a Novell
+  network.
 
 Packet signatures
 CONFIG_NCPFS_PACKET_SIGNING
   NCP allows packets to be signed for stronger security. If you want
-  security, say Y. Normal users can leave it off. To be able to use
+  security, say Y.  Normal users can leave it off.  To be able to use
   packet signing you must use ncpfs > 2.0.12.
 
 Proprietary file locking
 CONFIG_NCPFS_IOCTL_LOCKING
-  Allows locking of records on remote volumes. Say N unless you have
+  Allows locking of records on remote volumes.  Say N unless you have
   special applications which are able to utilize this locking scheme.
 
 Clear remove/delete inhibit when needed
 CONFIG_NCPFS_STRONG
-  Allows manipulation of files flagged as Delete or Rename Inhibit. To
-  use this feature you must mount volumes with the ncpmount parameter
-  "-s" (ncpfs-2.0.12 and newer). Say Y unless you are not mounting
-  volumes with -f 444.
+  Allows manipulation of files flagged as Delete or Rename Inhibit.
+  To use this feature you must mount volumes with the ncpmount
+  parameter "-s" (ncpfs-2.0.12 and newer).  Say Y unless you are not
+  mounting volumes with -f 444.
 
-Use NFS namespace when available
+Use NFS namespace if available
 CONFIG_NCPFS_NFS_NS
-  Allows you to utilize NFS namespace on NetWare servers. It brings
-  you case sensitive filenames. Say Y. You can disable it at
+  Allows you to utilize NFS namespace on NetWare servers.  It brings
+  you case sensitive filenames.  Say Y.  You can disable it at
   mount-time with the `-N nfs' parameter of ncpmount.
 
-Use OS2/LONG namespace when available
+Use LONG (OS/2) namespace if available
 CONFIG_NCPFS_OS2_NS
   Allows you to utilize OS2/LONG namespace on NetWare servers.
   Filenames in this namespace are limited to 255 characters, they are
-  case insensitive, and case in names is preserved. Say Y. You can
+  case insensitive, and case in names is preserved.  Say Y.  You can
   disable it at mount time with the -N os2 parameter of ncpmount.
 
 Lowercase DOS filenames on LONG namespace volume
@@ -13146,7 +14887,7 @@
   the OS2/LONG namespace and created under DOS or on a volume using
   DOS namespace will be converted to lowercase characters.
   Saying N here will give you these filenames in uppercase.
-  
+
   This is only a cosmetic option since the OS2/LONG namespace is case
   insensitive. The only major reason for this option is backward
   compatibility when moving from DOS to OS2/LONG namespace support.
@@ -13158,25 +14899,7 @@
   effects by saying Y to "Allow using of Native Language Support"
   below.
 
-Allow mounting of volume subdirectories
-CONFIG_NCPFS_MOUNT_SUBDIR
-  Allows you to mount not only whole servers or whole volumes, but
-  also subdirectories from a volume. It can be used to reexport data
-  and so on. There is no reason to say N, so Y is recommended unless
-  you count every byte.
-
-  To utilize this feature you must use ncpfs-2.0.12 or newer.
-
-NDS authentication support
-CONFIG_NCPFS_NDS_DOMAINS
-  This allows storing NDS private keys in kernel space where they
-  can be used to authenticate another server as interserver NDS
-  accesses need it. You must use ncpfs-2.0.12.1 or newer to utilize
-  this feature. Say Y if you are using NDS connections to NetWare
-  servers. Do not say Y if security is primary for you because root
-  can read your session key (from /proc/kcore).
-
-Allow using of Native Language Support
+Use Native Language Support
 CONFIG_NCPFS_NLS
   Allows you to use codepages and I/O charsets for file name
   translation between the server file system and input/output. This
@@ -13194,21 +14917,24 @@
   To use the new attributes, it is recommended to use the flags
   '-f 600 -d 755' on the ncpmount command line.
 
-nls default codepage
+Default NLS Option
 CONFIG_NLS_DEFAULT
-  The default NLS used when mounting file system. Currently, the valid
-  values are:
+  The default NLS used when mounting file system. Note, that this is
+  the NLS used by your console, not the NLS used by a specific file
+  system (if different) to store data (filenames) on a disk.
+  Currently, the valid values are:
   big5, cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860, cp861,
   cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932, cp936,
-  cp949, cp950, euc-jp, euc-kr, gb2312, iso8859-1, iso8859-2, iso8859-3,
-  iso8859-4, iso8859-5, iso8859-6, iso8859-7, iso8859-8, iso8859-9,
-  iso8859-14, iso8859-15, koi8-r, sjis
-  If you specify a wrong value, it will use the built-in NLS; compatible
-  with iso8859-1.
+  cp949, cp950, cp1251, cp1255, euc-jp, euc-kr, gb2312, iso8859-1,
+  iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7,
+  iso8859-8, iso8859-9, iso8859-13, iso8859-14, iso8859-15,
+  koi8-r, koi8-ru, koi8-u, sjis, tis-620, utf8.
+  If you specify a wrong value, it will use the built-in NLS;
+  compatible with iso8859-1.
 
   If unsure, specify it as "iso8859-1".
 
-nls codepage 437
+Codepage 437 (United States, Canada)
 CONFIG_NLS_CODEPAGE_437
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored
@@ -13219,7 +14945,7 @@
   say Y here if you want to include the DOS codepage that is used in
   the United States and parts of Canada. This is recommended.
 
-nls codepage 737
+Codepage 737 (Greek)
 CONFIG_NLS_CODEPAGE_737
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored
@@ -13230,7 +14956,7 @@
   say Y here if you want to include the DOS codepage that is used for
   Greek. If unsure, say N.
 
-nls codepage 775
+Codepage 775 (Baltic Rim)
 CONFIG_NLS_CODEPAGE_775
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored
@@ -13239,9 +14965,10 @@
   DOS/Windows partitions correctly. This does apply to the filenames
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage that is used
-  for the Baltic Rim Languages. If unsure, say N.
+  for the Baltic Rim Languages (Latvian and Lithuanian). If unsure,
+  say N.
 
-nls codepage 850
+Codepage 850 (Europe)
 CONFIG_NLS_CODEPAGE_850
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13252,11 +14979,11 @@
   say Y here if you want to include the DOS codepage that is used for
   much of Europe -- United Kingdom, Germany, Spain, Italy, and [add
   more countries here]. It has some characters useful to many European
-  languages that are not part of the US codepage 437. 
+  languages that are not part of the US codepage 437.
 
   If unsure, say Y.
 
-nls codepage 852
+Codepage 852 (Central/Eastern Europe)
 CONFIG_NLS_CODEPAGE_852
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13270,7 +14997,7 @@
   Finnish, Hungarian, Irish, German, Polish, Romanian, Serbian (Latin
   transcription), Slovak, Slovenian, and Sorbian.
 
-nls codepage 855
+Codepage 855 (Cyrillic)
 CONFIG_NLS_CODEPAGE_855
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13280,7 +15007,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Cyrillic.
 
-nls codepage 857
+Codepage 857 (Turkish)
 CONFIG_NLS_CODEPAGE_857
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13290,7 +15017,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Turkish.
 
-nls codepage 860
+Codepage 860 (Portuguese)
 CONFIG_NLS_CODEPAGE_860
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13300,7 +15027,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Portuguese.
 
-nls codepage 861
+Codepage 861 (Icelandic)
 CONFIG_NLS_CODEPAGE_861
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13310,7 +15037,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Icelandic.
 
-nls codepage 862
+Codepage 862 (Hebrew)
 CONFIG_NLS_CODEPAGE_862
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13320,7 +15047,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Hebrew.
 
-nls codepage 863
+Codepage 863 (Canadian French)
 CONFIG_NLS_CODEPAGE_863
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13331,7 +15058,7 @@
   say Y here if you want to include the DOS codepage for Canadian
   French.
 
-nls codepage 864
+Codepage 864 (Arabic)
 CONFIG_NLS_CODEPAGE_864
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13341,7 +15068,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Arabic.
 
-nls codepage 865
+Codepage 865 (Norwegian, Danish)
 CONFIG_NLS_CODEPAGE_865
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13352,7 +15079,7 @@
   say Y here if you want to include the DOS codepage for the Nordic
   European countries.
 
-nls codepage 866
+Codepage 866 (Cyrillic/Russian)
 CONFIG_NLS_CODEPAGE_866
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13363,7 +15090,7 @@
   say Y here if you want to include the DOS codepage for
   Cyrillic/Russian.
 
-nls codepage 869
+Codepage 869 (Greek)
 CONFIG_NLS_CODEPAGE_869
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13373,7 +15100,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Greek.
 
-nls codepage 874
+Thai charset (CP874, TIS-620)
 CONFIG_NLS_CODEPAGE_874
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13383,7 +15110,18 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Thai.
 
-nls codepage 932
+Windows CP1251 (Bulgarian, Belarusian)
+CONFIG_NLS_CODEPAGE_1251
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Russian and
+  Bulgarian and Belarusian.
+
+Japanese charsets (Shift-JIS, EUC-JP)
 CONFIG_NLS_CODEPAGE_932
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13393,9 +15131,9 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for Shift-JIS
   or EUC-JP. To use EUC-JP, you can use 'euc-jp' as mount option or
-  NLS Default value during kernel configuration , instead of 'cp932'
+  NLS Default value during kernel configuration, instead of 'cp932'.
 
-nls codepage 936
+Simplified Chinese charset (CP936, GB2312)
 CONFIG_NLS_CODEPAGE_936
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13406,7 +15144,7 @@
   say Y here if you want to include the DOS codepage for Simplified
   Chinese(GBK).
 
-nls codepage 949
+Korean charset (CP949, EUC-KR)
 CONFIG_NLS_CODEPAGE_949
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13416,7 +15154,7 @@
   only, not to the file contents. You can include several codepages;
   say Y here if you want to include the DOS codepage for UHC.
 
-nls codepage 950
+Traditional Chinese charset (Big5)
 CONFIG_NLS_CODEPAGE_950
   The Microsoft FAT file system family can deal with filenames in
   native language character sets. These character sets are stored in
@@ -13427,10 +15165,10 @@
   say Y here if you want to include the DOS codepage for Traditional
   Chinese(Big5).
 
-nls iso8859-1
+NLS ISO 8859-1 (Latin 1; Western European Languages)
 CONFIG_NLS_ISO8859_1
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 1 character
   set, which covers most West European languages such as Albanian,
@@ -13438,101 +15176,110 @@
   Galician, Irish, Icelandic, Italian, Norwegian, Portuguese, Spanish,
   and Swedish. It is also the default for the US. If unsure, say Y.
 
-nls iso8859-2
+NLS ISO 8859-2 (Latin 2; Slavic/Central European Languages)
 CONFIG_NLS_ISO8859_2
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 2 character
   set, which works for most Latin-written Slavic and Central European
   languages: Czech, German, Hungarian, Polish, Rumanian, Croatian,
   Slovak, Slovene.
 
-nls iso8859-3
+NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)
 CONFIG_NLS_ISO8859_3
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 3 character
   set, which is popular with authors of Esperanto, Galician, Maltese,
   and Turkish.
 
-nls iso8859-4
+NLS ISO 8859-4 (Latin 4; old Baltic charset)
 CONFIG_NLS_ISO8859_4
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 4 character
   set which introduces letters for Estonian, Latvian, and
-  Lithuanian. It is an incomplete predecessor of Latin 6.
+  Lithuanian. It is an incomplete predecessor of Latin 7.
 
-nls iso8859-5
+NLS ISO 8859-5 (Cyrillic)
 CONFIG_NLS_ISO8859_5
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for ISO8859-5, a Cyrillic
-  character set with which you can type Bulgarian, Byelorussian,
+  character set with which you can type Bulgarian, Belarusian,
   Macedonian, Russian, Serbian, and Ukrainian. Note that the charset
   KOI8-R is preferred in Russia.
 
-nls iso8859-6
+NLS ISO 8859-6 (Arabic)
 CONFIG_NLS_ISO8859_6
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for ISO8859-6, the Arabic
   character set.
 
-nls iso8859-7
+NLS ISO 8859-7 (Modern Greek)
 CONFIG_NLS_ISO8859_7
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for ISO8859-7, the Modern
   Greek character set.
 
-nls iso8859-8
+Hebrew charsets (ISO-8859-8, CP1255)
 CONFIG_NLS_ISO8859_8
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for ISO8859-8, the Hebrew
   character set.
 
-nls iso8859-9
+NLS ISO 8859-9 (Latin 5; Turkish)
 CONFIG_NLS_ISO8859_9
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 5 character
   set, and it replaces the rarely needed Icelandic letters in Latin 1
   with the Turkish ones. Useful in Turkey.
 
-nls iso8859-10
+NLS ISO 8859-10 (Latin 6; Nordic)
 CONFIG_NLS_ISO8859_10
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 6 character
   set, which adds the last Inuit (Greenlandic) and Sami (Lappish)
   letters that were missing in Latin 4 to cover the entire Nordic
   area.
 
+NLS ISO 8859-13 (Latin 7; Baltic)
+CONFIG_NLS_ISO8859_13
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 7 character
+  set, which supports modern Baltic languages including Latvian
+  and Lithuanian.
+
 NLS ISO 8859-14 (Latin 8; Celtic)
 CONFIG_NLS_ISO8859_14
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 8 character
   set, which adds the last accented vowels for Welsh (aka Cymraeg)
-  (and Manx Gaelic) hat were missing in Latin 1.
-  http://linux.speech.cymru.org/ has further information.
+  (and Manx Gaelic) that were missing in Latin 1.
+  <http://linux.speech.cymru.org/> has further information.
 
-nls iso8859-15
+NLS ISO 8859-15 (Latin 9; Western European languages with Euro)
 CONFIG_NLS_ISO8859_15
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the Latin 9 character
   set, which covers most West European languages such as Albanian,
@@ -13541,17 +15288,33 @@
   Portuguese, Spanish, and Swedish. Latin 9 is an update to
   Latin 1 (ISO 8859-1) that removes a handful of rarely used
   characters and instead adds support for Estonian, corrects the
-  support for French and Finnish, and adds the new Euro character.  If
-  unsure, say Y.
+  support for French and Finnish, and adds the new Euro character.
+  If unsure, say Y.
 
-nls koi8-r
+NLS KOI8-R (Russian)
 CONFIG_NLS_KOI8_R
   If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
   correctly on the screen, you need to include the appropriate
   input/output character sets. Say Y here for the preferred Russian
   character set.
 
+NLS KOI8-U/RU (Ukrainian, Belarusian)
+CONFIG_NLS_KOI8_U
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the preferred Ukrainian
+  (koi8-u) and Belarusian (koi8-ru) character sets.
+
+NLS UTF8
+CONFIG_NLS_UTF8
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the UTF-8 encoding of
+  the Unicode/ISO9646 universal character set.
+
 Virtual terminal
 CONFIG_VT
   If you say Y here, you will get support for terminal devices with
@@ -13599,38 +15362,236 @@
 
   If unsure, say Y.
 
-Support for PowerMac keyboard
-CONFIG_MAC_KEYBOARD
+STI console
+CONFIG_STI_CONSOLE
+  The STI console is the builtin display/keyboard on HP-PARISC
+  machines.  Say Y here to build support for it into your kernel.
+  The alternative is to use your primary serial port as a console.
+
+Use MDIO for PHY configuration
+CONFIG_USE_MDIO
+  On some boards the hardware configuration of the ethernet PHY can be
+  used without any software interaction over the MDIO interface, so
+  all MII code can be omitted. Say N here if unsure or if you don't
+  need link status reports.
+
+860T FEC Ethernet
+CONFIG_FEC_ENET
+  Enable Ethernet support via the Fast Ethernet Controller (FCC) on
+  the Motorola MPC8260.
+
+Ethernet on FCC1
+CONFIG_FCC1_ENET
+  Use MPC8260 fast Ethernet controller 1 to drive Ethernet (default).
+
+Ethernet on FCC2
+CONFIG_FCC2_ENET
+  Use MPC8260 fast Ethernet controller 2 to drive Ethernet.
+
+Ethernet on FCC3
+CONFIG_FCC3_ENET
+  Use MPC8260 fast Ethernet controller 3 to drive Ethernet.
+
+CPM SCC Ethernet
+CONFIG_SCC_ENET
+  Enable Ethernet support via the Motorola MPC8xx serial
+  commmunications controller.
+
+Ethernet on SCC1
+CONFIG_SCC1_ENET
+  Use MPC8xx serial communications controller 1 to drive Ethernet
+  (default).
+
+Ethernet on SCC2
+CONFIG_SCC2_ENET
+  Use MPC8xx serial communications controller 2 to drive Ethernet.
+
+Ethernet on SCC3
+CONFIG_SCC3_ENET
+  Use MPC8xx serial communications controller 3 to drive Ethernet.
+
+Use Big CPM Ethernet Buffers
+CONFIG_ENET_BIG_BUFFERS
+  Allocate large buffers for MPC8xx Etherenet.  Increases throughput
+  and decreases the likelihood of dropped packets, but costs memory.
+
+Apple Desktop Bus (ADB) support
+CONFIG_ADB
+  Apple Desktop Bus (ADB) support is for support of devices which
+  are connected to an ADB port.  ADB devices tend to have 4 pins.
+  If you have an Apple Macintosh prior to the iMac, or a
+  "Blue and White G3", you probably want to say Y here.  Otherwise
+  say N.
+
+Support for CUDA based PowerMacs
+CONFIG_ADB_CUDA
+  This provides support for CUDA based Power Macintosh systems.  This
+  includes most OldWorld PowerMacs, the first generation iMacs, the
+  Blue&White G3 and the Yikes G4 (PCI Graphics).  All later models
+  should use CONFIG_ADB_PMU instead.
+
+  If unsure say Y.
+
+Support for PMU-based PowerMacs
+CONFIG_ADB_PMU
+  On the PowerBook 3400 and 2400, the PMU is a 6805 microprocessor
+  core whose primary function is to control battery charging and
+  system power.  The PMU also controls the ADB (Apple Desktop Bus)
+  which connects to the keyboard and mouse, as well as the
+  non-volatile RAM and the RTC (real time clock) chip.  Say Y to
+  enable support for this device; you should do so if your machine
+  is one of these PowerBooks.
+
+Include MacIO ADB driver
+CONFIG_ADB_MACIO
+  Say Y here to include direct support for the ADB controller in the
+  Hydra chip used on PowerPC Macintoshes of the CHRP type.  (The Hydra
+  also includes a MESH II SCSI controller, DBDMA controller, VIA chip,
+  OpenPIC controller and two RS422/Geoports.)
+
+Support for ADB keyboard (old driver)
+CONFIG_ADB_KEYBOARD
   This option allows you to use an ADB keyboard attached to your
   machine. Note that this disables any other (ie. PS/2) keyboard
   support, even if your machine is physically capable of using both at
   the same time.
-  
+
   If you use an ADB keyboard (4 pin connector), say Y here.
   If you use a PS/2 keyboard (6 pin connector), say N here.
 
-Standard/generic serial support
+HIL keyboard support
+CONFIG_HIL
+  The "Human Interface Loop" is a older, 8-channel USB-like controller
+  used in Hewlette Packard PA-RISC based machines.  There are a few
+  cases where it is seen on PC/MAC architectures as well, usually also
+  manufactured by HP.  This driver is based off MACH and BSD drivers,
+  and implements support for a keyboard attached to the HIL port.
+  Full support for the USB-like functions and non-keyboard channels of
+  the HIL is not provided for in this driver.  There are vestiges of
+  mouse support in the driver, but it is probably not working.  The
+  necessary hardware documentation to fully support the HIL controller
+  and interface it to the linux-input API is lacking.
+
+  Enable this option if you intend to use a HIL keyboard.
+
+Include IOP (IIfx/Quadra 9x0) ADB driver
+CONFIG_ADB_IOP
+  The I/O Processor (IOP) is an Apple custom IC designed to provide
+  intelligent support for I/O controllers.  It is described at
+  <http://www.angelfire.com/ca2/dev68k/iopdesc.html;> to enable direct
+  support for it, say 'Y' here.
+
+Mac II style Apple Desktop Bus support
+CONFIG_ADB_MACII
+  Say Y here if want your kernel to support Macintosh systems that use
+  the Mac II style ADB.  This includes the II, IIx, IIcx, SE/30, IIci,
+  Quadra 610, Quadra 650, Quadra 700, Quadra 800, Centris 610 and
+  Centris 650.
+
+Mac IIsi style Apple Desktop Bus support
+CONFIG_ADB_MACIISI
+  Say Y here if want your kernel to support Macintosh systems that use
+  the Mac IIsi style ADB.  This includes the IIsi, IIvi, IIvx, Classic
+  II, LC, LC II, LC III, Performa 460, and the Performa 600.
+
+Apple 68K PowerBook Power Management and Desktop Bus support
+CONFIG_ADB_PMU68K
+  Say Y here if want your kernel to support the m68k based Powerbooks.
+  This includes the PowerBook 140, PowerBook 145, PowerBook 150,
+  PowerBook 160, PowerBook 165, PowerBook 165c, PowerBook 170,
+  PowerBook 180, PowerBook, 180c, PowerBook 190cs, PowerBook 520,
+  PowerBook Duo 210, PowerBook Duo 230, PowerBook Duo 250,
+  PowerBook Duo 270c, PowerBook Duo 280 and PowerBook Duo 280c.
+
+Macintosh IIfx/Quadra 900/Quadra 950 floppy support
+CONFIG_BLK_DEV_SWIM_IOP
+  Say Y here to support the SWIM (Super Woz Integrated Machine) IOP
+  floppy controller on the Macintosh IIfx and Quadra 900/950.
+
+Macintosh NS8390 based Ethernet support
+CONFIG_MAC8390
+  If you want to include a driver to support Nubus or LC-PDS
+  Ethernet cards using an NS8390 chipset or its equivalent, say Y
+  and read the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+Macintosh CS89x0 based Ethernet support
+CONFIG_MAC89x0
+  Support for CS89x0 chipset based Ethernet cards.  If you have a
+  Nubus or LC-PDS network (Ethernet) card of this type, say Y and
+  read the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  This module will
+  be called mac89x0.o.
+
+Macintosh onboard AMD 79C940 MACE based Ethernet support
+CONFIG_MACMACE
+  Support for the onboard AMD 79C940 MACE Ethernet controller used in
+  the 660AV and 840AV Macintosh.  If you have one of these Macintoshes
+  say Y and read the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+Macintosh SONIC based Ethernet support (onboard, NuBus, LC, CS)
+CONFIG_MACSONIC
+  Support for NatSemi SONIC based Ethernet devices.  This includes
+  the onboard Ethernet in many Quadras as well as some LC-PDS,
+  a few Nubus and all known Comm Slot Ethernet cards.  If you have
+  one of these say Y and read the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  This module will
+  be called macsonic.o.
+
+Macintosh NCR5380 SCSI support
+CONFIG_MAC_SCSI
+  This is the NCR 5380 SCSI controller included on most of the 68030
+  based Macintoshes.  If you have one of these say Y and read the
+  SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+Macintosh NCR53c9[46] SCSI support
+CONFIG_SCSI_MAC_ESP
+  This is the NCR 53c9x SCSI controller found on most of the 68040
+  based Macintoshes.  If you have one of these say Y and read the
+  SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mac_esp.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Standard/generic (8250/16550 and compatible UARTs) serial support
 CONFIG_SERIAL
   This selects whether you want to include the driver for the standard
-  serial ports. The standard answer is Y. People who might say N here
-  are those that are setting up dedicated Ethernet WWW/FTP servers, or
-  users that have one of the various bus mice instead of a serial
-  mouse and don't intend to use their machine's standard serial port
-  for anything. (Note that the Cyclades and Stallion multi serial port
-  drivers do not need this driver built in for them to work.)
+  serial ports.  The standard answer is Y.  People who might say N
+  here are those that are setting up dedicated Ethernet WWW/FTP
+  servers, or users that have one of the various bus mice instead of a
+  serial mouse and don't intend to use their machine's standard serial
+  port for anything.  (Note that the Cyclades and Stallion multi
+  serial port drivers do not need this driver built in for them to
+  work.)
 
   If you want to compile this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called serial.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  serial.o.
   [WARNING: Do not compile this driver as a module if you are using
   non-standard serial ports, since the configuration information will
-  be lost when the driver is unloaded. This limitation may be lifted
+  be lost when the driver is unloaded.  This limitation may be lifted
   in the future.]
 
   BTW1: If you have a mouseman serial mouse which is not recognized by
-  the X window system, try running gpm first. 
-  
+  the X window system, try running gpm first.
+
   BTW2: If you intend to use a software modem (also called Winmodem)
-  under Linux, forget it. These modems are crippled and require
+  under Linux, forget it.  These modems are crippled and require
   proprietary drivers which are only available under Windows.
 
   Most people will say Y or M here, so that they can use serial mice,
@@ -13671,7 +15632,8 @@
   become a dial-in server.
 
   If you want to compile this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called rocket.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  rocket.o.
 
 Digiboard Intelligent async support
 CONFIG_DIGIEPCA
@@ -13681,14 +15643,14 @@
   box, for instance in order to become a dial-in server. This driver
   supports the original PC (ISA) boards as well as PCI, and EISA. If
   you have a card like this, say Y here and read the file
-  Documentation/digiepca.txt.
+  <file:Documentation/digiepca.txt>.
 
   NOTE: There is another, separate driver for the Digiboard PC boards:
   "Digiboard PC/Xx Support" below. You should (and can) only select
-  one of the two drivers. 
+  one of the two drivers.
 
   If you want to compile this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called epca.o.
+  <file:Documentation/modules.txt>. The module will be called epca.o.
 
 Digiboard PC/Xx Support
 CONFIG_DIGI
@@ -13696,10 +15658,10 @@
   that give you many serial ports. You would need something like this
   to connect more than two modems to your Linux box, for instance in
   order to become a dial-in server. If you have a card like that, say
-  Y here and read the file Documentation/digiboard.txt.
+  Y here and read the file <file:Documentation/digiboard.txt>.
 
   If you want to compile this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called pcxx.o.
+  <file:Documentation/modules.txt>. The module will be called pcxx.o.
 
 SDL RISCom/8 card support
 CONFIG_RISCOM8
@@ -13707,7 +15669,7 @@
   which gives you many serial ports. You would need something like
   this to connect more than two modems to your Linux box, for instance
   in order to become a dial-in server. If you have a card like that,
-  say Y here and read the file Documentation/riscom8.txt.
+  say Y here and read the file <file:Documentation/riscom8.txt>.
 
   Also it's possible to say M here and compile this driver as kernel
   loadable module; the module will be called riscom8.o.
@@ -13715,37 +15677,50 @@
 Computone IntelliPort Plus serial support
 CONFIG_COMPUTONE
   This driver supports the entire family of Intelliport II/Plus
-  controllers with the exception of the MicroChannel controllers and 
+  controllers with the exception of the MicroChannel controllers and
   products previous to the Intelliport II. These are multiport cards,
-  which give you many serial ports. You would need something like 
-  this to connect more than two modems to your Linux box, for 
-  instance in order to become a dial-in server. If you have a
-  card like that, say Y here and read Documentation/computone.txt.
+  which give you many serial ports. You would need something like this
+  to connect more than two modems to your Linux box, for instance in
+  order to become a dial-in server. If you have a card like that, say
+  Y here and read <file:Documentation/computone.txt>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. You will get two
-  modules called ip2.o and ip2main.o.
+  say M here and read <file:Documentation/modules.txt>. You will get
+  two modules called ip2.o and ip2main.o.
 
 Specialix IO8+ card support
 CONFIG_SPECIALIX
   This is a driver for the Specialix IO8+ multiport card (both the
-  ISA and the PCI version) which gives you many serial ports. You 
-  would need something like this to connect more than two modems to 
+  ISA and the PCI version) which gives you many serial ports. You
+  would need something like this to connect more than two modems to
   your Linux box, for instance in order to become a dial-in server.
 
   If you have a card like that, say Y here and read the file
-  Documentation/specialix.txt. Also it's possible to say M here and
-  compile this driver as kernel loadable module which will be called
-  specialix.o.
+  <file:Documentation/specialix.txt>. Also it's possible to say M here
+  and compile this driver as kernel loadable module which will be
+  called specialix.o.
 
 Specialix DTR/RTS pin is RTS
 CONFIG_SPECIALIX_RTSCTS
-  The Specialix card can only support either RTS or DTR. If you say N
-  here, the driver will use the pin as "DTR" when the tty is in
-  software handshake mode. If you say Y here or hardware handshake is
-  on, it will always be RTS. Read the file Documentation/specialix.txt
-  for more information.
+  The Specialix IO8+ card can only support either RTS or DTR. If you
+  say N here, the driver will use the pin as "DTR" when the tty is in
+  software handshake mode.  If you say Y here or hardware handshake is
+  on, it will always be RTS.  Read the file
+  <file:Documentation/specialix.txt> for more information.
+
+Specialix RIO system support
+CONFIG_RIO
+  This is a driver for the Specialix RIO, a smart serial card which
+  drives an outboard box that can support up to 128 ports.  Product
+  information is at <http://www.sphinxcst.co.uk/perle/multi.htm>.
+  There are both ISA and PCI versions.
+
+Support really old RIO/PCI cards
+CONFIG_RIO_OLDPCI
+  Older RIO PCI cards need some initialization-time configuration to
+  determine the IRQ and some control addresses.  If you have a RIO and
+  this doesn't seem to work, try setting this to Y.
 
 Cyclades async mux support
 CONFIG_CYCLADES
@@ -13753,19 +15728,19 @@
   would need something like this to connect more than two modems to
   your Linux box, for instance in order to become a dial-in server.
   For information about the Cyclades-Z card, read
-  drivers/char/README.cycladesZ.
+  <file:drivers/char/README.cycladesZ>.
 
   As of 1.3.9x kernels, this driver's minor numbers start at 0 instead
   of 32.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called cyclades.o. 
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called cyclades.o.
 
   If you haven't heard about it, it's safe to say N.
 
-Cyclades-Z interrupt mode operation (EXPERIMENTAL)
+Cyclades-Z interrupt mode operation
 CONFIG_CYZ_INTR
   The Cyclades-Z family of multiport cards allows 2 (two) driver op
   modes: polling and interrupt. In polling mode, the driver will check
@@ -13775,47 +15750,47 @@
   status of the Cyclades-Z ports. The default op mode is polling. If
   unsure, say N.
 
-Stallion multiport serial support 
+Stallion multiport serial support
 CONFIG_STALDRV
-  Stallion cards give you many serial ports. You would need something
+  Stallion cards give you many serial ports.  You would need something
   like this to connect more than two modems to your Linux box, for
-  instance in order to become a dial-in server. If you say Y here, you
-  will be asked for your specific card model in the next questions.
-  Make sure to read drivers/char/README.stallion in this case. If you
-  have never heard about all this, it's safe to say N.
+  instance in order to become a dial-in server.  If you say Y here,
+  you will be asked for your specific card model in the next
+  questions.  Make sure to read <file:Documentation/stallion.txt> in
+  this case.  If you have never heard about all this, it's safe to
+  say N.
 
-Stallion EasyIO or EC8/32 support 
+Stallion EasyIO or EC8/32 support
 CONFIG_STALLION
   If you have an EasyIO or EasyConnection 8/32 multiport Stallion
-  card, then this is for you; say Y. Make sure to read
-  Documentation/stallion.txt. 
+  card, then this is for you; say Y.  Make sure to read
+  <file:Documentation/stallion.txt>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called stallion.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called stallion.o.
 
 Stallion EC8/64, ONboard, Brumby support
 CONFIG_ISTALLION
   If you have an EasyConnection 8/64, ONboard, Brumby or Stallion
   serial multiport card, say Y here. Make sure to read
-  Documentation/stallion.txt. 
+  <file:Documentation/stallion.txt>.
 
   To compile it as a module ( = code which can be inserted in and
   removed from the running kernel whenever you want), say M here and
-  read Documentation/modules.txt. The module will be called
+  read <file:Documentation/modules.txt>. The module will be called
   istallion.o.
 
 Microgate SyncLink adapter support
 CONFIG_SYNCLINK
-  Provides support for the SyncLink ISA and PCI
-  multiprotocol serial adapters. These adapters
-  support asynchronous and HDLC bit synchronous
-  communication up to 10Mbps (PCI adapter).
+  Provides support for the SyncLink ISA and PCI multiprotocol serial
+  adapters. These adapters support asynchronous and HDLC bit
+  synchronous communication up to 10Mbps (PCI adapter).
 
   This driver can only be built as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called synclink.o. If you want to do that, say M
+  The module will be called synclink.o.  If you want to do that, say M
   here.
 
 Synchronous HDLC line discipline support
@@ -13831,7 +15806,7 @@
 Specialix SX (and SI) card support
 CONFIG_SX
   This is a driver for the SX and SI multiport serial cards.
-  Please read the file Documentation/sx.txt for details.
+  Please read the file <file:Documentation/sx.txt> for details.
 
   This driver can only be built as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -13839,14 +15814,14 @@
 
 Hayes ESP serial port support
 CONFIG_ESPSERIAL
-  This is a driver which supports Hayes ESP serial ports. Both single
-  port cards and multiport cards are supported. Make sure to read
-  Documentation/hayes-esp.txt. 
+  This is a driver which supports Hayes ESP serial ports.  Both single
+  port cards and multiport cards are supported.  Make sure to read
+  <file:Documentation/hayes-esp.txt>.
 
   To compile this driver as a module ( = code which can be inserted in
   and removed from the running kernel whenever you want), say M here
-  and read Documentation/modules.txt. The module will be called esp.o.
-  If unsure, say N.
+  and read <file:Documentation/modules.txt>.  The module will be
+  called esp.o.  If unsure, say N.
 
 Moxa Intellio support
 CONFIG_MOXA_INTELLIO
@@ -13866,13 +15841,14 @@
   The module will be called mxser.o. If you want to do that, say M
   here.
 
-Multi-Tech multiport card support (EXPERIMENTAL)
+Multi-Tech multiport card support
 CONFIG_ISI
   This is a driver for the Multi-Tech cards which provide several
-  serial ports. The driver is experimental and can currently only be
+  serial ports.  The driver is experimental and can currently only be
   built as a module ( = code which can be inserted in and removed from
-  the running kernel whenever you want). Please read
-  Documentation/modules.txt. The module will be called isicom.o
+  the running kernel whenever you want).  Please read
+  <file:Documentation/modules.txt>.  The module will be called
+  isicom.o.
 
 Unix98 PTY support
 CONFIG_UNIX98_PTYS
@@ -13882,7 +15858,7 @@
   read data from and write data to the slave, thereby emulating a
   terminal. Typical programs for the master side are telnet servers
   and xterms.
-  
+
   Linux has traditionally used the BSD-like names /dev/ptyxx for
   masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
   has a number of problems. The GNU C library glibc 2.1 and later,
@@ -13898,8 +15874,8 @@
 
   If you want to say Y here, you need to have the C library glibc 2.1
   or later (equal to libc-6.1, check with "ls -l /lib/libc.so.*").
-  Read the instructions in Documentation/Changes pertaining to pseudo
-  terminals. It's safe to say N.
+  Read the instructions in <file:Documentation/Changes> pertaining to
+  pseudo terminals. It's safe to say N.
 
 Maximum number of Unix98 PTYs in use (0-2048)
 CONFIG_UNIX98_PTY_COUNT
@@ -13916,23 +15892,23 @@
 CONFIG_PRINTER
   If you intend to attach a printer to the parallel port of your Linux
   box (as opposed to using a serial printer; if the connector at the
-  printer has 9 or 25 holes ["female"], then it's serial), say Y. Also
-  read the Printing-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  printer has 9 or 25 holes ["female"], then it's serial), say Y.
+  Also read the Printing-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   It is possible to share one parallel port among several devices
   (e.g. printer and ZIP drive) and it is safe to compile the
-  corresponding drivers into the kernel. If you want to compile this
+  corresponding drivers into the kernel.  If you want to compile this
   driver as a module however ( = code which can be inserted in and
   removed from the running kernel whenever you want), say M here and
-  read Documentation/modules.txt and Documentation/parport.txt. The 
-  module will be called lp.o. 
+  read <file:Documentation/modules.txt> and
+  <file:Documentation/parport.txt>.  The module will be called lp.o.
 
   If you have several parallel ports, you can specify which ports to
-  use with the "lp" kernel command line option. (Try "man bootparam"
+  use with the "lp" kernel command line option.  (Try "man bootparam"
   or see the documentation of your boot loader (lilo or loadlin) about
-  how to pass options to the kernel at boot time.) The syntax of the
-  "lp" command line option can be found in drivers/char/lp.c.
+  how to pass options to the kernel at boot time.)  The syntax of the
+  "lp" command line option can be found in <file:drivers/char/lp.c>.
 
   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.
@@ -13949,7 +15925,7 @@
   By defining CONSOLE_LP_STRICT to 0 (at your own risk) you
   can make the kernel continue when this happens,
   but it'll lose the kernel messages.
-  
+
   If unsure, say N.
 
 Support for user-space parallel port device drivers
@@ -13963,74 +15939,206 @@
   It is safe to say N to this -- it is not needed for normal printing
   or parallel port CD-ROM/disk support.
 
-  This support is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called ppdev.o.
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  ppdev.o.
 
   If unsure, say N.
 
+Cobalt Networks support
+CONFIG_COBALT
+  Support for Cobalt Networks x86-based servers.
+
+Gen III (3000 series) system support
+CONFIG_COBALT_GEN_III
+  This option enables support for the 3000 series of Cobalt Networks
+  systems. This includes the RaQ 3, RaQ 4, and Qube 3 product lines.
+
+  This platform uses an AMD K6-2 processor, an ALI M1541/1533 chipset,
+  an optional NCR 53c875 SCSI controller, and two Intel 82559ER or
+  National Semiconductor DP83815 NICs.
+
+  Getting this option wrong will likely result in a kernel that does
+  not boot. Selecting support for more than 1 system series will add
+  bloat to your kernel, but will not cause anything bad to happen.
+
+  If you have a Cobalt Networks System, but aren't sure what kind,
+  say Y here.
+
+Gen V (5000 series) system support
+CONFIG_COBALT_GEN_V
+  This option enables support for the 5000 series of Cobalt Networks
+  systems. This includes the RaQ XTR product line.
+
+  This platform uses Intel Pentium III Coppermine FCPGA CPUs, the
+  ServerWorks LE chipset (with registered ECC DIMMs only!), two
+  HighPoint HPT370 IDE controllers, and two National Semiconductor
+  DP83815 NICs.
+
+  Getting this option wrong will likely result in a kernel that does
+  not boot. Selecting support for more than 1 system series will add
+  bloat to your kernel, but will not cause anything bad to happen.
+
+  If you have a Cobalt Networks System, but aren't sure what kind,
+  say Y here.
+
+Create legacy /proc files
+CONFIG_COBALT_OLDPROC
+  This option forces some Cobalt Networks drivers to support legacy
+  files in /proc.  Older versions of these drivers exported files
+  directly in /proc, as opposed to the newer /proc/cobalt.  If you say
+  N to this option, the old filenames will no longer be exported.
+  Regardless of your selection here, files in /proc/cobalt will be
+  exported.  Of course, you have to include support for /proc fs, too.
+
+  It is safe to say Y here.
+
+Front panel LCD support
+CONFIG_COBALT_LCD
+  This enables support for the Cobalt Networks front panel.  This is
+  for the LCD panel and buttons.  The primary method for connection is
+  via the parallel port (IO base 0x370), but newer systems use an
+  I2C bus.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Software controlled LED support
+CONFIG_COBALT_LED
+  This enables support for the software-controlled LEDs on Cobalt
+  Networks systems.  This includes the fault light and front panel
+  LEDs on the RaQ XTR, the lightbar on the Qube 3, and others.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Silicon serial number support
+CONFIG_COBALT_SERNUM
+  This enables support for the on-board serial number on Cobalt
+  Networks systems.  This is a universally-unique 64-bit serial
+  number.  Some systems use a Dallas DS2401 chip, others have an I2C
+  based EEPROM.
+
+  If you select Y here, the files /proc/cobalt/hostid and
+  /proc/cobalt/serialnumber will be created.  The hostid file contains
+  a 32 bit integer generated from the serial number, in binary form.
+  The serialnumber file contains the hexadecimal representation of the
+  serial number, in ASCII.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Chipset watchdog timer support
+CONFIG_COBALT_WDT
+  This enables support for the watchdog timer built into Cobalt
+  chipsets.  The timer wakes up periodically, to make find out if
+  system has hung, or disabled interrupts too long.  The result of
+  detecting a hang is a hard reboot.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Thermal sensor support
+CONFIG_COBALT_THERMAL
+  This enables support for the thermal sensor(s) built into Cobalt
+  Networks systems.  This driver exports /proc/cobalt/thermal_sensors.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Fan tachometer support
+CONFIG_COBALT_FANS
+  This enables support for the fan tachometers built into some Cobalt
+  Networks systems.  This driver exports /proc/cobalt/faninfo.  Some
+  Cobalt software depends on this feature, and enabling it does not
+  cause any risks.
+
+  If you have a Cobalt Networks system, you should say Y here, unless
+  you are absolutely sure.
+
+Disk drive ruler support
+CONFIG_COBALT_RULER
+  This enables support for the cobalt hard drive ruler, found on some
+  Cobalt systems, including the RaQ XTR.  This is the device that
+  enables swapping of drives.  It is not needed for basic disk
+  operation. Enabling this on a system with no ruler will have no
+  adverse effects.
+
+  If you have a Cobalt Networks system, you should say Y here,
+  unless you are absolutely sure.
+
 I2C support
 CONFIG_I2C
   I2C (pronounce: I-square-C) is a slow serial bus protocol used in
-  many micro controller applications and developed by Philips. SMBus,
-  or System Management Bus is a subset of the I2C protocol. More
-  information is contained in the directory Documentation/i2c/,
+  many micro controller applications and developed by Philips.  SMBus,
+  or System Management Bus is a subset of the I2C protocol.  More
+  information is contained in the directory <file:Documentation/i2c/>,
   especially in the file called "summary" there.
 
   Both I2C and SMBus are supported here. You will need this for
-  hardware sensors support, and also for Video for Linux support.
+  hardware sensors support, and also for Video For Linux support.
   Specifically, if you want to use a BT848 based frame grabber/overlay
   boards under Linux, say Y here and also to "I2C bit-banging
   interfaces", below.
 
   If you want I2C support, you should say Y here and also to the
-  specific driver for your bus adapter(s) below. If you say Y to
+  specific driver for your bus adapter(s) below.  If you say Y to
   "/proc file system" below, you will then get a /proc interface which
-  is documented in Documentation/i2c/proc-interface.
+  is documented in <file:Documentation/i2c/proc-interface>.
 
-  This I2C support is also available as a module. If you want to
+  This I2C support is also available as a module.  If you want to
   compile it as a module, say M here and read
-  Documentation/modules.txt. The module will be called i2c-core.o.
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-core.o.
+
+UltraSPARC-III bootbus i2c controller driver
+CONFIG_BBC_I2C
+  The BBC devices on the UltraSPARC III have two I2C controllers.  The
+  first I2C controller connects mainly to configuration PROMs (NVRAM,
+  CPU configuration, DIMM types, etc.).  The second I2C controller
+  connects to environmental control devices such as fans and
+  temperature sensors.  The second controller also connects to the
+  smartcard reader, if present.  Say Y to enable support for these.
 
 I2C bit-banging interfaces
 CONFIG_I2C_ALGOBIT
   This allows you to use a range of I2C adapters called bit-banging
-  adapters. Say Y if you own an I2C adapter belonging to this class
+  adapters.  Say Y if you own an I2C adapter belonging to this class
   and then say Y to the specific driver for you adapter below.
 
-  This support is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-algo-bit.o.
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-algo-bit.o.
 
 Philips style parallel port adapter
 CONFIG_I2C_PHILIPSPAR
-  This supports parallel-port I2C adapters made by Philips. Say Y if
+  This supports parallel-port I2C adapters made by Philips.  Say Y if
   you own such an adapter.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-philips-par.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-philips-par.o.
 
   Note that if you want support for different parallel port devices,
   life will be much easier if you compile them all as modules.
 
 ELV adapter
 CONFIG_I2C_ELV
-  This supports parallel-port I2C adapters called ELV. Say Y if you
+  This supports parallel-port I2C adapters called ELV.  Say Y if you
   own such an adapter.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-elv.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-elv.o.
 
 Velleman K9000 adapter
 CONFIG_I2C_VELLEMAN
-  This supports the Velleman K9000 parallel-port I2C adapter. Say Y if
-  you own such an adapter.
+  This supports the Velleman K9000 parallel-port I2C adapter.  Say Y
+  if you own such an adapter.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-velleman.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-velleman.o.
 
 I2C PCF 8584 interfaces
 CONFIG_I2C_ALGOPCF
@@ -14038,29 +16146,41 @@
   Say Y if you own an I2C adapter belonging to this class and then say
   Y to the specific driver for you adapter below.
 
-  This support is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-algo-pcf.o.
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-algo-pcf.o.
 
 Elektor ISA card
 CONFIG_I2C_ELEKTOR
-  This supports the PCF8584 ISA bus I2C adapter. Say Y if you own such
-  an adapter.
+  This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
+  such an adapter.
 
-  This driver is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-elektor.o.
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-elektor.o.
 
 I2C device interface
 CONFIG_I2C_CHARDEV
   Say Y here to use i2c-* device files, usually found in the /dev
-  directory on your system. They make it possible to have user-space
-  programs use the I2C bus. Information on how to do this is contained
-  in the file Documentation/i2c/dev-interface.
+  directory on your system.  They make it possible to have user-space
+  programs use the I2C bus.  Information on how to do this is
+  contained in the file <file:Documentation/i2c/dev-interface>.
+
+  This code is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-dev.o.
+
+I2C /proc support
+CONFIG_I2C_PROC
+  This provides support for i2c device entries in the /proc filesystem.
+  The entries will be found in /proc/sys/dev/sensors.
 
   This code is also available as a module. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt. The
-  module will be called i2c-dev.o.
+  it as a module, say M here and read <file:Documentation/modules.txt>.
+  The module will be called i2c-proc.o.
 
 Bus Mouse Support
 CONFIG_BUSMOUSE
@@ -14069,11 +16189,11 @@
   Microsoft mouse (made by Logitech) that plugs into a COM port
   (rectangular with 9 or 25 pins). These people say N here. If you
   have something else, read the Busmouse-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto , and say Y here.
+  <http://www.linuxdoc.org/docs.html#howto>, and say Y here.
 
   If you have a laptop, you either have to check the documentation or
   experiment a bit to find out whether the trackball is a serial mouse
-  or not; it's best to say Y here for you. 
+  or not; it's best to say Y here for you.
 
   This is the generic bus mouse driver code. If you have a bus mouse,
   you will have to say Y here and also to the specific driver for your
@@ -14082,7 +16202,7 @@
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called busmouse.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Mouse Support (not serial and bus mice)
 CONFIG_MOUSE
@@ -14092,30 +16212,30 @@
   MouseSystem or Microsoft mouse (made by Logitech) that plugs into a
   COM port (rectangular with 9 or 25 pins). These people say N here.
   If you have something else, read the Busmouse-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . This HOWTO contains
+  <http://www.linuxdoc.org/docs.html#howto>. This HOWTO contains
   information about all non-serial mice, not just bus mice.
 
   If you have a laptop, you either have to check the documentation or
   experiment a bit to find out whether the trackball is a serial mouse
-  or not; it's best to say Y here for you. 
+  or not; it's best to say Y here for you.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about non-serial mice. If unsure, say Y.
 
 Logitech busmouse support
 CONFIG_LOGIBUSMOUSE
-  Logitech mouse connected to a proprietary interface card. It's
+  Logitech mouse connected to a proprietary interface card.  It's
   generally a round connector with 9 pins. Note that the newer mice
   made by Logitech don't use the Logitech protocol anymore; for those,
-  you don't need this option. You want to read the Busmouse-HOWTO ,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  you don't need this option.  You want to read the Busmouse-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called busmouse.o. If you are unsure, say N and read the HOWTO
-  nevertheless: it will tell you what you have.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called busmouse.o.  If you are unsure, say N and read the
+  HOWTO nevertheless: it will tell you what you have.
 
 PS/2 mouse (aka "auxiliary device") support
 CONFIG_PSMOUSE
@@ -14129,12 +16249,12 @@
 
   Although PS/2 mice are not technically bus mice, they are explained
   in detail in the Busmouse-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   When using a PS/2 mouse, you can get problems if you want to use the
   mouse both on the Linux console and under X. Using the "-R" option
   of the Linux mouse managing program gpm (available from
-  ftp://metalab.unc.edu/pub/Linux/system/mouse ) solves this
+  <ftp://metalab.unc.edu/pub/Linux/system/mouse>) solves this
   problem, or you can get the "mconv2" utility from the same location.
 
 C&T 82C710 mouse port support (as on TI Travelmate)
@@ -14142,25 +16262,25 @@
   This is a certain kind of PS/2 mouse used on the TI Travelmate. If
   you are unsure, try first to say N here and come back if the mouse
   doesn't work. Read the Busmouse-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
 PC110 digitizer pad support
 CONFIG_PC110_PAD
-  This drives the digitizer pad on the IBM PC110 palmtop. It can turn
+  This drives the digitizer pad on the IBM PC110 palmtop.  It can turn
   the digitizer pad into a PS/2 mouse emulation with tap gestures or
   into an absolute pad.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called pc110pad.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called pc110pad.o.
 
 Microsoft busmouse support
 CONFIG_MS_BUSMOUSE
   These animals (also called Inport mice) are connected to an
   expansion board using a round connector with 9 pins. If this is what
   you have, say Y and read the Busmouse-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you are unsure, say N and read the HOWTO nevertheless: it will
   tell you what you have. Also be aware that several vendors talk
@@ -14169,41 +16289,33 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called msbusmouse.o. 
-
-Apple Desktop Bus support
-CONFIG_ADB
-  Apple Desktop Bus (ADB) support is for support of devices which
-  are connected to an ADB port.  ADB devices tend to have 4 pins.
-  If you have an Apple Macintosh prior to the iMac, or a
-  "Blue and White G3", you probably want to say Y here.  Otherwise
-  say N.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called msbusmouse.o.
 
 Apple Desktop Bus mouse support
 CONFIG_ADBMOUSE
   Say Y here if you have this type of bus mouse (4 pin connector) as
-  is common on Macintoshes. You may want to read the Busmouse-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto .
+  is common on Macintoshes.  You may want to read the Busmouse-HOWTO,
+  available from <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called adbmouse.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called adbmouse.o.
 
 ATIXL busmouse support
 CONFIG_ATIXL_BUSMOUSE
   This is a rare type of busmouse that is connected to the back of an
-  ATI video card. Say Y if you have one of those. Note however that
+  ATI video card.  Say Y if you have one of those. Note however that
   most mice by ATI are actually Microsoft busmice; you should say Y to
-  "Microsoft busmouse support" above if you have one of those. Read
+  "Microsoft busmouse support" above if you have one of those.  Read
   the Busmouse-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called atixlmouse.o. 
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called atixlmouse.o.
 
   If you are unsure, say N and read the HOWTO nevertheless: it will
   tell you what you have.
@@ -14213,29 +16325,34 @@
   If you have a non-SCSI tape drive like that, say Y. Or, if you want
   to compile this driver as a module ( = code which can be inserted in
   and removed from the running kernel whenever you want), say M here
-  and read Documentation/modules.txt. The module will be called
+  and read <file:Documentation/modules.txt>. The module will be called
   tpqic02.o.
 
+iSeries Virtual Tape Support
+CONFIG_VIOTAPE
+  If you are running Linux on an iSeries system and you want Linux
+  to read and/or write a tape drive owned by OS/400, say Y here.
+
 Do you want runtime configuration for QIC-02
 CONFIG_QIC02_DYNCONF
   You can either configure this driver once and for all by editing a
-  header file (include/linux/tpqic02.h), in which case you should
-  say N, or you can fetch a program via anonymous FTP which is able
-  to configure this driver during runtime. The program to do this is
-  called 'qic02conf' and it is part of the tpqic02-support-X.Y.tar.gz
-  support package.
+  header file (<file:include/linux/tpqic02.h>), in which case you
+  should say N, or you can fetch a program via anonymous FTP which is
+  able to configure this driver during runtime.  The program to do
+  this is called 'qic02conf' and it is part of the
+  tpqic02-support-X.Y.tar.gz support package.
 
   If you want to use the qic02conf program, say Y.
 
 Floppy tape drive (QIC-80/40/3010/3020/TR-1/TR-2/TR-3) support
 CONFIG_FTAPE
   If you have a tape drive that is connected to your floppy
-  controller, say Y here. 
+  controller, say Y here.
 
   Some tape drives (like the Seagate "Tape Store 3200" or the Iomega
   "Ditto 3200" or the Exabyte "Eagle TR-3") come with a "high speed"
   controller of their own. These drives (and their companion
-  controllers) are also supported if you say Y here. 
+  controllers) are also supported if you say Y here.
 
   If you have a special controller (such as the CMS FC-10, FC-20,
   Mountain Mach-II, or any controller that is based on the Intel 82078
@@ -14243,56 +16360,57 @@
   Iomega's "Ditto Dash") you must configure it by selecting the
   appropriate entries from the "Floppy tape controllers" sub-menu
   below and possibly modify the default values for the IRQ and DMA
-  channel and the IO base in ftape's configuration menu. 
+  channel and the IO base in ftape's configuration menu.
 
   If you want to use your floppy tape drive on a PCI-bus based system,
-  please read the file drivers/char/ftape/README.PCI. 
+  please read the file <file:drivers/char/ftape/README.PCI>.
 
   The ftape kernel driver is also available as a runtime loadable
   module ( = code which can be inserted in and removed from the
   running kernel whenever you want). If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. The module
-  will be called ftape.o. 
+  module, say M here and read <file:Documentation/modules.txt>. The
+  module will be called ftape.o.
 
   Note that the Ftape-HOWTO is out of date (sorry) and documents the
   older version 2.08 of this software but still contains useful
-  information. There is a web page with more recent documentation at
-  http://www.math1.rwth-aachen.de/~heine/ftape/ . This page
+  information.  There is a web page with more recent documentation at
+  <http://www.math1.rwth-aachen.de/~heine/ftape/>.  This page
   always contains the latest release of the ftape driver and useful
   information (backup software, ftape related patches and
-  documentation, FAQ). Note that the file system interface has changed
-  quite a bit compared to previous versions of ftape. Please read
-  Documentation/ftape.txt.
+  documentation, FAQ).  Note that the file system interface has
+  changed quite a bit compared to previous versions of ftape.  Please
+  read <file:Documentation/ftape.txt>.
 
-The file system interface for ftape
+VFS interface for ftape
 CONFIG_ZFTAPE
   Normally, you want to say Y or M. DON'T say N here or you
   WON'T BE ABLE TO USE YOUR FLOPPY TAPE DRIVE.
 
   The ftape module itself no longer contains the routines necessary
   to interface with the kernel VFS layer (i.e. to actually write data
-  to and read data from the tape drive). Instead the file system
+  to and read data from the tape drive).  Instead the file system
   interface (i.e. the hardware independent part of the driver) has
   been moved to a separate module.
 
   If you say M zftape will be compiled as a runtime loadable
   module ( = code which can be inserted in and removed from the
-  running kernel whenever you want). In this case you should read
-  Documentation/modules.txt. The module will be called zftape.o.
+  running kernel whenever you want).  In this case you should read
+  <file:Documentation/modules.txt>.  The module will be called
+  zftape.o.
 
   Regardless of whether you say Y or M here, an additional runtime
   loadable module called `zft-compressor.o' which contains code to
   support user transparent on-the-fly compression based on Ross
-  William's lzrw3 algorithm will be produced. If you have enabled the
+  William's lzrw3 algorithm will be produced.  If you have enabled the
   kernel module loader (i.e. have said Y to "Kernel module loader
   support", above) then `zft-compressor.o' will be loaded
   automatically by zftape when needed.
 
-  Despite its name, zftape does NOT use compression by default. The
-  file Documentation/ftape.txt contains a short description of the
-  most important changes in the file system interface compared to
-  previous versions of ftape. The ftape home page
-  http://www-math.math.rwth-aachen.de/~LBFM/claus/ftape/ contains
+  Despite its name, zftape does NOT use compression by default.  The
+  file <file:Documentation/ftape.txt> contains a short description of
+  the most important changes in the file system interface compared to
+  previous versions of ftape.  The ftape home page
+  <http://www-math.math.rwth-aachen.de/~LBFM/claus/ftape/> contains
   further information.
 
   IMPORTANT NOTE: zftape can read archives created by previous
@@ -14331,7 +16449,7 @@
   wastes 32 KB of memory. Please note that this memory cannot be
   swapped out.
 
-Procfs entry for ftape
+Enable procfs status report (+2kb)
 CONFIG_FT_PROC_FS
   Optional. Saying Y will result in creation of a directory
   `/proc/ftape' under the /proc file system. The files can be viewed
@@ -14348,6 +16466,7 @@
   interface. Accessing `/proc/ftape' while the module is unloaded will
   result in a kernel Oops. This cannot be fixed from inside ftape.
 
+# Choice: ftdebug
 Controlling the amount of debugging output of ftape
 CONFIG_FT_NORMAL_DEBUG
   This option controls the amount of debugging output the ftape driver
@@ -14369,9 +16488,22 @@
   printed to the console but only makes it possible to produce
   "Excessive" debugging output.
 
-  Please read Documentation/ftape.txt for a short description
+  Please read <file:Documentation/ftape.txt> for a short description
   how to control the amount of debugging output.
 
+Excessive
+CONFIG_FT_FULL_DEBUG
+  Extremely verbose output for driver debugging purposes.
+
+Reduced
+CONFIG_FT_NO_TRACE
+  Reduced tape driver debugging output.
+
+None
+CONFIG_FT_NO_TRACE_AT_ALL
+  Suppress all debugging output from the tape drive.
+
+# Choice: ftcontroller
 The floppy drive controller for ftape
 CONFIG_FT_STD_FDC
   Only change this setting if you have a special controller. If you
@@ -14407,13 +16539,13 @@
   have said Y to "Floppy tape drive") or module load time (i.e. if you
   have said M to "Floppy tape drive").
 
-  Please read also the file Documentation/ftape.txt which
+  Please read also the file <file:Documentation/ftape.txt> which
   contains a short description of the parameters that can be set at
   boot or load time. If you want to use your floppy tape drive on a
   PCI-bus based system, please read the file
-  drivers/char/ftape/README.PCI.
+  <file:drivers/char/ftape/README.PCI>.
 
-IO base of the floppy disk controller used with Ftape
+IO base for the floppy disk controller used with Ftape
 CONFIG_FT_FDC_BASE
   You don't need to specify a value if the following default
   settings for the base IO address are correct:
@@ -14435,9 +16567,9 @@
   "Floppy tape drive") or module load time (i.e. if you have said M to
   "Floppy tape drive").
 
-  Please read also the file Documentation/ftape.txt which contains a
-  short description of the parameters that can be set at boot or load
-  time.
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time.
 
 IRQ channel for the floppy disk controller used with Ftape
 CONFIG_FT_FDC_IRQ
@@ -14461,9 +16593,9 @@
   "Floppy tape drive") or module load time (i.e. if you said M to
   "Floppy tape drive").
 
-  Please read also the file Documentation/ftape.txt which contains a
-  short description of the parameters that can be set at boot or load
-  time.
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time.
 
 DMA channel for the floppy disk controller used with Ftape
 CONFIG_FT_FDC_DMA
@@ -14487,9 +16619,9 @@
   "Floppy tape drive") or module load time (i.e. if you said M to
   "Floppy tape drive").
 
-  Please read also the file Documentation/ftape.txt which contains a
-  short description of the parameters that can be set at boot or load
-  time.
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time.
 
 FDC FIFO Threshold before requesting DMA service
 CONFIG_FT_FDC_THR
@@ -14521,10 +16653,16 @@
   introduced in XFree86 4.0. If you say Y here, you need to select
   the module that's right for your graphics card from the list below.
   These modules provide support for synchronization, security, and
-  DMA transfers. Please see http://dri.sourceforge.net for more
+  DMA transfers. Please see <http://dri.sourceforge.net> for more
   details.  You should also select and configure AGP
   (/dev/agpgart) support.
 
+Build drivers for new (XFree 4.1) DRM
+CONFIG_DRM_NEW
+  If you set this option, the new DRM version needed by XFree86 4.1
+  will be used.  Otherwise, the old DRM version will be used,
+  appropriate for XFree86 4.0.
+
 3dfx Banshee/Voodoo3+
 CONFIG_DRM_TDFX
   Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
@@ -14541,19 +16679,69 @@
   is selected, the module will be called r128.o.  AGP support for
   this card is strongly suggested (unless you have a PCI version).
 
+ATI Radeon
+CONFIG_DRM_RADEON
+  Choose this option if you have an ATI Radeon graphics card.  There
+  are both PCI and AGP versions.  You don't need to choose this to
+  run the Radeon in plain VGA mode.  There is a product page at
+  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
+  If M is selected, the module will be called radeon.o.
+
 Intel I810
 CONFIG_DRM_I810
   Choose this option if you have an Intel I810 graphics card.  If M is
   selected, the module will be called i810.o.  AGP support is required
   for this driver to work.
 
-Matrox g200/g400
+Matrox G200/G400/G450
 CONFIG_DRM_MGA
-  Choose this option if you have a Matrox g200 or g400 graphics card.  If M
-  is selected, the module will be called mga.o.  AGP support is required
+  Choose this option if you have a Matrox G200, G400 or G450 graphics
+  card.  If M is selected, the module will be called mga.o.  AGP
+  support is required for this driver to work.
+
+3dfx Banshee/Voodoo3+
+CONFIG_DRM40_TDFX
+  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
+  graphics card.  If M is selected, the module will be called tdfx.o.
+
+3dlabs GMX 2000
+CONFIG_DRM40_GAMMA
+  Choose this option if you have a 3dlabs GMX 2000 graphics card.
+  If M is selected, the module will be called gamma.o.
+
+ATI Rage 128
+CONFIG_DRM40_R128
+  Choose this option if you have an ATI Rage 128 graphics card.  If M
+  is selected, the module will be called r128.o.  AGP support for
+  this card is strongly suggested (unless you have a PCI version).
+
+ATI Radeon
+CONFIG_DRM40_RADEON
+  Choose this option if you have an ATI Radeon graphics card.  There
+  are both PCI and AGP versions.  You don't need to choose this to
+  run the Radeon in plain VGA mode.  There is a product page at
+  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
+  If M is selected, the module will be called radeon.o.
+
+Intel I810
+CONFIG_DRM40_I810
+  Choose this option if you have an Intel I810 graphics card.  If M is
+  selected, the module will be called i810.o.  AGP support is required
   for this driver to work.
 
-MTRR control and configuration
+Matrox G200/G400/G450
+CONFIG_DRM40_MGA
+  Choose this option if you have a Matrox G200, G400 or G450 graphics
+  card.  If M is selected, the module will be called mga.o.  AGP
+  support is required for this driver to work.
+
+Creator/Creator3D/Elite3D
+CONFIG_DRM_FFB
+  Choose this option if you have one of Sun's Creator3D-based graphics
+  and frame buffer cards.  Product page at
+  <http://www.sun.com/desktop/products/Graphics/creator3d.html>.
+
+MTRR (Memory Type Range Register) support
 CONFIG_MTRR
   On Intel P6 family processors (Pentium Pro, Pentium II and later)
   the Memory Type Range Registers (MTRRs) may be used to control
@@ -14563,10 +16751,10 @@
   before bursting over the PCI/AGP bus. This can increase performance
   of image write operations 2.5 times or more. Saying Y here creates a
   /proc/mtrr file which may be used to manipulate your processor's
-  MTRRs. Typically the X server should use this. 
+  MTRRs. Typically the X server should use this.
 
-  This code has a reasonably generic interface so that similar 
-  control registers on other processors can be easily supported 
+  This code has a reasonably generic interface so that similar
+  control registers on other processors can be easily supported
   as well:
 
   The Cyrix 6x86, 6x86MX and M II processors have Address Range
@@ -14584,9 +16772,9 @@
   You can safely say Y even if your machine doesn't have MTRRs, you'll
   just add about 9 KB to your kernel.
 
-  See Documentation/mtrr.txt for more information.
+  See <file:Documentation/mtrr.txt> for more information.
 
-Main CPU frequency, only for DEC alpha machine
+CPU clock frequency of your DEC Alpha
 CONFIG_FT_ALPHA_CLOCK
   On some DEC Alpha machines the CPU clock frequency cannot be
   determined automatically, so you need to specify it here ONLY if
@@ -14595,11 +16783,11 @@
 Double Talk PC internal speech card support
 CONFIG_DTLK
   This driver is for the DoubleTalk PC, a speech synthesizer
-  manufactured by RC Systems (http://www.rcsys.com/ ).  It is also
+  manufactured by RC Systems (<http://www.rcsys.com/>).  It is also
   called the `internal DoubleTalk'.  If you want to compile this as a
   module ( = code which can be inserted in and removed from the
   running kernel whenever you want), say M here and read
-  Documentation/modules.txt. The module will be called dtlk.o.
+  <file:Documentation/modules.txt>. The module will be called dtlk.o.
 
 Siemens R3964 serial protocol support
 CONFIG_R3964
@@ -14609,7 +16797,7 @@
 
   To compile this driver as a module ( = code which can be inserted in
   and removed from the running kernel whenever you want), say M here
-  and read Documentation/modules.txt. The module will be called 
+  and read <file:Documentation/modules.txt>. The module will be called
   n_r3964.o.
 
   If unsure, say N.
@@ -14619,28 +16807,28 @@
   This driver provides the kernel-side support for the intelligent
   fieldbus cards made by Applicom International. More information
   about these cards can be found on the WWW at the address
-  http://www.applicom-int.com/ , or by email from David Woodhouse
+  <http://www.applicom-int.com/>, or by email from David Woodhouse
   <dwmw2@infradead.org>.
 
   To compile this driver as a module ( = code which can be inserted in
   and removed from the running kernel whenever you want), say M here
-  and read Documentation/modules.txt. The module will be called
+  and read <file:Documentation/modules.txt>. The module will be called
   applicom.o.
 
   If unsure, say N.
 
 Sony Vaio Programmable I/O Control Device support
 CONFIG_SONYPI
-  This driver enables access to the Sony Programmable I/O Control Device
-  which can be found in many (all ?) Sony Vaio laptops.
+  This driver enables access to the Sony Programmable I/O Control
+  Device which can be found in many (all ?) Sony Vaio laptops.
 
-  If you have one of those laptops, read Documentation/sonypi.txt,
-  and say Y or M here.
+  If you have one of those laptops, read
+  <file:Documentation/sonypi.txt>, and say Y or M here.
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. The module will be
-  called sonypi.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sonypi.o.
 
 Intel Random Number Generator support
 CONFIG_INTEL_RNG
@@ -14653,7 +16841,7 @@
 
   To compile this driver as a module ( = code which can be inserted in
   and removed from the running kernel whenever you want), say M here
-  and read Documentation/modules.txt. The module will be called
+  and read <file:Documentation/modules.txt>. The module will be called
   i810_rng.o.
 
   If unsure, say N.
@@ -14662,50 +16850,76 @@
 CONFIG_PM
   "Power Management" means that parts of your computer are shut
   off or put into a power conserving "sleep" mode if they are not
-  being used. There are two competing standards for doing this: APM
-  and ACPI. If you want to use either one, say Y here and then also to
-  the requisite support below. 
+  being used.  There are two competing standards for doing this: APM
+  and ACPI.  If you want to use either one, say Y here and then also
+  to the requisite support below.
 
   Power Management is most important for battery powered laptop
   computers; if you have a laptop, check out the Linux Laptop home
   page on the WWW at
-  http://www.cs.utexas.edu/users/kharker/linux-laptop/ and the Battery
-  Powered Linux mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  <http://www.cs.utexas.edu/users/kharker/linux-laptop/> and the
+  Battery Powered Linux mini-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   Note that, even if you say N here, Linux on the x86 architecture
   will issue the hlt instruction if nothing is to be done, thereby
   sending the processor to sleep and saving power.
 
+USB SE401 Camera support
+CONFIG_USB_SE401
+  Say Y here if you want to connect this type of camera to your
+  computer's USB port. See <file:Documentation/usb/se401.txt> for more
+  information and for a list of supported cameras.
+
+  This driver uses the Video For Linux API. You must say Y or M to
+  "Video For Linux" (under Multimedia Devices) to use this driver.
+  Information on this API and pointers to "v4l" programs may be found
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called se401.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
 ACPI support
 CONFIG_ACPI
-  ACPI/OSPM support for Linux is currently under development. As such, 
-  this support is preliminary and EXPERIMENTAL. Configuring ACPI support
-  enables kernel interfaces that allow higher level software (OSPM) to
-  manipulate ACPI defined hardware and software interfaces, including
-  the evaluation of ACPI control methods. If unsure, choose N here.
-  Note, this option will enlarge your kernel by about 120K.
+  ACPI/OSPM support for Linux is currently under development. As such,
+  this support is preliminary and EXPERIMENTAL.  Configuring ACPI
+  support enables kernel interfaces that allow higher level software
+  (OSPM) to manipulate ACPI defined hardware and software interfaces,
+  including the evaluation of ACPI control methods.  If unsure, choose
+  N here.  Note, this option will enlarge your kernel by about 120K.
 
   This support requires an ACPI compliant platform (hardware/firmware).
   If both ACPI and Advanced Power Management (APM) support are
   configured, whichever is loaded first shall be used.
 
-  This code DOES NOT currently provide a complete OSPM implementation --
-  it has not yet reached APM's level of functionality. When fully
+  This code DOES NOT currently provide a complete OSPM implementation
+  -- it has not yet reached APM's level of functionality.  When fully
   implemented, Linux ACPI/OSPM will provide a more robust functional
-  replacement for legacy configuration and power management interfaces,
-  including the Plug-and-Play BIOS specification (PNP BIOS), the Multi-
-  Processor Specification (MPS), and the Advanced Power Management 
-  specification (APM).
+  replacement for legacy configuration and power management
+  interfaces, including the Plug-and-Play BIOS specification (PnP
+  BIOS), the Multi-Processor Specification (MPS), and the Advanced
+  Power Management specification (APM).
 
   Linux support for ACPI/OSPM is based on Intel Corporation's ACPI
   Component Architecture (ACPI CA). The latest ACPI CA source code,
   documentation, debug builds, and implementation status information
   can be downloaded from:
-  http://developer.intel.com/technology/iapc/acpi/downloads.htm
-  
+  <http://developer.intel.com/technology/iapc/acpi/downloads.htm>.
+
   The ACPI mailing list may also be of interest:
-  http://phobos.fs.tum.de/acpi/index.html
+  <http://phobos.fs.tum.de/acpi/index.html>.
+
+Enable ACPI 2.0 with errata 1.3
+CONFIG_ACPI20
+  Enable support for the 2.0 version of the ACPI interpreter.  See the
+  help for ACPI for caveats and discussion.
+
+ACPI kernel configuration manager
+CONFIG_ACPI_KERNEL_CONFIG
+  If you say `Y' here, Linux's ACPI support will use the
+  hardware-level system descriptions found on IA64 machines.
 
 ACPI Debug Statements
 CONFIG_ACPI_DEBUG
@@ -14716,37 +16930,39 @@
 ACPI Bus Manager
 CONFIG_ACPI_BUSMGR
   The ACPI Bus Manager enumerates devices in the ACPI namespace, and
-  handles PnP messages. All ACPI devices use its services, so using them
-  requires saying Y here.
+  handles PnP messages.  All ACPI devices use its services, so using
+  them requires saying Y here.
 
 ACPI System Driver
 CONFIG_ACPI_SYS
-  This driver will enable your system to shut down using ACPI, and dump
-  your ACPI DSDT table using /proc/acpi/dsdt.
+  This driver will enable your system to shut down using ACPI, and
+  dump your ACPI DSDT table using /proc/acpi/dsdt.
 
 ACPI Processor Driver
 CONFIG_ACPI_CPU
-  This driver installs ACPI as the idle handler for Linux, and uses ACPI
-  C2 and C3 processor states to save power, on systems that support it.
+  This driver installs ACPI as the idle handler for Linux, and uses
+  ACPI C2 and C3 processor states to save power, on systems that
+  support it.
 
 ACPI Button
 CONFIG_ACPI_BUTTON
-  This driver registers for events based on buttons, such as the power,
-  sleep, and lid switch. In the future, a daemon will read 
+  This driver registers for events based on buttons, such as the
+  power, sleep, and lid switch.  In the future, a daemon will read
   /proc/acpi/event and perform user-defined actions such as shutting
-  down the system. Until then, you can cat it, and see output when
+  down the system.  Until then, you can cat it, and see output when
   a button is pressed.
 
 ACPI AC Adapter
 CONFIG_ACPI_AC
   This driver adds support for the AC Adapter object, which indicates
-  whether a system is on AC, or not. Typically, only laptops have this
-  object, since desktops are always on AC.
+  whether a system is on AC, or not.  Typically, only laptops have
+  this object, since desktops are always on AC.
 
 ACPI Embedded Controller
 CONFIG_ACPI_EC
-  This driver is required on some systems for the proper operation of the
-  battery and thermal drivers. If you are compiling for a laptop, say Y.
+  This driver is required on some systems for the proper operation of
+  the battery and thermal drivers.  If you are compiling for a laptop,
+  say Y.
 
 ACPI Control Method Battery
 CONFIG_ACPI_CMBATT
@@ -14774,13 +16990,13 @@
   machines with more than one CPU.
 
   In order to use APM, you will need supporting software. For location
-  and more information, read Documentation/pm.txt and the Battery
-  Powered Linux mini-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto .
+  and more information, read <file:Documentation/pm.txt> and the
+  Battery Powered Linux mini-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
 
   This driver does not spin down disk drives (see the hdparm(8)
   manpage ("man 8 hdparm") for that), and it doesn't turn off
-  VESA-compliant "green" monitors. 
+  VESA-compliant "green" monitors.
 
   This driver does not support the TI 4000M TravelMate and the ACER
   486/DX4/75 because they don't have compliant BIOSes. Many "green"
@@ -14791,30 +17007,30 @@
   much point in using this driver and you should say N. If you get
   random kernel OOPSes or reboots that don't seem to be related to
   anything, try disabling/enabling this option (or disabling/enabling
-  APM in your BIOS). 
+  APM in your BIOS).
 
   Some other things you should try when experiencing seemingly random,
   "weird" problems:
 
    1) make sure that you have enough swap space and that it is
-      enabled. 
-   2) pass the "no-hlt" option to the kernel 
+      enabled.
+   2) pass the "no-hlt" option to the kernel
    3) switch on floating point emulation in the kernel and pass
       the "no387" option to the kernel
    4) pass the "floppy=nodma" option to the kernel
-   5) pass the "mem=4M" option to the kernel (thereby disabling 
+   5) pass the "mem=4M" option to the kernel (thereby disabling
       all but the first 4 MB of RAM)
    6) make sure that the CPU is not over clocked.
-   7) read the sig11 FAQ at http://www.bitwizard.nl/sig11/
+   7) read the sig11 FAQ at <http://www.bitwizard.nl/sig11/>
    8) disable the cache from your BIOS settings
    9) install a fan for the video card or exchange video RAM
    10) install a better fan for the CPU
-   11) exchange RAM chips 
+   11) exchange RAM chips
    12) exchange the motherboard.
 
   To compile this driver as a module ( = code which can be inserted in
   and removed from the running kernel whenever you want), say M here
-  and read Documentation/modules.txt. The module will be called
+  and read <file:Documentation/modules.txt>. The module will be called
   apm.o.
 
 Ignore USER SUSPEND
@@ -14839,7 +17055,7 @@
   T400CDT. This is off by default since most machines do fine without
   this feature.
 
-Do CPU IDLE calls
+Make CPU Idle calls when idle
 CONFIG_APM_CPU_IDLE
   Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop.
   On some machines, this can activate improved power savings, such as
@@ -14887,7 +17103,7 @@
   a work-around for a number of buggy BIOSes. Switch this option on if
   your computer crashes instead of powering off properly.
 
-Watchdog Timer Support 
+Watchdog Timer Support
 CONFIG_WATCHDOG
   If you say Y here (and to one of the following options) and create a
   character special file /dev/watchdog with major number 10 and minor
@@ -14899,12 +17115,12 @@
   implementation entirely in software (which can sometimes fail to
   reboot the machine) and a driver for hardware watchdog boards, which
   are more robust and can also keep track of the temperature inside
-  your computer. For details, read Documentation/watchdog.txt in the
-  kernel source.
+  your computer. For details, read <file:Documentation/watchdog.txt>
+  in the kernel source.
 
-  The watchdog is usually used together with the watchdog daemon 
+  The watchdog is usually used together with the watchdog daemon
   which is available via FTP (user: anonymous) from
-  ftp://tsx-11.mit.edu/pub/linux/sources/sbin/ . This daemon can also
+  <ftp://tsx-11.mit.edu/pub/linux/sources/sbin/>. This daemon can also
   monitor NFS connections and can reboot the machine when the process
   table is full.
 
@@ -14929,22 +17145,22 @@
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called wdt.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called wdt.o.
 
 WDT PCI Watchdog timer
 CONFIG_WDTPCI
-  If you have a PCI WDT500/501 watchdog board, say Y here,
-  otherwise N. It is not possible to probe for this board, which means
-  that you have to inform the kernel about the IO port and IRQ using
-  the "wdt=" kernel option (try "man bootparam" or see the
-  documentation of your boot loader (lilo or loadlin) about how to
-  pass options to the kernel at boot time).
+  If you have a PCI WDT500/501 watchdog board, say Y here, otherwise
+  N.  It is not possible to probe for this board, which means that you
+  have to inform the kernel about the IO port and IRQ using the "wdt="
+  kernel option (try "man bootparam" or see the documentation of your
+  boot loader (lilo or loadlin) about how to pass options to the
+  kernel at boot time).
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called wdt_pci.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called wdt_pci.o.
 
 WDT501 features
 CONFIG_WDT_501
@@ -14964,12 +17180,13 @@
 CONFIG_SOFT_WATCHDOG
   A software monitoring watchdog. This will fail to reboot your system
   from some situations that the hardware watchdog will recover
-  from. Equally it's a lot cheaper to install. 
+  from. Equally it's a lot cheaper to install.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The module will be called softdog.o.
+  <file:Documentation/modules.txt>. The module will be called
+   softdog.o.
 
 Berkshire Products PC Watchdog
 CONFIG_PCWATCHDOG
@@ -14977,55 +17194,90 @@
   This card simply watches your kernel to make sure it doesn't freeze,
   and if it does, it reboots your computer after a certain amount of
   time. This driver is like the WDT501 driver but for different
-  hardware. Please read Documentation/pcwd-watchdog.txt. The PC
-  watchdog cards can be ordered from http://www.berkprod.com . 
+  hardware. Please read <file:Documentation/pcwd-watchdog.txt>. The PC
+  watchdog cards can be ordered from <http://www.berkprod.com>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module is called pcwd.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. 
+  say M here and read <file:Documentation/modules.txt>.
 
   Most people will say N.
 
 Acquire SBC Watchdog Timer
 CONFIG_ACQUIRE_WDT
   This is the driver for the hardware watchdog on the PSC-6x86 Single
-  Board Computer produced by Acquire Inc (and others). This watchdog
+  Board Computer produced by Acquire Inc (and others).  This watchdog
   simply watches your kernel to make sure it doesn't freeze, and if
   it does, it reboots your computer after a certain amount of time.
 
   This driver is like the WDT501 driver but for different hardware.
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called pscwdt.o. If you want to compile it as a
+  The module is called pscwdt.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
+
+Advantech SBC Watchdog Timer
+CONFIG_ADVANTECH_WDT
+  If you are configuring a Linux kernel for the Advantech single-board
+  computer, say `Y' here to support its built-in watchdog timer
+  feature.  See the help for CONFIG_WATCHDOG for discussion.
+
+W83877F Watchdog Timer
+CONFIG_W83877F_WDT
+  This is the driver for the hardware watchdog on the W83877F chipset
+  as used in EMACS PC-104 motherboards (and likely others).  This
+  watchdog simply watches your kernel to make sure it doesn't freeze,
+  and if it does, it reboots your computer after a certain amount of
+  time.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called mixcomwd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
+
+IB700 SBC Watchdog Timer
+CONFIG_IB700_WDT
+  This is the driver for the hardware watchdog on the IB700 Single
+  Board Computer produced by TMC Technology (www.tmc-uk.com). This watchdog
+  simply watches your kernel to make sure it doesn't freeze, and if
+  it does, it reboots your computer after a certain amount of time.
+
+  This driver is like the WDT501 driver but for slightly different hardware.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called ib700wdt.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt. Most people
   will say N.
 
 Mixcom Watchdog
-CONFIG_MIXCOMWD 
-  This is a driver for the Mixcom hardware watchdog cards. This
+CONFIG_MIXCOMWD
+  This is a driver for the Mixcom hardware watchdog cards.  This
   watchdog simply watches your kernel to make sure it doesn't freeze,
   and if it does, it reboots your computer after a certain amount of
   time.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called mixcomwd.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. Most people
-  will say N.
+  The module is called mixcomwd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
 
 ZF MachZ Watchdog
 CONFIG_MACHZ_WDT
-  If you are using a ZF Micro MachZ processor, say Y here, otherwise N.
-  This is the driver for the watchdog timer builtin on that processor
-  using ZF-Logic interface. This watchdog simply watches your kernel to
-  make sure it doesn't freeze, and if it does, it reboots your computer
-  after a certain amount of time.
+  If you are using a ZF Micro MachZ processor, say Y here, otherwise
+  N.  This is the driver for the watchdog timer builtin on that
+  processor using ZF-Logic interface.  This watchdog simply watches
+  your kernel to make sure it doesn't freeze, and if it does, it
+  reboots your computer after a certain amount of time.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module is called machzwd.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt.
+  The module is called machzwd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 SuperH 3/4 Watchdog
 CONFIG_SH_WDT
@@ -15040,13 +17292,14 @@
 	      
 Toshiba Laptop support
 CONFIG_TOSHIBA
-  This adds a driver to safely access the System Management Mode
-  of the CPU on Toshiba portables. The System Management Mode
+  This adds a driver to safely access the System Management Mode of
+  the CPU on Toshiba portables with a genuine Toshiba BIOS. It does
+  not work on models with a Pheonix BIOS. The System Management Mode
   is used to set the BIOS and power saving options on Toshiba portables.
 
   For information on utilities to make use of this driver see the
   Toshiba Linux utilities web site at:
-  http://www.buzzard.org.uk/toshiba/
+  <http://www.buzzard.org.uk/toshiba/>.
 
   Say Y if you intend to run this kernel on a Toshiba portable.
   Say N otherwise.
@@ -15065,7 +17318,7 @@
 
   For information on utilities to make use of this driver see the
   I8K Linux utilities web site at:
-  http://www.debian.org/~dz/i8k/
+  <http://www.debian.org/~dz/i8k/>
 
   Say Y if you intend to run this kernel on a Dell Inspiron 8000.
   Say N otherwise.
@@ -15075,18 +17328,19 @@
   If you say Y here and also to "/dev file system support" in the
   'File systems' section, you will be able to update the microcode on
   Intel processors in the IA32 family, e.g. Pentium Pro, Pentium II,
-  Pentium III, Pentium 4, Xeon etc. You will obviously need the actual 
-  microcode binary data itself which is not shipped with the Linux kernel.
+  Pentium III, Pentium 4, Xeon etc.  You will obviously need the
+  actual microcode binary data itself which is not shipped with the
+  Linux kernel.
 
   For latest news and information on obtaining all the required
   ingredients for this driver, check:
-  http://www.urbanmyth.org/microcode/
+  <http://www.urbanmyth.org/microcode/>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called microcode.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt. If you use
-  modprobe or kmod you may also want to add the line
+  The module will be called microcode.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  you use modprobe or kmod you may also want to add the line
   'alias char-major-10-184 microcode' to your /etc/modules.conf file.
 
 /dev/cpu/*/msr - Model-specific register support
@@ -15120,7 +17374,7 @@
 CONFIG_RTC
   If you say Y here and create a character special file /dev/rtc with
   major number 10 and minor number 135 using mknod ("man mknod"), you
-  will get access to the real time clock (or hardware clock) built 
+  will get access to the real time clock (or hardware clock) built
   into your computer.
 
   Every PC has such a clock built in. It can be used to generate
@@ -15134,23 +17388,19 @@
   and set the RTC in an SMP compatible fashion.
 
   If you think you have a use for such a device (such as periodic data
-  sampling), then say Y here, and read Documentation/rtc.txt for
-  details.
+  sampling), then say Y here, and read <file:Documentation/rtc.txt>
+  for details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module is called rtc.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. 
-
-### Add
-#EFI Real Time Clock Services
-#CONFIG_EFI_RTC
+  say M here and read <file:Documentation/modules.txt>.
 
 Tadpole ANA H8 Support
 CONFIG_H8
   The Hitachi H8/337 is a microcontroller used to deal with the power
   and thermal environment. If you say Y here, you will be able to
-  communicate with it via a character special device. 
+  communicate with it via a character special device.
 
   If unsure, say N.
 
@@ -15160,7 +17410,7 @@
   with major number 10 and minor number 144 using mknod ("man mknod"),
   you get read and write access to the 50 bytes of non-volatile memory
   in the real time clock (RTC), which is contained in every PC and
-  most Ataris. 
+  most Ataris.
 
   This memory is conventionally called "CMOS RAM" on PCs and "NVRAM"
   on Ataris. /dev/nvram may be used to view settings there, or to
@@ -15177,8 +17427,9 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called nvram.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
+# Linus tree only
 Joystick support
 CONFIG_JOYSTICK
   If you have a joystick, 6dof controller, gamepad, steering wheel,
@@ -15186,232 +17437,299 @@
   enable generic support for these controllers. You will also need to
   say Y or M to at least one of the hardware specific drivers. This
   will make the controllers available as /dev/input/jsX devices.
-  Please read the file Documentation/joystick.txt which contains more
-  information and the location of the joystick package that you'll
-  need.
+  Please read the file <file:Documentation/joystick.txt> which
+  contains more information and the location of the joystick package
+  that you'll need.
+
+# AC tree only
+Game port support
+CONFIG_INPUT_GAMEPORT
+  Gameport support is for the standard 15-pin PC gameport.  If you
+  have a joystick, gamepad, gameport card, a soundcard with a gameport
+  or anything else that uses the gameport, say Y or M here and also to
+  at least one of the hardware specific drivers.
+  Please read the file <file:Documentation/joystick.txt> which
+  contains more information and the location of the joystick package
+  that you'll need if you use the gameport with a joystick.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called gameport.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
-ns558 gameports
+Classic ISA/PnP gameports
 CONFIG_INPUT_NS558
-  Say Y here if you have an ISA, ISAPnP or PCI standard gameport.
+  Say Y here if you have an ISA or PnP gameport.
   For more information on how to use the driver please read
-  Documentation/joystick.txt
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called ns558.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called ns558.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 PDPI Lightning 4 gamecard
 CONFIG_INPUT_LIGHTNING
   Say Y here if you have a PDPI Lightning 4 gamecard. For more
   information on how to use the driver please read
-  Documentation/joystick.txt
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called lightning.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called lightning.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Crystal SoundFusion gameports
+CONFIG_INPUT_CS461X
+  Say Y here if you have a Cirrus CS461x aka "Crystal SoundFusion"
+  PCI audio accelerator.  A product page for the CS4614 is at
+  <http://www.cirrus.com/design/products/overview/index.cfm?ProductID=40>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cs461x.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Aureal Vortex and Trident 4DWave gameports
 CONFIG_INPUT_PCIGAME
   Say Y here if you have a Trident 4DWave DX/NX or Aureal Vortex 1/2
   card. For more information on how to use the driver please read
-  Documentation/joystick.txt
+  <file:Documentation/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pcigame.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+SoundBlaster Live! gameports
+CONFIG_INPUT_EMU10K1
+  Say Y here if you have a SoundBlaster Live! card and want to use
+  its gameport.  For more information on how to use the driver
+  please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called pcigame.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called emu10k1-gp.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Classic PC analog joysticks and gamepads
 CONFIG_INPUT_ANALOG
   Say Y here if you have a controller that connects to the PC
-  gameport. This supports many different types, including joysticks
+  gameport.  This supports many different types, including joysticks
   with throttle control, with rudders, or with extensions like
   additional hats and buttons compatible with CH Flightstick Pro,
   ThrustMaster FCS, 6 and 8 button gamepads, or Saitek Cyborg
-  joysticks. For more information on how to use the driver please read
-  Documentation/joystick.txt
+  joysticks.  For more information on how to use the driver please
+  read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called analog.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called analog.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Assasin 3D and MadCatz Panther devices
+Assassin 3D and MadCatz Panther devices
 CONFIG_INPUT_A3D
   Say Y here if you have an FPGaming or MadCatz controller using the
-  A3D protocol over the PC gameport. For more information on how to
-  use the driver please read Documentation/joystick.txt
+  A3D protocol over the PC gameport.  For more information on how to
+  use the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called a3d.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called a3d.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Logitech ADI digital joysticks and gamepads
 CONFIG_INPUT_ADI
   Say Y here if you have a Logitech controller using the ADI
   protocol over the PC gameport. For more information on how to use
-  the driver please read Documentation/joystick.txt
+  the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called adi.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called adi.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Creative Labs Blaster Cobra gamepad
 CONFIG_INPUT_COBRA
   Say Y here if you have a Creative Labs Blaster Cobra gamepad.
   For more information on how to use the driver please read
-  Documentation/joystick.txt
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called cobra.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called cobra.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Genius Flight2000 Digital joysticks and gamepads
 CONFIG_INPUT_GF2K
-  Say Y here if you have a Genius Flight2000 or MaxFighter
-  digitally communicating joystick or gamepad. For more information
-  on how to use the driver please read Documentation/joystick.txt
+  Say Y here if you have a Genius Flight2000 or MaxFighter digitally
+  communicating joystick or gamepad.  For more information on how to
+  use the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called gf2k.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called gf2k.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Gravis GrIP joysticks and gamepads
 CONFIG_INPUT_GRIP
   Say Y here if you have a Gravis controller using the GrIP protocol
-  over the PC gameport. For more information on how to use the driver
-  please read Documentation/joystick.txt
+  over the PC gameport.  For more information on how to use the driver
+  please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called grip.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called grip.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 InterAct digital joysticks and gamepads
 CONFIG_INPUT_INTERACT
   Say Y hereif you have an InterAct gameport or joystick
-  communicating digitally over the gameport. For more information on
-  how to use the driver please read Documentation/joystick.txt
+  communicating digitally over the gameport.  For more information on
+  how to use the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called interact.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called interact.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 ThrustMaster DirectConnect joysticks and gamepads
 CONFIG_INPUT_TMDC
   Say Y here if you have a ThrustMaster controller using the
-  DirectConnect (BSP) protocol over the PC gameport. For more
+  DirectConnect (BSP) protocol over the PC gameport.  For more
   information on how to use the driver please read
-  Documentation/joystick.txt
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called tmdc.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called tmdc.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Microsoft SideWinder digital joysticks and gamepads
 CONFIG_INPUT_SIDEWINDER
   Say Y here if you have a Microsoft controller using the Digital
-  Overdrive protocol over PC gameport. For more information on how to
-  use the driver please read Documentation/joystick.txt
+  Overdrive protocol over PC gameport.  For more information on how to
+  use the driver please read <file:Documentation/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sidewinder.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Serial port device support
+CONFIG_INPUT_SERIO
+  Say Y here and to the Serial port input line discipline option if
+  you plan to use a joystick that communicates over the serial (COM)
+  port.  For more information on how to use the driver please read
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called sidewinder.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called sidewinder.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 Serial port input line discipline
 CONFIG_INPUT_SERPORT
-  Say Y hereif you plan to use a joystick that communicates over the
-  serial (COM) port. For more information on how to use the driver
-  please read Documentation/joystick.txt
+  Say Y here if you plan to use a joystick that communicates over the
+  serial (COM) port.  For more information on how to use the driver
+  please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called serport.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called serport.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Logitech WingMan Warrior joystick
 CONFIG_INPUT_WARRIOR
-  Say Y here if you have a Logitech WingMan Warrior joystick
-  connected to your computer's serial port. For more information on
-  how to use the driver please read Documentation/joystick.txt
+  Say Y here if you have a Logitech WingMan Warrior joystick connected
+  to your computer's serial port.  For more information on how to use
+  the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called warrior.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called warrior.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 LogiCad3d Magellan/SpaceMouse 6dof controller
 CONFIG_INPUT_MAGELLAN
   Say Y here if you have a Magellan or Space Mouse 6DOF controller
   connected to your computer's serial port.  For more information on
-  how to use the driver please read Documentation/joystick.txt
+  how to use the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called magellan.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called magellan.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 SpaceTec SpaceOrb/Avenger 6dof controller
 CONFIG_INPUT_SPACEORB
   Say Y here if you have a SpaceOrb 360 or SpaceBall Avenger 6DOF
   controller connected to your computer's serial port.  For more
   information on how to use the driver please read
-  Documentation/joystick.txt
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called spaceorb.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
- 
+  The module will be called spaceorb.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
 SpaceTec SpaceBall 4000 FLX 6dof controller
 CONFIG_INPUT_SPACEBALL
   Say Y here if you have a SpaceTec SpaceBall 4000 FLX controller
-  connected to your computer's serial port. For more information on
-  how to use the driver please read Documentation/joystick.txt
+  connected to your computer's serial port.  For more information on
+  how to use the driver please read <file:Documentation/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called spaceball.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Gravis Stinger gamepad
+CONFIG_INPUT_STINGER
+  Say Y here if you have a Gravis Stinger connected to one of your
+  serial ports.  For more information on how to use the driver please
+  read <file:Documentation/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called stinger.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 I-Force joysticks/wheels
 CONFIG_INPUT_IFORCE_232
   Say Y here if you have an I-Force joystick or steering wheel
-  connected to your serial (COM) port. For more information on
-  how to use the driver please read Documentation/joystick.txt
+  connected to your serial (COM) port.  For more information on how
+  to use the driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called iforce.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called iforce.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 I-Force joysticks/wheels
 CONFIG_INPUT_IFORCE_USB
   Say Y here if you have an I-Force joystick or steering wheel
-  connected to your USB port. For more information on how to use the
-  driver please read Documentation/joystick.txt
+  connected to your USB port.  For more information on how to use the
+  driver please read <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called iforce.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
- 
+  The module will be called iforce.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
 Multisystem, Sega Genesis, Saturn joysticks and gamepads
 CONFIG_INPUT_DB9
   Say Y here if you have a Sega Master System gamepad, Sega Genesis
   gamepad, Sega Saturn gamepad, or a Multisystem -- Atari, Amiga,
-  Commodore, Amstrad CPC joystick connected to your parallel port. 
-  For more information on how to use the driver please read 
-  Documentation/joystick.txt and Documentation/joystick-parport.txt.
+  Commodore, Amstrad CPC joystick connected to your parallel port.
+  For more information on how to use the driver please read
+  <file:Documentation/joystick.txt> and
+  <file:Documentation/joystick-parport.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called db9.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called db9.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Multisystem, NES, SNES, N64, PSX joysticks and gamepads
 CONFIG_INPUT_GAMECON
@@ -15420,47 +17738,48 @@
   Sony PlayStation gamepad or a Multisystem -- Atari, Amiga,
   Commodore, Amstrad CPC joystick connected to your parallel port.
   For more information on how to use the driver please read
-  Documentation/joystick.txt and Documentation/joystick-parport.txt
+  <file:Documentation/joystick.txt> and
+  <file:Documentation/joystick-parport.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called gamecon.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called gamecon.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Multisystem joysticks via TurboGraFX device
 CONFIG_INPUT_TURBOGRAFX
-  Say Y here if you have the TurboGraFX interface by Steffen
-  Schwenke, and want to use it with Multiststem -- Atari, Amiga,
-  Commodore, Amstrad CPC joystick. For more information on how to use
-  the driver please read Documentation/joystick.txt and
-  Documentation/joystick-parport.txt
+  Say Y here if you have the TurboGraFX interface by Steffen Schwenke,
+  and want to use it with Multisystem -- Atari, Amiga, Commodore,
+  Amstrad CPC joystick.  For more information on how to use the driver
+  please read <file:Documentation/joystick.txt> and
+  <file:Documentation/joystick-parport.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called turbografx.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called turbografx.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
 Amiga joysticks
 CONFIG_INPUT_AMIJOY
   Say Y here if you have an Amiga with a digital joystick connected
-  to it. For more information on how to use the driver please read
-  Documentation/joystick.txt
+  to it.  For more information on how to use the driver please read
+  <file:Documentation/joystick.txt>.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will be called joy-amiga.o. If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  The module will be called joy-amiga.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
 
-Atomwide Serial Support
+Atomwide serial port support
 CONFIG_ATOMWIDE_SERIAL
   If you have an Atomwide Serial card for an Acorn system, say Y to
-  this option. The driver can handle 1, 2, or 3 port cards.
-  If unsure, say N
+  this option.  The driver can handle 1, 2, or 3 port cards.
+  If unsure, say N.
 
-The Serial Port Dual Serial Port
+Dual serial port support
 CONFIG_DUALSP_SERIAL
   If you have the Serial Port's dual serial card for an Acorn system,
-  say Y to this option. If unsure, say N
+  say Y to this option.  If unsure, say N.
 
 NetWinder Button
 CONFIG_NWBUTTON
@@ -15481,7 +17800,8 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The module will be called nwbutton.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  nwbutton.o.
 
   Most people will answer Y to this question and "Reboot Using Button"
   below to be able to initiate a system shutdown from the button.
@@ -15499,37 +17819,37 @@
 Sound card support
 CONFIG_SOUND
   If you have a sound card in your computer, i.e. if it can say more
-  than an occasional beep, say Y. Be sure to have all the information
+  than an occasional beep, say Y.  Be sure to have all the information
   about your sound card and its configuration down (I/O port,
-  interrupt and DMA channel), because you will be asked for it. 
+  interrupt and DMA channel), because you will be asked for it.
 
   You want to read the Sound-HOWTO, available from
-  http://www.linuxdoc.org/docs.html#howto . General information
-  about the modular sound system is contained in the files
-  Documentation/sound/Introduction. The file
-  Documentation/sound/README.OSS contains some slightly outdated but
-  still useful information as well.
+  <http://www.linuxdoc.org/docs.html#howto>. General information about
+  the modular sound system is contained in the files
+  <file:Documentation/sound/Introduction>.  The file
+  <file:Documentation/sound/README.OSS> contains some slightly
+  outdated but still useful information as well.
 
   If you have a PnP sound card and you want to configure it at boot
   time using the ISA PnP tools (read
-  http://www.roestock.demon.co.uk/isapnptools/ ), then you need to
+  <http://www.roestock.demon.co.uk/isapnptools/>), then you need to
   compile the sound card support as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want)
-  and load that module after the PnP configuration is finished. To do
-  this, say M here and read Documentation/modules.txt as well as
-  Documentation/sound/README.modules; the module will be called
-  soundcore.o.
+  and load that module after the PnP configuration is finished.  To do
+  this, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/sound/README.modules>; the module will be
+  called soundcore.o.
 
   I'm told that even without a sound card, you can make your computer
   say more than an occasional beep, by programming the PC speaker.
   Kernel patches and supporting utilities to do that are in the pcsp
-  package, available at ftp://ftp.infradead.org/pub/pcsp/ .
+  package, available at <ftp://ftp.infradead.org/pub/pcsp/>.
 
 OSS sound modules
 CONFIG_SOUND_OSS
-  OSS is the Open Sound System suite of sound card drivers. They make
-  sound programming easier since they provide a common API. Say Y or M
-  here (the module will be called sound.o) if you haven't found a
+  OSS is the Open Sound System suite of sound card drivers.  They make
+  sound programming easier since they provide a common API.  Say Y or
+  M here (the module will be called sound.o) if you haven't found a
   driver for your sound card above, then pick your driver from the
   list below.
 
@@ -15546,7 +17866,7 @@
   then you can get the persistent DMA buffer functionality by passing
   the command-line argument "dmabuf=1" to the sound.o module.
 
-  Say Y unless you have 16MB or less RAM or a PCI sound card.
+  Say Y unless you have 16MB or more RAM or a PCI sound card.
 
 Support for Aztech Sound Galaxy (non-PnP) cards
 CONFIG_SOUND_SGALAXY
@@ -15558,9 +17878,9 @@
   "sgalaxy=<io>,<irq>,<dma>,<dma2>,<sgbase>" to the kernel command
   line.
 
-Support for AD1816(A) based cards (EXPERIMENTAL)
+Support for AD1816(A) based cards
 CONFIG_SOUND_AD1816
-  Say M here if you have a sound card based on the Analog Devices 
+  Say M here if you have a sound card based on the Analog Devices
   AD1816(A) chip.
 
   If you compile the driver into the kernel, you have to add
@@ -15569,8 +17889,8 @@
 Yamaha OPL3-SA1 audio controller
 CONFIG_SOUND_OPL3SA1
   Say Y or M if you have a Yamaha OPL3-SA1 sound chip, which is
-  usually built into motherboards. Read Documentation/sound/OPL3-SA
-  for details.
+  usually built into motherboards. Read
+  <file:Documentation/sound/OPL3-SA> for details.
 
   If you compile the driver into the kernel, you have to add
   "opl3sa=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the kernel
@@ -15581,7 +17901,7 @@
   Answer Y only if you have a Pro Audio Spectrum 16, ProAudio Studio
   16 or Logitech SoundMan 16 sound card. Answer N if you have some
   other card made by Media Vision or Logitech since those are not
-  PAS16 compatible. Please read Documentation/sound/PAS16.
+  PAS16 compatible. Please read <file:Documentation/sound/PAS16>.
   It is not necessary to add Sound Blaster support separately; it
   is included in PAS support.
 
@@ -15589,6 +17909,11 @@
   "pas2=<io>,<irq>,<dma>,<dma2>,<sbio>,<sbirq>,<sbdma>,<sbdma2>
   to the kernel command line.
 
+Enable PAS16 joystick port
+CONFIG_PAS_JOYSTICK
+  Say Y here to enable the Pro Audio Spectrum 16's auxiliary joystick
+  port.
+
 100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
 CONFIG_SOUND_SB
   Answer Y if you have an original Sound Blaster card made by Creative
@@ -15596,48 +17921,43 @@
   SM Games). For an unknown card you may answer Y if the card claims
   to be Sound Blaster-compatible.
 
-  Please read the file Documentation/sound/Soundblaster.
+  Please read the file <file:Documentation/sound/Soundblaster>.
 
   You should also say Y here for cards based on the Avance Logic
-  ALS-007 and ALS-1X0 chips (read Documentation/sound/ALS) and for cards
-  based on ESS chips (read Documentation/sound/ESS1868 and
-  Documentation/sound/ESS). If you have an SB AWE 32 or SB AWE 64, say
-  Y here and also to "AWE32 synth" below and read 
-  Documentation/sound/INSTALL.awe. If you have an IBM Mwave card, say
-  Y here and read Documentation/sound/mwave.
+  ALS-007 and ALS-1X0 chips (read <file:Documentation/sound/ALS>) and
+  for cards based on ESS chips (read
+  <file:Documentation/sound/ESS1868> and
+  <file:Documentation/sound/ESS>). If you have an SB AWE 32 or SB AWE
+  64, say Y here and also to "AWE32 synth" below and read
+  <file:Documentation/sound/INSTALL.awe>. If you have an IBM Mwave
+  card, say Y here and read <file:Documentation/sound/mwave>.
 
   If you compile the driver into the kernel and don't want to use
   isapnp, you have to add "sb=<io>,<irq>,<dma>,<dma2>" to the kernel
   command line.
-  
+
   You can say M here to compile this driver as a module; the module is
   called sb.o.
 
-#Loopback MIDI device support
-#CONFIG_SOUND_VMIDI
-###
-### somebody please fill this in.
-###
-#
 Gravis Ultrasound support
 CONFIG_SOUND_GUS
-  Say Y here for any type of Gravis Ultrasound card, including
-  the GUS or GUS MAX. See also Documentation/sound/ultrasound for
-  more information on configuring this card with modules.
+  Say Y here for any type of Gravis Ultrasound card, including the GUS
+  or GUS MAX.  See also <file:Documentation/sound/ultrasound> for more
+  information on configuring this card with modules.
 
   If you compile the driver into the kernel, you have to add
   "gus=<io>,<irq>,<dma>,<dma2>" to the kernel command line.
 
 MPU-401 support (NOT for SB16)
 CONFIG_SOUND_MPU401
-  Be careful with this question. The MPU401 interface is supported by
-  all sound cards. However, some natively supported cards have their
-  own driver for MPU401. Enabling this MPU401 option with these cards
-  will cause a conflict. Also, enabling MPU401 on a system that
-  doesn't really have a MPU401 could cause some trouble. If your card
+  Be careful with this question.  The MPU401 interface is supported by
+  all sound cards.  However, some natively supported cards have their
+  own driver for MPU401.  Enabling this MPU401 option with these cards
+  will cause a conflict.  Also, enabling MPU401 on a system that
+  doesn't really have a MPU401 could cause some trouble.  If your card
   was in the list of supported cards, look at the card specific
-  instructions in the drivers/sound/Readme.cards file. It's safe to
-  answer Y if you have a true MPU401 MIDI interface card.
+  instructions in the <file:Documentation/sound/README.OSS> file.  It
+  is safe to answer Y if you have a true MPU401 MIDI interface card.
 
   If you compile the driver into the kernel, you have to add
   "mpu401=<io>,<irq>" to the kernel command line.
@@ -15657,7 +17977,7 @@
   ADSP-16 or some other card based on the PSS chipset (AD1848 codec +
   ADSP-2115 DSP chip + Echo ESC614 ASIC CHIP). For more information on
   how to compile it into the kernel or as a module see the file
-  Documentation/sound/PSS.
+  <file:Documentation/sound/PSS>.
 
   If you compile the driver into the kernel, you have to add
   "pss=<io>,<mssio>,<mssirq>,<mssdma>,<mpuio>,<mpuirq>" to the kernel
@@ -15672,7 +17992,7 @@
 
   If you said M to "PSS support" above, you may enable or disable this
   PSS mixer with the module parameter pss_mixer. For more information
-  see the file Documentation/sound/PSS.
+  see the file <file:Documentation/sound/PSS>.
 
 Have DSPxxx.LD firmware file
 CONFIG_PSS_HAVE_BOOT
@@ -15687,10 +18007,10 @@
 
 Microsoft Sound System support
 CONFIG_SOUND_MSS
-  Again think carefully before answering Y to this question. It's safe
-  to answer Y if you have the original Windows Sound System card made
-  by Microsoft or Aztech SG 16 Pro (or NX16 Pro). Also you may say Y
-  in case your card is NOT among these:
+  Again think carefully before answering Y to this question.  It's
+  safe to answer Y if you have the original Windows Sound System card
+  made by Microsoft or Aztech SG 16 Pro (or NX16 Pro).  Also you may
+  say Y in case your card is NOT among these:
 
      ATI Stereo F/X, AdLib, Audio Excell DSP16, Cardinal DSP16,
      Ensoniq SoundScape (and compatibles made by Reveal and Spea),
@@ -15707,9 +18027,9 @@
      synthesizers (OPL2, OPL3 and OPL4), 6850 UART MIDI Interface.
 
   For cards having native support in VoxWare, consult the card
-  specific instructions in drivers/sound/Readme.cards. Some drivers
-  have their own MSS support and saying Y to this option will cause a
-  conflict.
+  specific instructions in <file:Documentation/sound/README.OSS>.
+  Some drivers have their own MSS support and saying Y to this option
+  will cause a conflict.
 
   If you compile the driver into the kernel, you have to add
   "ad1848=<io>,<irq>,<dma>,<dma2>[,<type>]" to the kernel command
@@ -15717,11 +18037,12 @@
 
 SGI Visual Workstation on-board audio
 CONFIG_SOUND_VWSND
-  Say Y or M if you have an SGI Visual Workstation and you want to
-  be able to use its on-board audio.  Read Documentation/sound/vwsnd
-  for more info on this driver's capabilities.
+  Say Y or M if you have an SGI Visual Workstation and you want to be
+  able to use its on-board audio.  Read
+  <file:Documentation/sound/vwsnd> for more info on this driver's
+  capabilities.
 
-Ensoniq Soundscape support
+Ensoniq SoundScape support
 CONFIG_SOUND_SSCAPE
   Answer Y if you have a sound card based on the Ensoniq SoundScape
   chipset. Such cards are being manufactured at least by Ensoniq, Spea
@@ -15751,27 +18072,28 @@
 Support for OPTi MAD16 and/or Mozart based cards
 CONFIG_SOUND_MAD16
   Answer Y if your card has a Mozart (OAK OTI-601) or MAD16 (OPTi
-  82C928 or 82C929 or 82C931) audio interface chip. These chips are 
+  82C928 or 82C929 or 82C931) audio interface chip. These chips are
   quite common so it's possible that many no-name cards have one of
   them. In addition the MAD16 chip is used in some cards made by known
   manufacturers such as Turtle Beach (Tropez), Reveal (some models)
   and Diamond (latest ones). Note however that the Tropez sound cards
   have their own driver; if you have one of those, say N here and Y or
-  M to "Full support for Turtle Beach WaveFront", below. 
+  M to "Full support for Turtle Beach WaveFront", below.
 
   If you compile the driver into the kernel, you have to add
   "mad16=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the
   kernel command line.
 
-  See also Documentation/sound/Opti and Documentation/sound/MAD16 for
-  more information on setting these cards up as modules.
+  See also <file:Documentation/sound/Opti> and
+  <file:Documentation/sound/MAD16> for more information on setting
+  these cards up as modules.
 
-Full support for Turtle Beach WaveFront synth/sound cards
+Full support for Turtle Beach WaveFront (Tropez Plus, Tropez, Maui) synth/sound cards
 CONFIG_SOUND_WAVEFRONT
   Answer Y or M if you have a Tropez Plus, Tropez or Maui sound card
-  and read the files Documentation/sound/Wavefront and
-  Documentation/sound/Tropez+.
-  
+  and read the files <file:Documentation/sound/Wavefront> and
+  <file:Documentation/sound/Tropez+>.
+
 Support MIDI in older MAD16 based cards (requires SB)
 CONFIG_MAD16_OLDCARD
   Answer Y (or M) if you have an older card based on the C928 or
@@ -15787,15 +18109,15 @@
   "cs4232=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the kernel
   command line.
 
-  See Documentation/sound/CS4232 for more information on configuring
-  this card.
+  See <file:Documentation/sound/CS4232> for more information on
+  configuring this card.
 
 Support for Yamaha OPL3-SA2 and SA3 based PnP cards
 CONFIG_SOUND_OPL3SA2
-  Say Y or M if you have a card based on one of these Yamaha
-  sound chipsets or the "SAx", which is actually a SA3. Read
-  Documentation/sound/OPL3-SA2 for more information on configuring
-  these cards.
+  Say Y or M if you have a card based on one of these Yamaha sound
+  chipsets or the "SAx", which is actually a SA3. Read
+  <file:Documentation/sound/OPL3-SA2> for more information on
+  configuring these cards.
 
   If you compile the driver into the kernel and do not also
   configure in the optional ISA PnP support, you will have to add
@@ -15824,52 +18146,118 @@
 Support for Turtle Beach MultiSound Classic, Tahiti, Monterey
 CONFIG_SOUND_MSNDCLAS
   Say M here if you have a Turtle Beach MultiSound Classic, Tahiti or
-  Monterey (not for the Pinnacle or Fiji). 
+  Monterey (not for the Pinnacle or Fiji).
 
-  See Documentation/sound/MultiSound for important information about
-  this driver.
+  See <file:Documentation/sound/MultiSound> for important information
+  about this driver.  Note that it has been discontinued, but the
+  Voyetra Turtle Beach knowledge base entry for it is still available
+  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/790.asp>.
+
+MSND Classic I/O
+CONFIG_MSNDCLAS_IO
+  I/O port address for the MultiSound Classic and related cards.
+
+MSND Classic IRQ
+CONFIG_MSNDCLAS_IRQ
+  Interrupt Request line for the MultiSound Classic and related cards.
+
+MSND Classic memory address
+CONFIG_MSNDCLAS_MEM
+  Memory-mapped I/O base address for the MultiSound Classic and
+  related cards.
 
 Full pathname of MSNDINIT.BIN firmware file
 CONFIG_MSNDCLAS_INIT_FILE
   The MultiSound cards have two firmware files which are required for
   operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See Documentation/sound/MultiSound for
-  information on how to obtain this.
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
 
 Full pathname of MSNDPERM.BIN firmware file
 CONFIG_MSNDCLAS_PERM_FILE
   The MultiSound cards have two firmware files which are required for
   operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See Documentation/sound/MultiSound for
-  information on how to obtain this.
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
 
 Support for Turtle Beach MultiSound Pinnacle, Fiji
 CONFIG_SOUND_MSNDPIN
   Say M here if you have a Turtle Beach MultiSound Pinnacle or Fiji.
-  See Documentation/sound/MultiSound for important information about
-  this driver.
+  See <file:Documentation/sound/MultiSound> for important information
+  about this driver. Note that it has been discontinued, but the
+  Voyetra Turtle Beach knowledge base entry for it is still available
+  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/600.asp>.
+
+MSND Pinnacle IDE I/O 0
+CONFIG_MSNDPIN_IDE_IO0
+  CD-ROM drive 0 memory-mapped I/O base address for the MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle IDE I/O 1
+CONFIG_MSNDPIN_IDE_IO1
+  CD-ROM drive 1 memory-mapped I/O base address for the MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle IDE IRQ
+CONFIG_MSNDPIN_IDE_IRQ
+  Interrupt request number for the IDE CD-ROM interface on the
+  MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle I/O
+CONFIG_MSNDPIN_IO
+  Memory-mapped I/O base address for the primary synthesizer on
+  MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle MPU I/O
+CONFIG_MSNDPIN_MPU_IO
+  Memory-mapped I/O base address for the Kurzweil daughterboard
+  synthesizer on MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle MPU IRQ
+CONFIG_MSNDPIN_MPU_IRQ
+  Iinterrupt request number for the Kurzweil daughterboard
+  synthesizer on MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle IRQ
+CONFIG_MSNDPIN_IRQ
+  Interrupt request line for the primary synthesizer on MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle joystick I/O
+CONFIG_MSNDPIN_JOYSTICK_IO
+  Memory-mapped I/O base address for the joystick port on MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle memory
+CONFIG_MSNDPIN_MEM
+  Memory-mapped I/O base address for the primary synthesizer on
+  MultiSound Pinnacle and Fiji sound cards.
 
 Full pathname of PNDSPINI.BIN firmware file
 CONFIG_MSNDPIN_INIT_FILE
-  The MultiSound cards have two firmware files which are required for
-  operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See Documentation/sound/MultiSound for
-  information on how to obtain this.
+  The MultiSound cards have two firmware files which are required
+  for operation, and are not currently included. These files can be
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
 
 Full pathname of PNDSPERM.BIN firmware file
 CONFIG_MSNDPIN_PERM_FILE
   The MultiSound cards have two firmware files which are required for
   operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See Documentation/sound/MultiSound for
-  information on how to obtain this.
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
 
-MSND Pinnacle have S/PDIF I/O
+MSND Pinnacle has S/PDIF I/O
 CONFIG_MSNDPIN_DIGITAL
   If you have the S/PDIF daughter board for the Pinnacle or Fiji,
   answer Y here; otherwise, say N. If you have this, you will be able
   to play and record from the S/PDIF port (digital signal). See
-  Documentation/sound/MultiSound for information on how to make use of
-  this capability.
+  <file:Documentation/sound/MultiSound> for information on how to make
+  use of this capability.
 
 MSND Pinnacle non-PnP Mode
 CONFIG_MSNDPIN_NONPNP
@@ -15896,15 +18284,14 @@
   and Pinnacle). Larger values reduce the chance of data overruns at
   the expense of overall latency. If unsure, use the default.
 
-FM synthesizer (YM3812/OPL-3) support
+Yamaha FM synthesizer (YM3812/OPL-3) support
 CONFIG_SOUND_YM3812
   Answer Y if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4).
   Answering Y is usually a safe and recommended choice, however some
   cards may have software (TSR) FM emulation. Enabling FM support with
   these cards may cause trouble (I don't currently know of any such
-  cards, however).
-  Please read the file Documentation/sound/OPL3 if your card has an
-  OPL3 chip.
+  cards, however). Please read the file
+  <file:Documentation/sound/OPL3> if your card has an OPL3 chip.
 
   If you compile the driver into the kernel, you have to add
   "opl3=<io>" to the kernel command line.
@@ -15914,27 +18301,27 @@
 ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)
 CONFIG_SOUND_ACI_MIXER
   ACI (Audio Command Interface) is a protocol used to communicate with
-  the microcontroller on some sound cards produced by miro and Cardinal
-  Technologies. The main function of the ACI is to control the mixer
-  and to get a product identification. 
+  the microcontroller on some sound cards produced by miro and
+  Cardinal Technologies.  The main function of the ACI is to control
+  the mixer and to get a product identification.
 
-  This Voxware ACI driver currently supports the ACI functions on the
+  This VoxWare ACI driver currently supports the ACI functions on the
   miroSOUND PCM1-pro, PCM12 and PCM20 radio. On the PCM20 radio, ACI
   also controls the radio tuner. This is supported in the video4linux
-  miropcm20 driver (say M or Y here and go back to "Multimedia devices"
-  -> "Radio Adapters").
+  miropcm20 driver (say M or Y here and go back to "Multimedia
+  devices" -> "Radio Adapters").
 
   This driver is also available as a module and will be called aci.o.
 
 SB32/AWE support
 CONFIG_SOUND_AWE32_SYNTH
   Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or
-  similar sound card. See Documentation/sound/README.awe,
-  Documentation/sound/AWE32 and the Soundblaster-AWE mini-HOWTO,
-  available from http://www.linuxdoc.org/docs.html#howto for more
-  info.
+  similar sound card. See <file:Documentation/sound/README.awe>,
+  <file:Documentation/sound/AWE32> and the Soundblaster-AWE
+  mini-HOWTO, available from <http://www.linuxdoc.org/docs.html#howto>
+  for more info.
 
-Gallant's Audio Excel DSP 16 support (SC-6000 and SC-6600)
+Gallant Audio Cards (SC-6000 and SC-6600 based)
 CONFIG_SOUND_AEDSP16
   Answer Y if you have a Gallant's Audio Excel DSP 16 card. This
   driver supports Audio Excel DSP 16 but not the III nor PnP versions
@@ -15948,10 +18335,10 @@
   accordingly. You should say Y to one and only one of these two
   questions.
 
-  Read the drivers/sound/lowlevel/README.aedsp16 file and the head of
-  drivers/sound/lowlevel/aedsp16.c as well as
-  Documentation/sound/AudioExcelDSP16 to get more information about
-  this driver and its configuration.
+  Read the <file:Documentation/sound/README.OSS> file and the head of
+  <file:drivers/sound/lowlevel/aedsp16.c> as well as
+  <file:Documentation/sound/AudioExcelDSP16> to get more information
+  about this driver and its configuration.
 
 Audio Excel DSP 16 (SBPro emulation)
 CONFIG_AEDSP16_SBPRO
@@ -15981,17 +18368,22 @@
   Say Y here in order to use the joystick interface of the Audio Excel
   DSP 16 card.
 
-SC-6600 CDROM Interface
-CONFIG_SC6600_CDROM
-  This is used to activate the CDROM interface of the Audio Excel
+SC-6600 CD-ROM Interface
+CONFIG_SC6600_CDROM  (4=None, 3=IDE, 1=Panasonic, 0=Sony)
+  This is used to activate the CD-ROM interface of the Audio Excel
   DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
-  CDROM present.
+  CD-ROM present.
+
+SC-6600 CD-ROM Interface I/O Address
+CONFIG_SC6600_CDROMBASE
+  Base I/O port address for the CD-ROM interface of the Audio Excel
+  DSP 16 card.
 
 Audio Excel DSP 16 (MPU401 emulation)
 CONFIG_AEDSP16_MPU401
   Answer Y if you want your audio card to emulate the MPU-401 midi
   interface. You should then also say Y to "MPU-401 support".
-  
+
   Note that the I/O base for MPU-401 support of aedsp16 is the same
   you have selected for "MPU-401 support". If you are using this
   driver as a module you have to specify the MPU I/O base address with
@@ -16000,46 +18392,70 @@
 C-Media PCI (CMI8338/8378)
 CONFIG_SOUND_CMPCI
   Say Y or M if you have a PCI sound card using the CMI8338
-  or the CMI8378 chip.set.
+  or the CMI8378 chipset.  Data on these chips are available at
+  <http://www.cmedia.com.tw/>.
+
+Support CMI8738 based audio cards
+CONFIG_SOUND_CMPCI_CM8738
+  Say Y or M if you have a PCI sound card using the CMI8338
+  or the CMI8378 chipset.  Data on this chip is available at
+  <http://www.cmedia.com.tw/doc8738.htm>.
+
+Enable joystick
+CONFIG_SOUND_CMPCI_JOYSTICK
+  Say here in order to enable the joystick port on a sound crd using
+  the CMI8338 or the CMI8738 chipset.  Data on these chips are
+  available at <http://www.cmedia.com.tw/>.
+
+Number of speakers (2, 4, 5, 6)
+CONFIG_SOUND_CMPCI_SPEAKERS
+  Specify the number of speaker channels you want the card to drive,
+  as an integer.
+
+Enable S/PDIF loop for CMI8738
+CONFIG_SOUND_CMPCI_SPDIFLOOP
+  Enable loopback from SPDIF in to SPDIF out.  For discussion, see
+  "The 8738 Audio SPDIF In/Out Technical Data" on the technical
+  support page at <http://www.cmedia.com.tw/>.
 
-Creative EMU10K1 based PCI sound cards
+Creative SBLive! (EMU10K1) based PCI sound cards
 CONFIG_SOUND_EMU10K1
   Say Y or M if you have a PCI sound card using the EMU10K1 chipset,
-  such as the various Creative SBLive!, SB PCI512 or Emu-APS.
+  such as the Creative SBLive!, SB PCI512 or Emu-APS.
 
   For more information on this driver and the degree of support for the
   different card models please check <http://opensource.creative.com>.
 
   It is now possible to load dsp microcode patches into the EMU10K1
-  chip.  These patches are used to implement real time sound processing
-  effects which include for example: signal routing, bass/treble
-  control, AC3 passthrough, ...
+  chip.  These patches are used to implement real time sound
+  processing effects which include for example: signal routing,
+  bass/treble control, AC3 passthrough, ...
   Userspace tools to create new patches and load/unload them can be
   found at <http://opensource.creative.com/dist.html>.
- 
+
 Creative EMU10K1 MIDI
 CONFIG_MIDI_EMU10K1
-  Say Y if you want to be able to use the OSS /dev/sequencer interface.
-  This code is still experimental.
+  Say Y if you want to be able to use the OSS /dev/sequencer
+  interface.  This code is still experimental.
 
 Crystal SoundFusion (CS4280/461x)
 CONFIG_SOUND_FUSION
-  This module drives the Crystal SoundFusion devices (CS4280/46xx series)
-  when wired as native sound drivers with AC97 codecs. If this driver
-  does not work try the CS4232 driver.
+  This module drives the Crystal SoundFusion devices (CS4280/46xx
+  series) when wired as native sound drivers with AC97 codecs.  If
+  this driver does not work try the CS4232 driver.
 
-Ensoniq ES1370 based PCI sound cards
+Ensoniq AudioPCI (ES1370) based PCI sound cards
 CONFIG_SOUND_ES1370
   Say Y or M if you have a PCI sound card utilizing the Ensoniq
   ES1370 chipset, such as Ensoniq's AudioPCI (non-97). To find
   out if your sound card uses an ES1370 without removing your
-  computer's cover, use lspci -n and look for the PCI ID 
+  computer's cover, use lspci -n and look for the PCI ID
   1274:5000. Since Ensoniq was bought by Creative Labs,
   Sound Blaster 64/PCI models are either ES1370 or ES1371 based.
   This driver differs slightly from OSS/Free, so PLEASE READ
-  Documentation/sound/es1370.
+  <file:Documentation/sound/es1370>.
 
-Ensoniq ES1371 based PCI sound cards
+Ensoniq AudioPCI 97 (ES1371) based sound cards
 CONFIG_SOUND_ES1371
   Say Y or M if you have a PCI sound card utilizing the Ensoniq
   ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if
@@ -16047,25 +18463,26 @@
   cover, use lspci -n and look for the PCI ID 1274:1371. Since
   Ensoniq was bought by Creative Labs, Sound Blaster 64/PCI
   models are either ES1370 or ES1371 based. This driver differs
-  slightly from OSS/Free, so PLEASE READ Documentation/sound/es1371.
+  slightly from OSS/Free, so PLEASE READ
+  <file:Documentation/sound/es1371>.
 
 ESS Solo1 based PCI sound cards (eg. SC1938)
 CONFIG_SOUND_ESSSOLO1
   Say Y or M if you have a PCI sound card utilizing the ESS Technology
   Solo1 chip. To find out if your sound card uses a
   Solo1 chip without removing your computer's cover, use
-  lspci -n and look for the PCI ID 125D:1969. This driver 
+  lspci -n and look for the PCI ID 125D:1969. This driver
   differs slightly from OSS/Free, so PLEASE READ
-  Documentation/sound/solo1.
+  <file:Documentation/sound/solo1>.
 
 S3 SonicVibes based PCI sound cards
 CONFIG_SOUND_SONICVIBES
   Say Y or M if you have a PCI sound card utilizing the S3
   SonicVibes chipset. To find out if your sound card uses a
   SonicVibes chip without removing your computer's cover, use
-  lspci -n and look for the PCI ID 5333:CA00. This driver 
+  lspci -n and look for the PCI ID 5333:CA00. This driver
   differs slightly from OSS/Free, so PLEASE READ
-  Documentation/sound/sonicvibes.
+  <file:Documentation/sound/sonicvibes>.
 
 Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core
 CONFIG_SOUND_TRIDENT
@@ -16082,26 +18499,29 @@
   10B9:5451 stands for ALi5451.
 
   This driver supports S/PDIF in/out (record/playback) for ALi 5451
-  embedded in ALi M1535+ and M1535D+. Note that they aren't all 
+  embedded in ALi M1535+ and M1535D+. Note that they aren't all
   enabled by default; you can enable them by saying Y to "/proc file
-  system support" and "Sysctl support", and after the /proc file 
+  system support" and "Sysctl support", and after the /proc file
   system has been mounted, executing the command
 
 	command			what is enabled
-  
+
   echo 0>/proc/ALi5451	pcm out is also set to S/PDIF out. (Default).
-  
+
   echo 1>/proc/ALi5451	use S/PDIF out to output pcm data.
-  
-  echo 2>/proc/ALi5451	use S/PDIF out to output non-pcm data.(AC3...).
 
-  echo 3>/proc/ALi5451	record from Ac97 in(MIC, Line in...). (Default).
-  
-  echo 4>/proc/ALi5451	no matter Ac97 settings, record from S/PDIF in.
-  
-  
+  echo 2>/proc/ALi5451	use S/PDIF out to output non-pcm data.
+                        (AC3...).
+
+  echo 3>/proc/ALi5451	record from Ac97 in(MIC, Line in...).
+                        (Default).
+
+  echo 4>/proc/ALi5451	no matter Ac97 settings, record from S/PDIF
+                        in.
+
+
   This driver differs slightly from OSS/Free, so PLEASE READ the
-  comments at the top of driver/sound/trident.c
+  comments at the top of <file:drivers/sound/trident.c>.
 
 Rockwell WaveArtist
 CONFIG_SOUND_WAVEARTIST
@@ -16119,10 +18539,10 @@
 
 VIA 82C686 MIDI
 CONFIG_MIDI_VIA82CXXX
-   Answer Y to use the MIDI interface of the Via686. You may need to
-   enable this in the BIOS before it will work. This is for connection
-   to external MIDI hardware, and is not required for software playback
-   of MIDI files.
+  Answer Y to use the MIDI interface of the Via686. You may need to
+  enable this in the BIOS before it will work. This is for connection
+  to external MIDI hardware, and is not required for software playback
+  of MIDI files.
 
 NeoMagic 256AV/256ZX sound chipsets
 CONFIG_SOUND_NM256
@@ -16132,13 +18552,76 @@
   laptops. It includes support for an AC97-compatible mixer and an
   apparently proprietary sound engine.
 
-  See Documentation/sound/NM256 for further information.
+  See <file:Documentation/sound/NM256> for further information.
 
-ESS Maestro sound chipsets
+ESS Maestro, Maestro2, Maestro2E driver
 CONFIG_SOUND_MAESTRO
   Say Y or M if you have a sound system driven by ESS's Maestro line
   of PCI sound chips.  These include the Maestro 1, Maestro 2, and
-  Maestro 2E.  See Documentation/sound/Maestro for more details.
+  Maestro 2E.  See <file:Documentation/sound/Maestro> for more
+  details.
+
+ESS Maestro3/Allegro driver
+CONFIG_SOUND_MAESTRO3
+  Say Y or M if you have a sound system driven by ESS's Maestro 3
+  PCI sound chip.
+
+Adlib Cards
+CONFIG_SOUND_ADLIB
+  Includes ASB 64 4D. Information on programming AdLib cards is
+  available at <http://www.itsnet.com/home/ldragon/Specs/adlib.html>.
+
+Crystal Sound CS4281
+CONFIG_SOUND_CS4281
+  Picture and feature list at
+  <http://www.pcbroker.com/crystal4281.html>.
+
+16 bit sampling option of GUS (_NOT_ GUS MAX)
+CONFIG_SOUND_GUS16
+  Support for Gravis Ulstrasound (GUS) cards (other than the GUS),
+  sampling at 16-bit width.
+
+GUS MAX support
+CONFIG_SOUND_GUSMAX
+  Support for Gravis Ulstrasound MAX.
+
+Intel ICH audio support
+CONFIG_SOUND_ICH
+  Support for integral audio in Intel's I/O Controller Hub (ICH)
+  chipset, as used on the 810/820/840 motherboards.
+
+Verbose initialization
+CONFIG_SOUND_TRACEINIT
+  Verbose soundcard initialization -- affects the format of autoprobe
+  and initialization messages at boot time.
+
+TV card (bt848) mixer support
+CONFIG_SOUND_TVMIXER
+  Support for audio mixer facilities on the BT848 TV frame-grabber
+  card.
+
+VIDC 16-bit sound
+CONFIG_SOUND_VIDC
+  16-bit support for the VIDC onboard sound hardware found on Acorn
+  machines.
+
+Loopback MIDI device support
+CONFIG_SOUND_VMIDI
+  Support for MIDI loopback on port 1 or 2.
+
+Yamaha YMF7xx PCI audio (native mode)
+CONFIG_SOUND_YMFPCI
+  Support for Yamaha cards including the YMF711, YMF715, YMF718,
+  YMF719, YMF724, Waveforce 192XG, and Waveforce 192 Digital.
+
+Yamaha PCI legacy ports support
+CONFIG_SOUND_YMFPCI_LEGACY
+  Support for YMF7xx PCI cards emulating an MP401.
+
+RME Hammerfall (RME96XX) support
+CONFIG_SOUND_RME96XX
+  Say Y or M if you have a Hammerfall, Hammerfall light or Hammerfall
+  DSP card from RME.
 
 Are you using a crosscompiler
 CONFIG_CROSSCOMPILE
@@ -16157,6 +18640,73 @@
   only useful for people working on the floating point exception
   handler. If you don't, say N.
 
+Galileo EV64120 Evaluation board
+CONFIG_MIPS_EV64120
+  This is an evaluation board based on the Galileo GT-64120
+  single-chip system controller that contains a MIPS R5000 compatible
+  core running at 75/100MHz.  Their website is located at
+  <http://www.galileot.com/>.  Say Y here if you wish to build a
+  kernel for this platform.
+
+Galileo EV96100 Evaluation board
+CONFIG_MIPS_EV96100
+  This is an evaluation board based on the Galielo GT-96100 LAN/WAN
+  communications controllers containing a MIPS R5000 compatible core
+  running at 83MHz. Their website is <http://www.galileot.com/>. Say Y
+  here if you wish to build a kernel for this platform.
+
+Support for ITE 8172G board
+CONFIG_MIPS_ITE8172
+  Ths is an evaluation board made by ITE (http://www.ite.com.tw/)
+  with ATX form factor that utilizes a MIPS R5000 to work with its
+  ITE8172G companion internet appliance chip. The MIPS core can be
+  either a NEC Vr5432 or QED RM5231. Say Y here if you wish to build
+  a kernel for this platform.
+
+Support for Globespan IVR board
+CONFIG_MIPS_IVR
+  This is an evaluation board built by Globespan to showcase thir
+  iVR (Internet Video Recorder) design. It utilizes a QED RM5231
+  R5000 MIPS core. More information can be found out their website
+  located at <http://www.globespan.net/products/product4.html>P. Say Y
+  here if you wish to build a kernel for this platform.
+
+Support for Alchemy Semi PB1000 board
+CONFIG_MIPS_PB1000
+  This is an evaluation board built by Alchemy Semiconducttor to
+  showcase their Au1000 Internet Edge Processor. It is SOC design
+  containing a MIPS32 core running at 266/400/500MHz with many
+  integrated peripherals. Further information can be found at their
+  website, <http://www.alchemysemi.com/>. Say Y here if you wish to
+  build a kernel for this platform.
+
+Support for Philips Nino
+CONFIG_NINO
+  Say Y here to select a kernel for the Philips Nino Palm PC. The
+  website at <http://www.realitydiluted.com/projects/nino/index.html>
+  will have more information.
+
+Model-500/510
+CONFIG_NINO_16MB
+  Say Y here to build a kernel specifically for Nino 500/501 color
+  Palm PCs from Philips (INCOMPLETE).
+
+Model-200/210/312/320/325/350/390
+CONFIG_NINO_8MB
+  Say Y here to build a kernel specifically for Nino Palm PCs with
+  8MB of memory. These include models 200/210/312/320/325/350/390.
+
+Model-300/301/302/319
+CONFIG_NINO_4MB
+  Say Y here to build a kernel specifically for Nino Palm PCs with
+  4MB of memory. These include models 300/301/302/319.
+
+Low-level debugging
+CONFIG_LL_DEBUG
+  Enable low-level debugging assertion macros in the kernel code.
+  Currently used only by the time services code in the MIPS port.
+  Don't turn this on unless you know what you are doing.
+
 Remote GDB kernel debugging
 CONFIG_REMOTE_DEBUG
   If you say Y here, it will be possible to remotely debug the MIPS
@@ -16182,34 +18732,34 @@
   by pressing various keys while holding SysRq (Alt+PrintScreen). It
   also works on a serial console (on PC hardware at least), if you
   send a BREAK and then within 5 seconds a command keypress. The
-  keys are documented in Documentation/sysrq.txt. Don't say Y unless
-  you really know what this hack does.
+  keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
+  unless you really know what this hack does.
 
-ISDN subsystem
+ISDN support
 CONFIG_ISDN
   ISDN ("Integrated Services Digital Networks", called RNIS in France)
   is a special type of fully digital telephone service; it's mostly
   used to connect to your Internet service provider (with SLIP or
-  PPP). The main advantage is that the speed is higher than ordinary
+  PPP).  The main advantage is that the speed is higher than ordinary
   modem/telephone connections, and that you can have voice
-  conversations while downloading stuff. It only works if your
+  conversations while downloading stuff.  It only works if your
   computer is equipped with an ISDN card and both you and your service
-  provider purchased an ISDN line from the phone company. For details,
-  read http://alumni.caltech.edu/~dank/isdn/ on the WWW.
+  provider purchased an ISDN line from the phone company.  For
+  details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW.
 
   This driver allows you to use an ISDN-card for networking
-  connections and as dialin/out device. The isdn-tty's have a built in
-  AT-compatible modem emulator. Network devices support autodial,
+  connections and as dialin/out device.  The isdn-tty's have a built
+  in AT-compatible modem emulator.  Network devices support autodial,
   channel-bundling, callback and caller-authentication without having
-  a daemon running. A reduced T.70 protocol is supported with tty's
-  suitable for German BTX. On D-Channel, the protocols EDSS1
-  (Euro-ISDN) and 1TR6 (German style) are supported. See
-  Documentation/isdn/README for more information. 
+  a daemon running.  A reduced T.70 protocol is supported with tty's
+  suitable for German BTX.  On D-Channel, the protocols EDSS1
+  (Euro-ISDN) and 1TR6 (German style) are supported.  See
+  <file:Documentation/isdn/README> for more information.
 
   If you want to compile the ISDN code as a module ( = code which can
   be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called isdn.o. If unsure, say N.
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called isdn.o. If unsure, say N.
 
 Support synchronous PPP
 CONFIG_ISDN_PPP
@@ -16220,20 +18770,21 @@
   protocol is used by Cisco and Sun for example. So you want to say Y
   here if the other end of your ISDN connection supports it. You will
   need a special version of pppd (called ipppd) for using this
-  feature. See Documentation/isdn/README.syncppp and
-  Documentation/isdn/syncPPP.FAQ for more information.
+  feature. See <file:Documentation/isdn/README.syncppp> and
+  <file:Documentation/isdn/syncPPP.FAQ> for more information.
 
 Support generic MP (RFC 1717)
 CONFIG_ISDN_MPP
   With synchronous PPP enabled, it is possible to increase throughput
   by bundling several ISDN-connections, using this protocol. See
-  Documentation/isdn/README.syncppp for more information.
+  <file:Documentation/isdn/README.syncppp> for more information.
 
 Use VJ-compression with synchronous PPP
 CONFIG_ISDN_PPP_VJ
   This enables Van Jacobson header compression for synchronous PPP.
   Say Y if the other end of the connection supports it.
 
+Support BSD compression
 CONFIG_ISDN_PPP_BSDCOMP
   Support for the BSD-Compress compression method for PPP, which uses
   the LZW compression method to compress each PPP packet before it is
@@ -16251,19 +18802,19 @@
   your Linux box as an ISDN-answering machine. Of course, this must be
   supported by the lowlevel driver also. Currently, the HiSax driver
   is the only voice-supporting driver. See
-  Documentation/isdn/README.audio for more information.
+  <file:Documentation/isdn/README.audio> for more information.
 
 X.25 PLP on top of ISDN
 CONFIG_ISDN_X25
-  This feature provides the X.25 protocol over ISDN connections. 
-  See Documentation/isdn/README.x25 for more information
+  This feature provides the X.25 protocol over ISDN connections.
+  See <file:Documentation/isdn/README.x25> for more information
   if you are thinking about using this.
 
 ISDN diversion services support
 CONFIG_ISDN_DIVERSION
   This option allows you to use some supplementary diversion
   services in conjunction with the HiSax driver on an EURO/DSS1
-  line. 
+  line.
 
   Supported options are CD (call deflection), CFU (Call forward
   unconditional), CFB (Call forward when busy) and CFNR (call forward
@@ -16274,22 +18825,23 @@
   countries. The keypad protocol is still not implemented. CD should
   work in all countries if the service has been subscribed to.
 
-  Please read the file Documentation/isdn/README.diversion.
+  Please read the file <file:Documentation/isdn/README.diversion>.
 
 ICN 2B and 4B support
 CONFIG_ISDN_DRV_ICN
   This enables support for two kinds of ISDN-cards made by a German
-  company called ICN. 2B is the standard version for a single ISDN
-  line with two B-channels, 4B supports two ISDN lines. For running
+  company called ICN.  2B is the standard version for a single ISDN
+  line with two B-channels, 4B supports two ISDN lines.  For running
   this card, additional firmware is necessary, which has to be
   downloaded into the card using a utility which is distributed
-  separately. See Documentation/isdn/README and README.icn for more
-  information. 
+  separately.  See <file:Documentation/isdn/README> and
+  <file:Documentation/isdn/README.icn> for more
+  information.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called icn.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called icn.o.
 
 isdnloop support
 CONFIG_ISDN_DRV_LOOP
@@ -16304,19 +18856,19 @@
   This is a driver supporting the Siemens chipset on various
   ISDN-cards (like AVM A1, Elsa ISDN cards, Teles S0-16.0, Teles
   S0-16.3, Teles S0-8, Teles/Creatix PnP, ITK micro ix1 and many
-  compatibles). 
+  compatibles).
 
   HiSax is just the name of this driver, not the name of any hardware.
-  
+
   If you have a card with such a chipset, you should say Y here and
   also to the configuration option of the driver for your particular
   card, below.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called hisax.o. See Documentation/isdn/README.HiSax for more
-  information on using this driver.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called hisax.o.  See <file:Documentation/isdn/README.HiSax>
+  for more information on using this driver.
 
 HiSax Support for EURO/DSS1
 CONFIG_HISAX_EURO
@@ -16324,9 +18876,9 @@
   telephone service company provides.
 
   The call control protocol E-DSS1 is used in most European countries.
-  If unsure, say yes.
+  If unsure, say Y.
 
-Support for german charge info
+Support for German chargeinfo
 CONFIG_DE_AOC
   If you want that the HiSax hardware driver sends messages to the
   upper level of the isdn code on each AOCD (Advice Of Charge, During
@@ -16361,230 +18913,265 @@
 
 HiSax Support for US NI1
 CONFIG_HISAX_NI1
-  Enable this if you like to use ISDN in US on a NI1 basic rate interface.
+  Enable this if you like to use ISDN in US on a NI1 basic rate
+  interface.
 
 Teles 16.0/8.0
 CONFIG_HISAX_16_0
   This enables HiSax support for the Teles ISDN-cards S0-16.0, S0-8
-  and many compatibles. 
+  and many compatibles.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port/shmem settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port/shmem settings.
 
 Teles 16.3 or PNP or PCMCIA
 CONFIG_HISAX_16_3
   This enables HiSax support for the Teles ISDN-cards S0-16.3 the
   Teles/Creatix PnP and the Teles PCMCIA.
-  
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 Teles PCI
 CONFIG_HISAX_TELESPCI
   This enables HiSax support for the Teles PCI.
-  See Documentation/isdn/README.HiSax on how to configure it.
- 
+  See <file:Documentation/isdn/README.HiSax> on how to configure it.
+
 Teles S0Box
 CONFIG_HISAX_S0BOX
   This enables HiSax support for the Teles/Creatix parallel port
-  S0BOX.  See Documentation/isdn/README.HiSax on how to configure it.
+  S0BOX.  See <file:Documentation/isdn/README.HiSax> on how to
+  configure it.
 
 AVM A1 (Fritz)
 CONFIG_HISAX_AVM_A1
   This enables HiSax support for the AVM A1 (aka "Fritz").
-  
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
 
-AVM PnP/PCI (Fritz!PNP/PCI)
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+AVM PnP/PCI (Fritz!PnP/PCI)
 CONFIG_HISAX_FRITZPCI
   This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI".
-  See Documentation/isdn/README.HiSax on how to configure it.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it.
 
 AVM A1 PCMCIA (Fritz)
 CONFIG_HISAX_AVM_A1_PCMCIA
   This enables HiSax support for the AVM A1 "Fritz!PCMCIA").
-  See Documentation/isdn/README.HiSax on how to configure it.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it.
 
 Elsa cards
 CONFIG_HISAX_ELSA
   This enables HiSax support for the Elsa Mircolink ISA cards, for the
   Elsa Quickstep series cards and Elsa PCMCIA.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 ITK ix1-micro Revision 2
 CONFIG_HISAX_IX1MICROR2
   This enables HiSax support for the ITK ix1-micro Revision 2 card.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 Eicon.Diehl Diva cards
 CONFIG_HISAX_DIEHLDIVA
   This enables HiSax support for the Eicon.Diehl Diva none PRO
   versions passive ISDN cards.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 ASUSCOM ISA cards
 CONFIG_HISAX_ASUSCOM
   This enables HiSax support for the AsusCom and their OEM versions
   passive ISDN ISA cards.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 TELEINT cards
 CONFIG_HISAX_TELEINT
   This enables HiSax support for the TELEINT SA1 semiactiv ISDN card.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 HFC-S based cards
 CONFIG_HISAX_HFCS
   This enables HiSax support for the HFC-S 2BDS0 based cards, like
   teles 16.3c.
-  
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 Sedlbauer cards
 CONFIG_HISAX_SEDLBAUER
   This enables HiSax support for the Sedlbauer passive ISDN cards.
 
-  See Documentation/isdn/README.HiSax on how to configure it using the
-  different cards, a different D-channel protocol, or non-standard
-  IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
 
 USR Sportster internal TA
 CONFIG_HISAX_SPORTSTER
   This enables HiSax support for the USR Sportster internal TA card.
 
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 MIC card
 CONFIG_HISAX_MIC
-  This enables HiSax support for the ITH MIC card. 
+  This enables HiSax support for the ITH MIC card.
 
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 NETjet card
 CONFIG_HISAX_NETJET
   This enables HiSax support for the NetJet from Traverse
   Technologies.
 
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 NETspider U card
 CONFIG_HISAX_NETJET_U
-  This enables HiSax support for the Netspider U interface ISDN card from
-  Traverse Technologies.
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  This enables HiSax support for the Netspider U interface ISDN card
+  from Traverse Technologies.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 Niccy PnP/PCI card
 CONFIG_HISAX_NICCY
-  This enables HiSax support for the Dr. Neuhaus Niccy PnP or PCI. 
+  This enables HiSax support for the Dr. Neuhaus Niccy PnP or PCI.
 
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 Siemens I-Surf card
 CONFIG_HISAX_ISURF
   This enables HiSax support for the Siemens I-Talk/I-Surf card with
   ISAR chip.
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 HST Saphir card
 CONFIG_HISAX_HSTSAPHIR
   This enables HiSax support for the HST Saphir card.
-  
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 Telekom A4T card
 CONFIG_HISAX_BKM_A4T
   This enables HiSax support for the Telekom A4T card.
-  
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 Scitel Quadro card
 CONFIG_HISAX_SCT_QUADRO
   This enables HiSax support for the Scitel Quadro card.
-  
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 Gazel cards
 CONFIG_HISAX_GAZEL
   This enables HiSax support for the Gazel cards.
 
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
 
 HFC PCI-Bus cards
 CONFIG_HISAX_HFC_PCI
   This enables HiSax support for the HFC-S PCI 2BDS0 based cards.
-  
-  For more informations see under Documentation/isdn/README.hfc-pci.
+
+  For more informations see under
+  <file:Documentation/isdn/README.hfc-pci>.
 
 Winbond W6692 based cards
 CONFIG_HISAX_W6692
   This enables HiSax support for Winbond W6692 based PCI ISDN cards.
-  
-  See Documentation/isdn/README.HiSax on how to configure it using a
-  different D-channel protocol, or non-standard IRQ/port settings.
 
-HFC-S+, HFC-SP, HFC-PCMCIA cards (EXPERIMENTAL)
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+HFC-S+, HFC-SP, HFC-PCMCIA cards
 CONFIG_HISAX_HFC_SX
   This enables HiSax support for the HFC-S+, HFC-SP and HFC-PCMCIA
   cards. This code is not finished yet.
 
-Am7930 (EXPERIMENTAL)
+Am7930
 CONFIG_HISAX_AMD7930
   This enables HiSax support for the AMD7930 chips on some SPARCs.
   This code is not finished yet.
 
+HiSax debugging
+CONFIG_HISAX_DEBUG
+  This enables debugging code in the new-style HiSax drivers, i.e.
+  the ST5481 USB driver currently. 
+  If in doubt, say yes.
+
+ELSA PCMCIA MicroLink cards
+CONFIG_HISAX_ELSA_CS
+  This enables the PCMCIA client driver for the Elsa PCMCIA MicroLink
+  card.
+
+Sedlbauer PCMCIA cards
+CONFIG_HISAX_SEDLBAUER_CS
+  This enables the PCMCIA client driver for the Sedlbauer Speed Star
+  and Speed Star II cards.
+
+ST5481 USB ISDN adapter
+CONFIG_HISAX_ST5481
+  This enables the driver for ST5481 based USB ISDN adapters,
+  e.g. the BeWan Gazel 128 USB
+
 PCBIT-D support
 CONFIG_ISDN_DRV_PCBIT
-  This enables support for the PCBIT ISDN-card. This card is
-  manufactured in Portugal by Octal. For running this card, additional
-  firmware is necessary, which has to be downloaded into the card
-  using a utility which is distributed separately. See
-  Documentation/isdn/README and Documentation/isdn/README.pcbit for
-  more information. 
+  This enables support for the PCBIT ISDN-card.  This card is
+  manufactured in Portugal by Octal.  For running this card,
+  additional firmware is necessary, which has to be downloaded into
+  the card using a utility which is distributed separately.  See
+  <file:Documentation/isdn/README> and
+  <file:Documentation/isdn/README.pcbit> for more information.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called pcbit.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called pcbit.o.
 
-Spellcaster support (EXPERIMENTAL)
+Spellcaster support
 CONFIG_ISDN_DRV_SC
-  This enables support for the Spellcaster BRI ISDN boards. This
+  This enables support for the Spellcaster BRI ISDN boards.  This
   driver currently builds only in a modularized version ( = code which
   can be inserted in and removed from the running kernel whenever you
-  want, details in Documentation/modules.txt); the module will be
-  called sc.o. See Documentation/isdn/README.sc and
-  http://www.spellcast.com for more information.
+  want, details in <file:Documentation/modules.txt>); the module will
+  be called sc.o.  See <file:Documentation/isdn/README.sc> and
+  <http://www.spellcast.com> for more information.
 
 Eicon active card support
 CONFIG_ISDN_DRV_EICON
@@ -16592,23 +19179,29 @@
   this card, additional firmware is necessary, which has to be loaded
   into the card using the eiconctrl utility which is part of the
   latest isdn4k-utils package. Please read the file
-  Documentation/isdn/README.eicon for more information.
-  
-Eicon Diva Server card support
+  <file:Documentation/isdn/README.eicon> for more information.
+
+Legacy Eicon driver
+CONFIG_ISDN_DRV_EICON_OLD
+  Say Y here to use your Eicon active ISDN card with ISDN4Linux
+  isdn module.
+
+Eicon PCI DIVA Server BRI/PRI/4BRI support
 CONFIG_ISDN_DRV_EICON_PCI
-  Say Y here if you have an Eicon Diva Server (BRI/PRI/4BRI) ISDN card.
-  Please read Documentation/isdn/README.eicon for more information.
-  
-Eicon old-type card support
+  Say Y here if you have an Eicon Diva Server (BRI/PRI/4BRI) ISDN
+  card.  Please read <file:Documentation/isdn/README.eicon> for more
+  information.
+
+Eicon old-type (S,SX,SCOM,Quadro,S2M) card support
 CONFIG_ISDN_DRV_EICON_ISA
   Say Y here if you have an old-type Eicon active ISDN card. In order
   to use this card, additional firmware is necessary, which has to be
   loaded into the card using the eiconctrl utility which is part of
   the latest isdn4k-utils package. Please read the file
-  Documentation/isdn/README.eicon for more information.
+  <file:Documentation/isdn/README.eicon> for more information.
 
 Eicon driver type standalone
-CONFIG_ISDN_DRV_EICON_STANDALONE
+CONFIG_ISDN_DRV_EICON_DIVAS
   Enable this option if you want the eicon driver as standalone
   version with no interface to the ISDN4Linux isdn module. If you
   say Y here, the eicon module only supports the Diva Server PCI
@@ -16621,20 +19214,49 @@
   Fax Class 1 and 2 commands. Using a getty with fax-support
   (mgetty+sendfax, hylafax), you will be able to use your Linux box as
   an ISDN-fax-machine. This must be supported by the lowlevel driver
-  also. See Documentation/isdn/README.fax for more information.
+  also. See <file:Documentation/isdn/README.fax> for more information.
 
 CAPI2.0 support
 CONFIG_ISDN_CAPI
   This provides the CAPI (Common ISDN Application Programming
   Interface, a standard making it easy for programs to access ISDN
-  hardware, see http://www.capi.org/ . This is needed for AVM's set of
-  active ISDN controllers like B1, T1, M1.
+  hardware, see <http://www.capi.org/>.  This is needed for AVM's set
+  of active ISDN controllers like B1, T1, M1.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The modules will be called capi.o and kernelcapi.o. If you want to
   compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
+
+CAPI2.0 /dev/capi20 support
+CONFIG_ISDN_CAPI_CAPI20
+  This option will provide the CAPI 2.0 interface to userspace
+  applications via /dev/capi20. Applications should use the
+  standardized libcapi20 to access this functionality.  You should say
+  Y/M here.
+
+CAPI2.0 Middleware support
+CONFIG_ISDN_CAPI_MIDDLEWARE
+  This option will enhance the capabilities of the /dev/capi20
+  interface.  It will provide a means of moving a data connection,
+  established via the usual /dev/capi20 interface to a special tty
+  device.  If you want to use pppd with pppdcapiplugin to dial up to
+  your ISP, say Y here.
+
+CAPI2.0 filesystem support
+CONFIG_ISDN_CAPI_CAPIFS
+  This option provides a special file system, similar to /dev/pts with
+  device nodes for the special ttys established by using the
+  middleware extension above. If you want to use pppd with
+  pppdcapiplugin to dial up to your ISP, say Y here.
+
+CAPI2.0 capidrv interface support
+CONFIG_ISDN_CAPI_CAPIDRV
+  This option provides the glue code to hook up CAPI driven cards to
+  the legacy isdn4linux link layer.  If you have a card which is
+  supported by a CAPI driver, but still want to use old features like
+  ippp interfaces or ttyI emulation, say Y/M here.
 
 AVM B1 ISA support
 CONFIG_ISDN_DRV_AVMB1_B1ISA
@@ -16657,6 +19279,11 @@
 CONFIG_ISDN_DRV_AVMB1_B1PCMCIA
   Enable support for the PCMCIA version of the AVM B1 card.
 
+AVM B1/M1/M2 PCMCIA cs module
+CONFIG_ISDN_DRV_AVMB1_AVM_CS
+  Enable the PCMCIA client driver for the AVM B1/M1/M2
+  PCMCIA cards.
+
 AVM T1/T1-B PCI support
 CONFIG_ISDN_DRV_AVMB1_T1PCI
   Enable support for the AVM T1 T1B card.
@@ -16673,40 +19300,40 @@
   disconnecting. This will increase the size of the kernel by 7 KB. If
   unsure, say Y.
 
-IBM Active 2000 support (EXPERIMENTAL)
+IBM Active 2000 support
 CONFIG_ISDN_DRV_ACT2000
   Say Y here if you have an IBM Active 2000 ISDN card. In order to use
   this card, additional firmware is necessary, which has to be loaded
   into the card using a utility which is part of the latest
   isdn4k-utils package. Please read the file
-  Documentation/isdn/README.act2000 for more information.
+  <file:Documentation/isdn/README.act2000> for more information.
 
 Auvertech TurboPAM support
 CONFIG_ISDN_DRV_TPAM
   This enables support for the Auvertech TurboPAM ISDN-card.
   For running this card, additional firmware is necessary, which has
   to be downloaded into the card using a utility which is distributed
-  separately from the Auvertech's web site: http://www.auvertech.fr.
+  separately from the Auvertech's web site: <http://www.auvertech.fr>.
 
   Please redirect all support questions to support@auvertech.fr.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called tpam.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called tpam.o.
 
 Hypercope HYSDN cards (Champ, Ergo, Metro) support (module)
 CONFIG_HYSDN
   Say Y here if you have one of Hypercope's active PCI ISDN cards
   Champ, Ergo and Metro. You will then get a module called hysdn.o.
-  Please read the file Documentation/isdn/README.hysdn for more
+  Please read the file <file:Documentation/isdn/README.hysdn> for more
   information.
 
 HYSDN CAPI 2.0 support
 CONFIG_HYSDN_CAPI
-  Say Y here if you like to use Hypercope's CAPI 2.0 interface
+  Say Y here if you like to use Hypercope's CAPI 2.0 interface.
 
-Support for Sun4 architecture
+Support for SUN4 machines (disables SUN4[CDM] support)
 CONFIG_SUN4
   Say Y here if, and only if, your machine is a Sun4. Note that
   a kernel compiled with this option will run only on Sun4.
@@ -16720,7 +19347,7 @@
   This support is also available as a module called esp.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 PTI Qlogic, ISP Driver
 CONFIG_SCSI_QLOGICPTI
@@ -16732,17 +19359,22 @@
   This support is also available as a module called qlogicpti.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-SPARC /dev/openprom compatibility driver (EXPERIMENTAL)
+Sun PROM console
+CONFIG_PROM_CONSOLE
+  Say Y to build a console driver for Sun machines that uses the
+  terminal emulation built into their console PROMS.
+
+/dev/openprom device support
 CONFIG_SUN_OPENPROMIO
   This driver provides user programs with an interface to the SPARC
   PROM device tree. The driver implements a SunOS-compatible
-  interface and a NetBSD-compatible interface. 
+  interface and a NetBSD-compatible interface.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M and read Documentation/modules.txt. If unsure, say Y.
+  say M and read <file:Documentation/modules.txt>. If unsure, say Y.
 
 Openprom tree appears in /proc/openprom
 CONFIG_SUN_OPENPROMFS
@@ -16752,8 +19384,9 @@
 
   If you want to compile the /proc/openprom support as a module ( =
   code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read Documentation/modules.txt.
-  The module will be called openpromfs.o. If unsure, say M.
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called openpromfs.o.  If unsure, say M.
 
 Kernel support for Linux/Sparc 32bit binary compatibility
 CONFIG_SPARC32_COMPAT
@@ -16773,11 +19406,11 @@
 
 SunOS binary emulation
 CONFIG_SUNOS_EMUL
-  This allows you to run most SunOS binaries. If you want to do this,
+  This allows you to run most SunOS binaries.  If you want to do this,
   say Y here and place appropriate files in /usr/gnemul/sunos. See
-  http://www.ultralinux.org/faq.html for more information. If you want
-  to run SunOS binaries on an Ultra you must also say Y to "Kernel
-  support for 32-bit a.out binaries" above.
+  <http://www.ultralinux.org/faq.html> for more information.  If you
+  want to run SunOS binaries on an Ultra you must also say Y to
+  "Kernel support for 32-bit a.out binaries" above.
 
 Mostek real time clock support
 CONFIG_SUN_MOSTEK_RTC
@@ -16802,17 +19435,37 @@
   This driver supports the serial ports on newer (PCI) Ultra systems.
   Say Y if you want to be able to use your serial ports.
 
-Aurora Multiboard 1600se (EXPERIMENTAL)
+Videopix Frame Grabber
+CONFIG_SUN_VIDEOPIX
+  Say Y here to support the Videopix Frame Grabber from Sun
+  Microsystems, commonly found on SPARCstations.  This card, which is
+  based on the Phillips SAA9051, can handle NTSC and PAL/SECAM and
+  SVIDEO signals.
+
+Sun bidirectional parallel port support
+CONFIG_SUN_BPP
+  Say Y here to support Sun's obsolete variant of IEEE1284
+  bidirectional parallel port protocol as /dev/bppX.  Can be built on
+  x86 machines.
+
+Aurora Multiboard 1600se
 CONFIG_SUN_AURORA
   The Aurora Multiboard is a multi-port high-speed serial controller.
   If you have one of these, say Y.
 
-Audio support (EXPERIMENTAL)
+Tadpole TS102 Microcontroller support
+CONFIG_TADPOLE_TS102_UCTRL
+  Say Y here to directly support the TS102 Microcontroller interface
+  on the Tadpole Sparcbook 3.  This device handles power-management
+  events, and can also notice the attachment/detachment of external
+  monitors and mice.
+
+Audio support
 CONFIG_SPARCAUDIO
   This driver provides support for the build-in sound devices on most
   Sun machines. If you want to be able to use this, select this option
   and one or more of the lowlevel drivers below. See
-  http://www.dementia.org/~shadow/sparcaudio.html for more
+  <http://www.dementia.org/~shadow/sparcaudio.html> for more
   information.
 
 AMD7930 Lowlevel Driver
@@ -16830,18 +19483,83 @@
   This driver supports the DBRI audio interface found on the SS10,
   SS20, Sparcbook 3, and Voyager systems.
 
-Dummy lowlevel Driver
+Dummy Lowlevel Driver
 CONFIG_SPARCAUDIO_DUMMY
   This is a pseudo-driver used for debugging and testing the
   sparcaudio subsystem. Say N unless you want to work on this
   subsystem.
 
-Sparc hardware (EXPERIMENTAL)
+Sparc hardware
 CONFIG_PARPORT_SUNBPP
   This driver provides support for the bidirectional parallel port
   found on many Sun machines. Note that many of the newer Ultras
   actually have pc style hardware instead.
 
+/proc/hardware support
+CONFIG_PROC_HARDWARE
+  Say Y here to support the /proc/hardware file, which gives you
+  access to information about the machine you're running on,
+  including the model, CPU, MMU, clock speed, BogoMIPS rating,
+  and memory size.
+
+Bluetooth subsystem support
+CONFIG_BLUEZ
+  Bluetooth is low-cost, low-power, short-range wireless technology.
+  It was designed as a replacement for cables and other short-range
+  technologies like IrDA.  Bluetooth operates in personal area range
+  that typically extends up to 10 meters.  More information about
+  Bluetooth can be found at <http://www.bluetooth.com>.
+
+  Linux Bluetooth subsystem consist of several layers:
+               HCI Core (device and connection manager, scheduler)
+               HCI Device drivers (interface to the hardware)
+               L2CAP Module (L2CAP protocol)
+
+  Say Y here to enable Linux Bluetooth support and to build HCI Core
+  layer.
+
+  To use Linux Bluetooth subsystem, you will need several user-space
+  utilities like hciconfig and hcid.  These utilities and updates to
+  Bluetooth kernel modules are provided in the BlueZ package.
+  For more information, see <http://bluez.sf.net>.
+
+  If you want to compile HCI Core as module (hci.o) say M here.
+
+L2CAP protocol support
+CONFIG_BLUEZ_L2CAP
+  L2CAP (Logical Link Control and Adaptation Protocol) provides
+  connection oriented and connection-less data transport.  L2CAP
+  support is required for most Bluetooth applications.
+
+  Say Y here to compile L2CAP support into the kernel or say M to
+  compile it as module (l2cap.o).
+
+HCI UART driver
+CONFIG_BLUEZ_HCIUART
+  Bluetooth HCI UART driver.
+  This driver is required if you want to use Bluetooth devices with
+  serial port interface.
+
+  Say Y here to compile support for Bluetooth UART devices into the
+  kernel or say M to compile it as module (hci_uart.o).
+
+HCI USB driver
+CONFIG_BLUEZ_HCIUSB
+  Bluetooth HCI USB driver.
+  This driver is required if you want to use Bluetooth devices with
+  USB interface.
+
+  Say Y here to compile support for Bluetooth USB devices into the
+  kernel or say M to compile it as module (hci_usb.o).
+
+HCI VHCI virtual HCI device driver
+CONFIG_BLUEZ_HCIVHCI
+  Bluetooth Virtual HCI device driver.
+  This driver is required if you want to use HCI Emulation software.
+
+  Say Y here to compile support for virtual HCI devices into the
+  kernel or say M to compile it as module (hci_vhci.o).
+
 # The following options are for Linux when running on the Hitachi
 # SuperH family of RISC microprocessors.
 
@@ -16959,20 +19677,45 @@
 
 #
 # m68k-specific kernel options
-# Documented by Chris Lawrence <quango@themall.net> et al.
+# Documented by Chris Lawrence <mailto:quango@themall.net> et al.
 #
 Amiga support
 CONFIG_AMIGA
   This option enables support for the Amiga series of computers. If
   you plan to use this kernel on an Amiga, say Y here and browse the
-  material available in Documentation/m68k; otherwise say N.
+  material available in <file:Documentation/m68k>; otherwise say N.
+
+Commodore A2232 serial support
+CONFIG_A2232
+  This option supports the 2232 7-port serial card shipped with the
+  Amiga 2000 and other Zorro-bus machines, dating from 1989.  At
+  a max of 19,200 bps, the ports are served by a 6551 ACIA UART chip
+  each, plus a 8520 CIA, and a master 6502 CPU and buffer as well. The
+  ports were connected with 8 pin DIN connectors on the card bracket,
+  for which 8 pin to DB25 adapters were supplied. The card also had
+  jumpers internally to toggle various pinning configurations.
+
+  This driver can be built as a module; but then "generic_serial.o"
+  will also be built as a module. This has to be loaded before
+  "ser_a2232.o". If you want to do this, answer M here and read
+  "<file:Documentation/modules.txt>".
+
+A4000T SCSI support
+CONFIG_A4000T_SCSI
+  Support for the NCR53C710 SCSI controller on the Amiga 4000T.
+
+A4091 SCSI support
+CONFIG_A4091_SCSI
+  Support for the NCR53C710 chip on the Amiga 4091 Z3 SCSI2 controller
+  (1993).  Very obscure -- the 4091 was part of an Amiga 4000 upgrade
+  plan at the time the Amiga business was sold to DKB.
 
 Atari support
 CONFIG_ATARI
   This option enables support for the 68000-based Atari series of
   computers (including the TT, Falcon and Medusa). If you plan to use
   this kernel on an Atari, say Y here and browse the material
-  available in Documentation/m68k; otherwise say N.
+  available in <file:Documentation/m68k>; otherwise say N.
 
 Hades support
 CONFIG_HADES
@@ -16984,7 +19727,7 @@
   This option enables support for the Apple Macintosh series of
   computers (yes, there is experimental support now, at least for part
   of the series).
-  
+
   Say N unless you're willing to code the remaining necessary support.
   ;)
 
@@ -16995,14 +19738,51 @@
   If you plan to try to use the kernel on such a machine say Y here.
   Everybody else says N.
 
+Q40/Q60 support
+CONFIG_Q40
+  The Q40 is a Motorola 68040-based successor to the Sinclair QL
+  manufactured in Germany.  There is an official Q40 home page at
+  <http://www.q40.de/>.  This option enables support for the Q40 and
+  Q60. Select your CPU below.  For 68LC060 don't forget to enable FPU
+  emulation.
+
+Sun 3 support
+CONFIG_SUN3
+  This option enables support for the Sun 3 series of workstations.
+  Currently, only the Sun 3/80 is supported within the Sun 3x family.
+  You will also want to enable 68030 support.  General Linux
+  information on the Sun 3x series (now discontinued) is at
+  <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+  If you don't want to compile a kernel for a Sun 3, say N.
+
 Sun 3X support
 CONFIG_SUN3X
   This option enables support for the Sun 3x series of workstations.
   Be warned that this support is very experimental. You will also want
   to say Y to 68020 support and N to the other processors below.
+  General Linux information on the Sun 3x series (now discontinued)
+  is at <http://www.angelfire.com/ca2/tech68k/sun3.html>.
 
   If you don't want to compile a kernel for a Sun 3x, say N.
 
+Sun3x builtin serial support
+CONFIG_SUN3X_ZS
+  ZS refers to a type of asynchronous serial port built in to the Sun3
+  and Sun3x workstations; if you have a Sun 3, you probably have
+  these.  Say 'Y' to support ZS ports directly.  This option must be
+  enabled in order to support the
+  keyboard and mouse ports.
+
+Sun keyboard support
+CONFIG_SUN_KEYBOARD
+  Say Y here to support the keyboard found on Sun 3 and 3x
+  workstations.  It can also be used support Sun Type-5 keyboards
+  through an adaptor.  See
+  <http://www.suse.cz/development/input/adapters.html> and
+  <http://sourceforge.net/projects/linuxconsole/> for details on the
+  latter.
+
 68020 support
 CONFIG_M68020
   If you anticipate running this kernel on a computer with a MC68020
@@ -17028,7 +19808,7 @@
   If you anticipate running this kernel on a computer with a MC68060
   processor, say Y. Otherwise, say N.
 
-Math emulation support (EXPERIMENTAL)
+Math emulation support
 CONFIG_M68KFPU_EMU
   At some point in the future, this will cause floating-point math
   instructions to be emulated by the kernel on machines that lack a
@@ -17060,19 +19840,25 @@
   This gives you access to some advanced options for the CPU. The
   defaults should be fine for most users, but these options may make
   it possible for you to improve performance somewhat if you know what
-  you are doing. 
+  you are doing.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about these options.
 
   Most users should say N to this question.
 
+Use one physical chunk of memory only
+CONFIG_SINGLE_MEMORY_CHUNK
+  Ignore all but the first contiguous chunk of physical memory for VM
+  purposes.  This will save a few bytes kernel size and may speed up
+  some operations.  Say N if not sure.
+
 Use read-modify-write instructions
 CONFIG_RMW_INSNS
   This allows to use certain instructions that work with indivisible
   read-modify-write bus cycles. While this is faster than the
-  workaround of disabling interrupts, it can conflict with DMA 
+  workaround of disabling interrupts, it can conflict with DMA
   ( = direct memory access) on many Amiga systems, and it is also said
   to destabilize other machines. It is very likely that this will
   cause serious problems on any Amiga or Atari Medusa if set. The only
@@ -17081,7 +19867,7 @@
   really know what you are doing, say N. Try Y only if you're quite
   adventurous.
 
-Zorro support
+Amiga Zorro (AutoConfig) bus support
 CONFIG_ZORRO
   This enables support for the Zorro bus in the Amiga. If you have
   expansion cards in your Amiga that conform to the Amiga
@@ -17103,23 +19889,34 @@
 
   When in doubt, say Y.
 
-Amiga 1200/600 PCMCIA support (EXPERIMENTAL)
+Amiga 1200/600 PCMCIA support
 CONFIG_AMIGA_PCMCIA
   Include support in the kernel for pcmcia on Amiga 1200 and Amiga
   600. If you intend to use pcmcia cards say Y; otherwise say N.
 
+Hisoft Whippet PCMCIA serial support
+CONFIG_WHIPPET_SERIAL
+  HiSoft has a web page at <http://www.hisoft.co.uk/>, but there
+  is no listing for the Whippet in their Amiga section.
+
 Amiga Zorro II ramdisk support
 CONFIG_AMIGA_Z2RAM
   This enables support for using Chip RAM and Zorro II RAM as a
   ramdisk or as a swap partition. Say Y if you want to include this
-  driver in the kernel. This driver is also available as a module 
+  driver in the kernel. This driver is also available as a module
   ( = code which can be inserted in and removed from the running
   kernel whenever you want). The module is called z2ram.o. If you want
   to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
-Atari ST-RAM swap support
+Support for ST-RAM as swap space
 CONFIG_STRAM_SWAP
+  Some Atari 68k macines (including the 520STF and 1020STE) divide
+  their addressible memory into ST and TT sections.  The TT section
+  (up to 512MB) is the main memory; the ST section (up to 4MB) is
+  accessible to the built-in graphics board, runs slower, and is
+  present mainly for backward compatibility with older machines.
+
   This enables support for using (parts of) ST-RAM as swap space,
   instead of as normal system memory. This can first enhance system
   performance if you have lots of alternate RAM (compared to the size
@@ -17130,6 +19927,12 @@
   sound). The probability that such allocations at module load time
   fail is drastically reduced.
 
+ST-RAM statistics in /proc
+CONFIG_STRAM_PROC
+  Say Y here to report ST-RAM usage statistics in /proc/stram.  See
+  the help for CONFIG_STRAM_SWAP for discussion of ST-RAM and its
+  uses.
+
 Atari ACSI support
 CONFIG_ATARI_ACSI
   This enables support for the Atari ACSI interface. The driver
@@ -17140,7 +19943,7 @@
   driver is also the basis for certain other drivers for devices
   attached to the ACSI bus: Atari SLM laser printer, BioNet-100
   Ethernet, and PAMsNet Ethernet. If you want to use one of these
-  devices, you need ACSI support, too. 
+  devices, you need ACSI support, too.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -17171,7 +19974,7 @@
   also available as a module ( = code which can be inserted in and
   removed from the running kernel whenever you want). The module is
   called wd33c93.o. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt.
+  and read <file:Documentation/modules.txt>.
 
 A2091 WD33C93A support
 CONFIG_A2091_SCSI
@@ -17179,7 +19982,7 @@
   say N. This driver is also available as a module ( = code which can
   be inserted in and removed from the running kernel whenever you
   want). The module is called wd33c93.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 GVP Series II WD33C93A support
 CONFIG_GVP11_SCSI
@@ -17192,21 +19995,21 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). The module will be called gvp11.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
-Cyberstorm SCSI support
+CyberStorm SCSI support
 CONFIG_CYBERSTORM_SCSI
   If you have an Amiga with an original (MkI) Phase5 Cyberstorm
   accelerator board and the optional Cyberstorm SCSI controller,
   answer Y. Otherwise, say N.
 
-Cyberstorm II SCSI support
+CyberStorm II SCSI support
 CONFIG_CYBERSTORMII_SCSI
   If you have an Amiga with a Phase5 Cyberstorm MkII accelerator board
   and the optional Cyberstorm SCSI controller, say Y. Otherwise,
   answer N.
 
-Blizzard 2060 SCSI support (EXPERIMENTAL)
+Blizzard 2060 SCSI support
 CONFIG_BLZ2060_SCSI
   If you have an Amiga with a Phase5 Blizzard 2060 accelerator board
   and want to use the onboard SCSI controller, say Y. Otherwise,
@@ -17228,18 +20031,25 @@
   If you have the Phase5 Fastlane Z3 SCSI controller, or plan to use
   one in the near future, say Y to this question. Otherwise, say N.
 
+BSC Oktagon SCSI support
+CONFIG_OKTAGON_SCSI
+  If you have the BSC Oktagon SCSI disk controller for the Amiga, say
+  Y to this question.  If you're in doubt about whether you have one,
+  see the picture at
+  <http://amiga.multigraph.com/photos/oktagon.html>.
+
 Atari native SCSI support
 CONFIG_ATARI_SCSI
   If you have an Atari with built-in NCR5380 SCSI controller (TT,
   Falcon, ...) say Y to get it supported. Of course also, if you have
-  a compatible SCSI controller (e.g. for Medusa). This driver is also
+  a compatible SCSI controller (e.g. for Medusa).  This driver is also
   available as a module ( = code which can be inserted in and removed
-  from the running kernel whenever you want). The module is called
-  atari_scsi.o. If you want to compile it as a module, say M here and
-  read Documentation/modules.txt. This driver supports both styles of
-  NCR integration into the system: the TT style (separate DMA), and
-  the Falcon style (via ST-DMA, replacing ACSI). It does NOT support
-  other schemes, like in the Hades (without DMA).
+  from the running kernel whenever you want).  The module is called
+  atari_scsi.o.  If you want to compile it as a module, say M here and
+  read <file:Documentation/modules.txt>.  This driver supports both
+  styles of NCR integration into the system: the TT style (separate
+  DMA), and the Falcon style (via ST-DMA, replacing ACSI).  It does
+  NOT support other schemes, like in the Hades (without DMA).
 
 Long delays for Toshiba CD-ROMs
 CONFIG_ATARI_SCSI_TOSHIBA_DELAY
@@ -17248,6 +20058,12 @@
   use a Toshiba CD-ROM drive; otherwise, the option is not needed and
   would impact performance a bit, so say N.
 
+Reset SCSI-devices at boottime
+CONFIG_ATARI_SCSI_RESET_BOOT
+  Reset the devices on your Atari whenever it boots.  This makes the
+  boot process fractionally longer but may assist recovery from errors
+  that leave the devices with SCSI operations partway completed.
+
 Hades SCSI DMA emulator
 CONFIG_TT_DMA_EMUL
   This option enables code which emulates the TT SCSI DMA chip on the
@@ -17262,7 +20078,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). The module is called ariadne.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 Ariadne II and X-Surf support
 CONFIG_ARIADNE2
@@ -17273,7 +20089,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called ariadne2.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 A2065 support
 CONFIG_A2065
@@ -17283,7 +20099,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). The module is called a2065.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Hydra support
 CONFIG_HYDRA
@@ -17292,17 +20108,30 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). The module is called hydra.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
-Pcmcia NE2000 compatible support
+Sun3 NCR5380 SCSI
+CONFIG_SUN3_SCSI
+  This option will enable support for the OBIO (onboard io) NCR5380
+  SCSI controller found in the Sun 3/50 and 3/60.  Note that this
+  driver does not provide support for VME SCSI boards.
+  General Linux information on the Sun 3 series (now discontinued)
+  is at <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+Sun3x ESP SCSI driver
+CONFIG_SUN3X_ESP
+  The ESP was an on-board SCSI controller used on Sun 3/80
+  machines.  Say Y here to compile in support for it.
+
+PCMCIA NE2000 and compatibles support
 CONFIG_APNE
-  If you have a pcmcia ne2000 compatible adapter, say Y.  Otherwise,
+  If you have a PCMCIA NE2000 compatible adapter, say Y.  Otherwise,
   say N.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). The module is called apne.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Atari Lance support
 CONFIG_ATARILANCE
@@ -17324,32 +20153,32 @@
 
 Amiga mouse support
 CONFIG_AMIGAMOUSE
-  If you want to be able to use an Amiga mouse in Linux, say Y. 
+  If you want to be able to use an Amiga mouse in Linux, say Y.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module is called amigamouse.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Atari mouse support
 CONFIG_ATARIMOUSE
-  If you want to be able to use an Atari mouse in Linux, say Y. 
+  If you want to be able to use an Atari mouse in Linux, say Y.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module is called atarimouse.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
 Atari MFP serial support
 CONFIG_ATARI_MFPSER
   If you like to use the MFP serial ports ("Modem1", "Serial1") under
   Linux, say Y. The driver equally supports all kinds of MFP serial
-  ports and automatically detects whether Serial1 is available. 
+  ports and automatically detects whether Serial1 is available.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. 
+  <file:Documentation/modules.txt>.
 
   Note for Falcon users: You also have an MFP port, it's just not
   wired to the outside... But you could use the port under Linux.
@@ -17365,7 +20194,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 Atari SCC serial DMA support
 CONFIG_ATARI_SCC_DMA
@@ -17382,9 +20211,9 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
-Atari DSP56k Digital Signal Processor support (EXPERIMENTAL)
+Atari DSP56k Digital Signal Processor support
 CONFIG_ATARI_DSP56K
   If you want to be able to use the DSP56001 in Falcons, say Y. This
   driver is still experimental, and if you don't know what it is, or
@@ -17393,7 +20222,12 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
+
+Support for early boot text console
+CONFIG_BOOTX_TEXT
+  Say Y here to see progress messages from the boot firmware in text
+  mode. Requires either BootX or Open Firmware.
 
 Amiga builtin serial support
 CONFIG_AMIGA_BUILTIN_SERIAL
@@ -17403,13 +20237,23 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 GVP IO-Extender support
 CONFIG_GVPIOEXT
   If you want to use a GVP IO-Extender serial card in Linux, say Y.
   Otherwise, say N.
 
+GVP IO-Extender parallel printer support
+CONFIG_GVPIOEXT_LP
+  Say Y to enable driving a printer from the parallel port on your
+  GVP IO-Extender card, N otherwise.
+
+GVP IO-Extender PLIP support
+CONFIG_GVPIOEXT_PLIP
+  Say Y to enable doing IP over the parallel port on your GVP
+  IO-Extender card, N otherwise.
+
 Multiface Card III serial support
 CONFIG_MULTIFACE_III_TTY
   If you want to use a Multiface III card's serial port in Linux,
@@ -17418,7 +20262,15 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
+
+Amiga/Atari/PowerMac DMA sound support
+CONFIG_DMASOUND
+  Support built-in audio chips accessible by DMA on various machines
+  that have them.  Note that this symbol does not affect the kernel
+  directly; rather, it controls whether configuration questions
+  enabling DMA sound drivers for various specific machine
+  architectures will be used.
 
 Atari DMA sound support
 CONFIG_DMASOUND_ATARI
@@ -17429,7 +20281,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 PowerMac DMA sound support
 CONFIG_DMASOUND_AWACS
@@ -17440,7 +20292,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 Amiga DMA sound support
 CONFIG_DMASOUND_PAULA
@@ -17451,7 +20303,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 Q40 sound support
 CONFIG_DMASOUND_Q40
@@ -17462,7 +20314,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
   want). If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
 
 HP DCA serial support
 CONFIG_HPDCA
@@ -17480,39 +20332,122 @@
   HP300 machines. If you are using such a system you almost certainly
   want this.
 
+# Choice: ppctype
 Processor Type
 CONFIG_6xx
-  There are four types of PowerPC chips supported. The more common
-  types (601, 603, 604, 740, 750, 7400), the Motorola embedded versions
-  (821, 823, 850, 855, 860, 8260), the IBM embedded versions (403 and
-  405) and the high end 64 bit Power processors (Power 3, Power 4).
-  Unless you are building a kernel for one of the embedded processor 
-  systems, or a 64 bit IBM RS/6000, choose 6xx.  Note that the kernel 
-  runs in 32-bit mode even on 64-bit chips.  Also note that because
-  the 82xx family has a 603e core, specific support for that chipset
-  is asked later on.
+  There are four types of PowerPC chips supported.  The more common
+  types (601, 603, 604, 740, 750, 7400), the Motorola embedded
+  versions (821, 823, 850, 855, 860, 8260), the IBM embedded versions
+  (403 and 405) and the high end 64 bit Power processors (Power 3,
+  Power 4).  Unless you are building a kernel for one of the embedded
+  processor systems, or a 64 bit IBM RS/6000, choose 6xx.  Note that
+  the kernel runs in 32-bit mode even on 64-bit chips.  Also note that
+  because the 82xx family has a 603e core, specific support for that
+  chipset is asked later on.
 
 Motorola MPC8260 CPM support
 CONFIG_8260
   The MPC8260 CPM (Communications Processor Module) is a typical
-  embedded CPU made by Motorola. Selecting this option means that you
-  wish to build a kernel for a machine with specifically an 8260 for
-  a CPU.
+  embedded CPU made by Motorola.  Selecting this option means that
+  you wish to build a kernel for a machine with specifically an 8260
+  for a CPU.
 
   If in doubt, say N.
 
+# Choice: Machine type
+Oak
+CONFIG_OAK
+  Select Oak if you have an IBM 403GCX "Oak" Evaluation Board.
+
+  Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board.
+
+  More information on these boards is available at:
+  <http://www.chips.ibm.com/products/powerpc/tools/evk_pn.html#GCX>.
+
+Walnut
+CONFIG_WALNUT
+  Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board.
+
 Workarounds for PPC601 bugs
 CONFIG_PPC601_SYNC_FIX
   Some versions of the PPC601 (the first PowerPC chip) have bugs which
-  mean that extra synchronization instructions are required near certain
-  instructions, typically those that make major changes to the CPU state.
-  These extra instructions reduce performance slightly.  If you say N
-  here, these extra instructions will not be included, resulting in a
-  kernel which will run faster but may not run at all on some systems
-  with the PPC601 chip.
+  mean that extra synchronization instructions are required near
+  certain instructions, typically those that make major changes to the
+  CPU state.  These extra instructions reduce performance slightly.
+  If you say N here, these extra instructions will not be included,
+  resulting in a kernel which will run faster but may not run at all
+  on some systems with the PPC601 chip.
+
+  If in doubt, say Y here.
+
+8xx Cache (Copy-Back or Writethrough)
+CONFIG_8xx_COPYBACK
+  Saying Y here will cause the cache on an MPC8xx processor to be used
+  in Copy-Back mode.  If you say N here, it is used in Writethrough
+  mode.
+
+  If in doubt, say Y here.
+
+MPC860 (Pre Rev. C) CPU6 Silicon Errata
+CONFIG_8xx_CPU6
+  MPC860 CPUs, prior to Rev C have some bugs in the silicon, which
+  require workarounds for Linux (and most other OSes to work).  If you
+  get a BUG() very early in boot, this might fix the problem.  For
+  more details read the document entitled "MPC860 Family Device Errata
+  Reference" on Motorola's website.  This option also incurs a
+  performance hit.
+
+  If in doubt, say N here.
+
+MPC8xx IDE support
+CONFIG_BLK_DEV_MPC8xx_IDE
+  This option provides support for IDE on Motorola MPC8xx Systems.
+  Please see 'Type of MPC8xx IDE interface' for details.
+
+  If unsure, say N.
+
+Type of MPC8xx IDE interface
+CONFIG_IDE_8xx_PCCARD
+  Select how the IDE devices are connected to the MPC8xx system:
+
+  8xx_PCCARD uses the 8xx internal PCMCIA interface in combination
+             with a PC Card (e.g. ARGOSY portable Hard Disk Adapter),
+             ATA PC Card HDDs or ATA PC Flash Cards (example: TQM8xxL
+             systems)
+
+  8xx_DIRECT is used for directly connected IDE devices using the 8xx
+             internal PCMCIA interface (example: IVMS8 systems)
+
+  EXT_DIRECT is used for IDE devices directly connected to the 8xx
+             bus using some glue logic, but _not_ the 8xx internal
+             PCMCIA interface (example: IDIF860 systems)
+
+Use SMC2 for UART
+CONFIG_SMC2_UART
+  If you would like to use SMC2 as a serial port, say Y here.
 
   If in doubt, say Y here.
 
+Use SMC2 for Console
+CONFIG_CONS_SMC2
+  If you are going to have a serial console on your device and are
+  using SMC2 for your serial port, say Y here, else say N.
+
+Use the alternate SMC2 I/O
+CONFIG_ALTSMC2
+  If you have an MPC823 or MPC850 and would like to use the alternate
+  SMC2 for I/O, say Y here.
+
+  If in doubt, say N here.
+
+Enable SCC2 and SCC3 for UART
+CONFIG_USE_SCC_IO
+  If your MPC8xx board has other SCC ports that you would like to use
+  for for a serial port, say Y here.
+
+  If in doubt, say N here.
+
+# Choice: ppc6xxtype
 Machine Type
 CONFIG_ALL_PPC
   Linux currently supports several different kinds of PowerPC-based
@@ -17522,7 +20457,28 @@
   and some IBM RS/6000 systems), CHRP (Common Hardware Reference
   Platform), and several embedded PowerPC systems containing 4xx, 6xx,
   7xx, 8xx, 74xx, and 82xx processors.  Currently, the default option
-  is to build a kernel which works on the first three. 
+  is to build a kernel which works on the first three.
+
+  Select PowerMac/PReP/MTX/CHRP if configuring for any of the above.
+
+  Select Gemini if configuring for a Synergy Microsystems' Gemini
+  series Single Board Computer.  More information is available at:
+  <http://www.synergymicro.com/PressRel/97_10_15.html>.
+
+  Select APUS if configuring for a PowerUP Amiga.  More information is
+  available at: <http://linux-apus.sourceforge.net>.
+
+Synergy-Gemini
+CONFIG_GEMINI
+  Select Gemini if configuring for a Synergy Microsystems' Gemini
+  series Single Board Computer.  More information is available at:
+  <http://www.synergymicro.com/PressRel/97_10_15.html>.
+
+Amiga-Apus
+CONFIG_APUS
+  Select APUS if configuring for a PowerUP Amiga.
+  More information is available at:
+  <http://linux-apus.sourceforge.net>.
 
 Embedded 8xx Board Type
 CONFIG_RPXLITE
@@ -17646,7 +20602,7 @@
   altivec registers, and turning on the 'altivec enable' bit so user
   processes can execute altivec instructions.
 
-  This option is only usefully if you have a processor that supports 
+  This option is only usefully if you have a processor that supports
   altivec (G4, otherwise known as 74xx series), but does not have
   any affect on a non-altivec cpu (it does, however add code to the
   kernel).
@@ -17657,7 +20613,7 @@
 CONFIG_TAU
   G3 and G4 processors have an on-chip temperature sensor called the
   'Thermal Assist Unit (TAU)', which, in theory, can measure the on-die
-  temperature within 2-4 degrees celcius. This option shows the current
+  temperature within 2-4 degrees Celsius. This option shows the current
   on-die temperature in /proc/cpuinfo if the cpu supports it.
 
   Unfortunately, on some chip revisions, this sensor is very inaccurate
@@ -17681,26 +20637,10 @@
 Average high and low temp
 CONFIG_TAU_AVERAGE
   The TAU hardware can compare the temperature to an upper and lower bound.
-  The default behavior is to show both the upper and lower bound in 
+  The default behavior is to show both the upper and lower bound in
   /proc/cpuinfo. If the range is large, the temperature is either changing
-  a lot, or the TAU hardware is broken (likely on some G4's). If the range
-  is small (around 4 degrees), the temperature is relatively stable.
-
-Support for CUDA based PowerMacs
-CONFIG_ADB_CUDA
-  This provides support for CUDA based Power Macintosh systems.  This
-  includes most OldWorld PowerMacs, the first generation iMacs, the
-  Blue&White G3 and the Yikes G4 (PCI Graphics).  All later models
-  should use CONFIG_ADB_PMU instead.
-
-  If unsure say Y.
-
-Support for PMU based PowerMacs
-CONFIG_ADB_PMU
-  This provides support for PMU based Power Macintosh systems.  This
-  includes all PowerBooks and all AGP-based machines.
-  
-  If unsure say Y.
+  a lot, or the TAU hardware is broken (likely on some G4's). If the range
+  is small (around 4 degrees), the temperature is relatively stable.
 
 Power management support for PowerBooks
 CONFIG_PMAC_PBOOK
@@ -17710,7 +20650,7 @@
   must get the power management daemon, pmud, to make it work and you
   must have the /dev/pmu device (see the pmud README).
 
-  Get pmud from ftp://linuxcare.com.au/pub/ppclinux/pmud/
+  Get pmud from <ftp://ftp.samba.org/pub/ppclinux/pmud/>.
 
   If you have a PowerBook, you should say Y.
 
@@ -17718,33 +20658,218 @@
   have it autoloaded. The act of removing the module shuts down the
   sound hardware for more power savings.
 
+Backlight control for LCD screens
+CONFIG_PMAC_BACKLIGHT
+  Say Y here to build in code to manage the LCD backlight on a
+  Macintosh PowerBook.  With this code, the backlight will be turned
+  on and off appropriately on power-management and lid-open/lid-closed
+  events; also, the PowerBook button device will be enabled so you can
+  change the screen brightness.
+
+# Choice: ppc8xxtype
+RPX-Lite
+CONFIG_RPXLITE
+  Single-board computers based around the PowerPC MPC8xx chips and
+  intended for embedded applications.  The following types are
+  supported:
+
+    RPX-Lite    -- PC104 form-factor SBC based on the MPC823
+    RPX-Classic -- Credit-card-size SBC based on the MPC 860
+    BSE-IP      -- Bright Star Engineering BSE-IP SBC
+    TQM823L     -- TQM823L SBC from TQ Components
+    TQM850L     -- TQM850L SBC from TQ Components
+    TQM855L     -- TQM855L SBC from TQ Components
+    TQM860L     -- TQM860L SBC from TQ Components
+    FPS850L	-- FingerPrint Sensor from TQ Components
+    TQM860      -- TQM860 SBC from IKENDI AG
+    SPD823TS	-- Speech Design TeleServer from Speech Design
+    IVMS8	-- Integrated VoiceMail SBC from Speech Design
+    SM850       -- Service Module 850 from Dependable Computer Systems
+    MBX         -- MBX821 and MBX860 SBCs
+    Wincept     -- Wincept SBCs for thin-client machines
+
+RPX-Classic
+CONFIG_RPXCLASSIC
+  The RPX-Classic is a single-board computer based on the Motorola
+  MPC860.  It features 16MB of DRAM and a variable amount of flash,
+  I2C EEPROM, thermal monitoring, a PCMCIA slot, a DIP switch and two
+  LEDs.  Variants with Ethernet ports exist.  Say Y here to support it
+  directly.
+
+BSE-IP
+CONFIG_BSEIP
+  Say Y here to support the Bright Star Engineering ipEngine SBC.
+  This is a credit-card-sized device featuring a MPC823 processor,
+  26MB DRAM, 4MB flash, Ethernet, a 16K-gate FPGA, USB, an LCD/video
+  controller, and two RS232 ports.
+
+TQM823L
+CONFIG_TQM823L
+  Say Y here to support the TQM823L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+TQM850L
+CONFIG_TQM850L
+  Say Y here to support the TQM850L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+TQM855L
+CONFIG_TQM855L
+  Say Y here to support the TQM855L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+TQM860L
+CONFIG_TQM860L
+  Say Y here to support the TQM860L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+FPS850
+CONFIG_FPS850
+  Say Y here to support the FingerPrint Sensor from AKENDI IG, based
+  on the TQ Components TQM850L module, released November 1999 and
+  discontinued a year later.
+
+TQM860
+CONFIG_TQM860
+  Say Y here to support the TQM860, one of an MPC8xx-based family of
+  SBCs (credit-card size) from TQ Components first released in 
+  mid-1999 and discontinued mid-2000.
+
+SM850
+CONFIG_SM850
+  Say Y here to support the Service Module 850 from Dependable
+  Computer Systems, an SBC based on the TQM850L module by TQ
+  Components.  This board is no longer in production.  The
+  manufacturer's website is at <http://www.decomsys.com/>.
+
+SPD823TS
+CONFIG_SPD823TS
+  Say Y here to support the Speech Design 823 Tele-Server from Speech
+  Design, released in 2000.  The manufacturer's website is at
+  <http://www.speech-design.de/>.
+
+IVMS8
+CONFIG_IVMS8
+  Say Y here to support the Integrated Voice-Mail Small 8-channel SBC
+  from Speech Design, released March 2001.  The manufacturer's website
+  is at <http://www.speech-design.de/>.
+
+# IVML24 is not yet active
+IVML24
+CONFIG_IVML24
+  Say Y here to support the Integrated Voice-Mail Large 24-channel SBC
+  from Speech Design, released March 2001.  The manufacturer's website
+  is at <http://www.speech-design.de/>.
+
+MBX
+CONFIG_MBX
+  MBX is a line of Motorola single-board computer based around the
+  MPC821 and MPC860 processors, and intended for embedded-controller
+  applications.  Say Y here to support these boards directly.
+
+WinCept
+CONFIG_WINCEPT
+  The Wincept 100/110 is a Motorola single-board computer based on the
+  MPC821 PowerPC, introduced in 1998 and designed to be used in
+  thin-client machines.  Say Y to support it directly.
+
+# More systems that will be supported soon, according to
+# Wolfgang Denk <wd@denx.de>:
+#
+# TQM8260:
+#         MPC8260 based module
+#
+#         Manufacturer: TQ Components, www.tq-group.de
+#         Date of Release: June 2001
+#         End of Life: not yet :-)
+#         URL: <http://www.denx.de/PDF/TQM82xx_SPEC_Rev003.pdf>
+#
+# IP860:
+#         VMEBus IP (Industry Pack) carrier board with MPC860
+#
+#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+#         Date of Release: ?
+#         End of life: -
+#         URL: <http://www.microsys.de/html/ip860.html>
+#
+# CU824:
+#         VMEBus Board with PCI extension with MPC8240 CPU
+#
+#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+#         Date of Release: early 2001 (?)
+#         End of life: -
+#         URL: <http://www.microsys.de/html/cu824.html
+#
+# PM826:
+#         Modular system with MPC8260 CPU
+#
+#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+#         Date of Release: mid 2001
+#         End of life: -
+#         URL: <http://www.microsys.de/html/pm826.html>
+#
+# PCU_E:
+#         PCU = Peripheral Controller Unit; E = extended (?)
+#
+#         Mfr: Siemens AG, ICN (Information and Communication Networks)
+#         <http://www.siemens.de/page/1,3771,224315-1-999_2_226207-0,00.html>
+#         Date of Release: April 2001
+#         End of life: -
+#         URL: n. a.o
+
+Support for EST8260
+CONFIG_EST8260
+  The EST8260 is a single-board computer manufactured by Wind River
+  Systems, Inc. (formerly Embedded Support Tools Corp.) and based on
+  the MPC8260.  Wind River Systems has a website at
+  <http://www.windriver.com/>, but the EST8260 cannot be found on it
+  and has probably been discontinued or rebadged.
+
 ADB raw keycode support
 CONFIG_MAC_ADBKEYCODES
   This provides support for sending raw ADB keycodes to console
   devices.  This is the default up to 2.4.0, but in future this may be
-  phased out in favor of generic Linux keycodes. If you say Y here, you
-  can dynamically switch via the
+  phased out in favor of generic Linux keycodes.  If you say Y here,
+  you can dynamically switch via the
       /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes
-  sysctl and with the "keyboard_sends_linux_keycodes=" kernel argument.
-  
+  sysctl and with the "keyboard_sends_linux_keycodes=" kernel
+  argument.
+
   If unsure, say Y here.
 
 Mouse button 2+3 emulation support
 CONFIG_MAC_EMUMOUSEBTN
   This provides generic support for emulating the 2nd and 3rd mouse
-  button with keypresses. If you say Y here, the emulation is still
-  disabled by default. The emulation is controlled by these sysctl entries:
+  button with keypresses.  If you say Y here, the emulation is still
+  disabled by default.  The emulation is controlled by these sysctl
+  entries:
       /proc/sys/dev/mac_hid/mouse_button_emulation
       /proc/sys/dev/mac_hid/mouse_button2_keycode
       /proc/sys/dev/mac_hid/mouse_button3_keycode
 
-Enhanced Real Time Clock Support
+Enhanced Real Time Clock Support (/dev/rtc)
 CONFIG_PPC_RTC
   If you say Y here and create a character special file /dev/rtc with
   major number 10 and minor number 135 using mknod ("man mknod"), you
-  will get access to the real time clock (or hardware clock) built 
+  will get access to the real time clock (or hardware clock) built
   into your computer.
-  
+
   If unsure, say Y here.
 
 Support for Open Firmware device tree in /proc
@@ -17753,27 +20878,27 @@
   an image of the device tree that the kernel copies from Open
   Firmware. If unsure, say Y here.
 
-RTAS proc interface
+RTAS (RunTime Abstraction Services) in /proc
 CONFIG_PPC_RTAS
   When you use this option, you will be able to use RTAS from
-  userspace. 
-  
+  userspace.
+
   RTAS stands for RunTime Abstraction Services and should
   provide a portable way to access and set system information. This is
-  commonly used on RS/6000 (pSeries) computers. 
-  
-  You can access RTAS via the special proc filesystem entry rtas.
+  commonly used on RS/6000 (pSeries) computers.
+
+  You can access RTAS via the special proc file system entry rtas.
   Don't confuse this rtas entry with the one in /proc/device-tree/rtas
   which is readonly.
-  
+
   If you don't know if you can use RTAS look into
   /proc/device-tree/rtas. If there are some entries, it is very likely
   that you will be able to use RTAS.
 
   You can do cool things with rtas. To print out information about
-  various sensors in the system, just do a 
+  various sensors in the system, just do a
 
-    $ cat /proc/rtas/sensors 
+    $ cat /proc/rtas/sensors
 
   or if you power off your machine at night but want it running when
   you enter your office at 7:45 am, do a
@@ -17782,7 +20907,7 @@
 
   and shutdown.
 
-  If unsure, say Y
+  If unsure, say Y.
 
 MESH (Power Mac internal SCSI) support
 CONFIG_SCSI_MESH
@@ -17792,9 +20917,9 @@
   adaptor. This driver is also available as a module called mesh.o
   ( = code which can be inserted in and removed from the running
   kernel whenever you want). If you want to compile it as a module,
-  say M here and read Documentation/modules.txt.
+  say M here and read <file:Documentation/modules.txt>.
 
-Maximum synchronous transfer rate
+Maximum synchronous transfer rate (MB/s) (0 = async)
 CONFIG_SCSI_MESH_SYNC_RATE
   On Power Macintoshes (and clones) where the MESH SCSI bus adaptor
   drives a bus which is entirely internal to the machine (such as the
@@ -17810,12 +20935,12 @@
   On Power Macintoshes (and clones) with two SCSI buses, the external
   SCSI bus is usually controlled by a 53C94 SCSI bus adaptor. Older
   machines which only have one SCSI bus, such as the 7200, also use
-  the 53C94. Say Y to include support for the 53C94. 
+  the 53C94. Say Y to include support for the 53C94.
 
   This driver is also available as a module called mac53c94.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 MACE (Power Mac Ethernet) support
 CONFIG_MACE
@@ -17826,7 +20951,7 @@
   This driver is also available as a module called mace.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Use AAUI port instead of TP by default
 CONFIG_MACE_AAUI_PORT
@@ -17835,53 +20960,52 @@
   instead of an 8-pin RJ45 connector for twisted-pair ethernet.  Say
   Y here if you have such a machine.  If unsure, say N.
   The driver will default to AAUI on ANS anyway, and if you use it as
-  a module, you can provide the port_aaui=0|1 to force the driver
-  setting.
+  a module, you can provide the port_aaui=0|1 to force the driver.
 
-BMAC (G3 ethernet) support
+BMAC (G3 Ethernet) support
 CONFIG_BMAC
   Say Y for support of BMAC Ethernet interfaces. These are used on G3
-  computers. 
+  computers.
 
   This driver is also available as a module called bmac.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-GMAC (G4/iBook ethernet) support
+GMAC (G4/iBook Ethernet) support
 CONFIG_GMAC
   Say Y for support of GMAC Ethernet interfaces. These are used on G4
-  and iBook computers. 
+  and iBook computers.
 
   This driver is also available as a module called gmac.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-National DP83902AV (Oak ethernet) support
+National DP83902AV (Oak Ethernet) support
 CONFIG_OAKNET
   Say Y if your machine has this type of Ethernet network card.
 
   This driver is also available as a module called oaknet.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Video For Linux
 CONFIG_VIDEO_DEV
   Support for audio/video capture and overlay devices and FM radio
   cards. The exact capabilities of each device vary. User tools for
   this are available from
-  ftp://ftp.uk.linux.org/pub/linux/video4linux .
+  <ftp://ftp.uk.linux.org/pub/linux/video4linux>.
 
   If you are interested in writing a driver for such an audio/video
   device or user software interacting with such a driver, please read
-  the file Documentation/video4linux/API.html.
+  the file <file:Documentation/video4linux/API.html>.
 
   This driver is also available as a module called videodev.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 Video For Linux /proc file system information
 CONFIG_VIDEO_PROC_FS
@@ -17897,122 +21021,121 @@
   in the port address below.
 
   Note that newer AIMSlab RadioTrack cards have a different chipset
-  and are not supported by this driver. For these cards, use the
+  and are not supported by this driver.  For these cards, use the
   RadioTrack II driver below.
 
   If you have a GemTeks combined (PnP) sound- and radio card you must
-  use this driver as a module and setup the card with isapnptools. You
-  must also pass the module a suitable io parameter, 0x248 has been
-  reported to be used by these cards.
+  use this driver as a module and setup the card with isapnptools.
+  You must also pass the module a suitable io parameter, 0x248 has
+  been reported to be used by these cards.
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml . More information
-  is contained in the file Documentation/video4linux/radiotrack.txt.
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.  More
+  information is contained in the file
+  <file:Documentation/video4linux/radiotrack.txt>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-aimslab.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-aimslab.o.
 
-RadioTrack i/o port
+RadioTrack I/O port
 CONFIG_RADIO_RTRACK_PORT
-  Enter either 0x30f or 0x20f here. The card default is 0x30f, if you
+  Enter either 0x30f or 0x20f here.  The card default is 0x30f, if you
   haven't changed the jumper setting on the card.
 
 AIMSlab RadioTrack II support
 CONFIG_RADIO_RTRACK2
-  Choose Y here if you have this FM radio card, and then fill in the 
+  Choose Y here if you have this FM radio card, and then fill in the
   port address below.
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-rtrack2.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-rtrack2.o.
 
-RadioTrack II i/o port
+RadioTrack II I/O port
 CONFIG_RADIO_RTRACK2_PORT
-  Enter either 0x30c or 0x20c here. The card default is 0x30c, if you
+  Enter either 0x30c or 0x20c here.  The card default is 0x30c, if you
   haven't changed the jumper setting on the card.
 
 Aztech/Packard Bell Radio
 CONFIG_RADIO_AZTECH
   Choose Y here if you have one of these FM radio cards, and then fill
   in the port address below.
-  
+
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-aztech.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-aztech.o.
 
-Aztech/Packard Bell radio card i/o port
+Aztech/Packard Bell radio card I/O port
 CONFIG_RADIO_AZTECH_PORT
-  Enter either 0x350 or 0x358 here. The card default is 0x350, if you
-  haven't changed the setting of jumper JP3 on the card. Removing the
+  Enter either 0x350 or 0x358 here.  The card default is 0x350, if you
+  haven't changed the setting of jumper JP3 on the card.  Removing the
   jumper sets the card to 0x358.
 
 ADS Cadet AM/FM Radio Tuner Card
 CONFIG_RADIO_CADET
   Choose Y here if you have one of these AM/FM radio cards, and then
   fill in the port address below.
-  
+
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   Further documentation on this driver can be found on the WWW at
-  http://linux.blackhawke.net/cadet.html . 
+  <http://linux.blackhawke.net/cadet.html>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-cadet.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-cadet.o.
 
 SF16FMI Radio
 CONFIG_RADIO_SF16FMI
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
+  Choose Y here if you have one of these FM radio cards.  If you
+  compile the driver into the kernel and your card is not PnP one, you
+  have to add "sf16fm=<io>" to the kernel command line (I/O address is
+  0x284 or 0x384).
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-sf16fmi.o
-
-SF16FMI I/O port (0x284 or 0x384)
-CONFIG_RADIO_SF16FMI_PORT
-  Enter the I/O port of your SF16FMI radio card.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-sf16fmi.o.
 
-Typhoon Radio
+Typhoon Radio (a.k.a. EcoRadio)
 CONFIG_RADIO_TYPHOON
   Choose Y here if you have one of these FM radio cards, and then fill
   in the port address and the frequency used for muting below.
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-typhoon.o
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-typhoon.o.
 
 Support for /proc/radio-typhoon
 CONFIG_RADIO_TYPHOON_PROC_FS
@@ -18041,88 +21164,132 @@
   in the port address below.
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-zoltrix.o
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-zoltrix.o.
 
 ZOLTRIX I/O port (0x20c or 0x30c)
 CONFIG_RADIO_ZOLTRIX_PORT
   Enter the I/O port of your Zoltrix radio card.
 
-IIC on parallel port
+I2C on parallel port
 CONFIG_I2C_PARPORT
   I2C is a simple serial bus system used in many micro controller
-  applications. Saying Y here will allow you to use your parallel port
-  as an I2C interface.
+  applications.  Saying Y here will allow you to use your parallel
+  port as an I2C interface.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called i2c-parport.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called i2c-parport.o.
 
 miroSOUND PCM20 radio
 CONFIG_RADIO_MIROPCM20
-  Choose Y here if you have this sound card. You also need to say Y
+  Choose Y here if you have this FM radio card. You also need to say Y
   to "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)" (in "Sound")
   for this to work.
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called miropcm20.o
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called miropcm20.o.
 
 miroSOUND PCM20 radio RDS user interface (EXPERIMENTAL)
 CONFIG_RADIO_MIROPCM20_RDS
-  Choose Y here if you want to see RDS/RBDS information like RadioText,
-  Programme Service name, Clock Time and date, Programme TYpe and
-  Traffic Announcement/Programme identification. You also need to say
-  Y to "miroSOUND PCM20 radio" and devfs!
+  Choose Y here if you want to see RDS/RBDS information like
+  RadioText, Programme Service name, Clock Time and date, Programme
+  TYpe and Traffic Announcement/Programme identification.  You also
+  need to say Y to "miroSOUND PCM20 radio" and devfs!
 
   It's not possible to read the raw RDS packets from the device, so
-  the driver cant provide an V4L interface for this. But the
-  availability of RDS is reported over V4L by the basic driver already.
-  Here RDS can be read from files in /dev/v4l/rds.
+  the driver cant provide an V4L interface for this.  But the
+  availability of RDS is reported over V4L by the basic driver
+  already.  Here RDS can be read from files in /dev/v4l/rds.
 
   As module the driver will be called miropcm20-rds.o.
 
-GemTek Radio Card
+Maestro on board radio
+CONFIG_RADIO_MAESTRO
+  Say Y here to directly support the on-board radio tuner on the
+  Maestro 2 or 2E sound card.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-maestro.o.
+
+Guillemot MAXI Radio FM 2000 Radio Card
+CONFIG_RADIO_MAXIRADIO
+  Choose Y here if you have this radio card.  This card may also be
+  found as Gemtek PCI FM.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-maxiradio.o.
+
+GemTek Radio Card support
 CONFIG_RADIO_GEMTEK
-  Choose Y here if you have this FM radio card, and then fill in the 
+  Choose Y here if you have this FM radio card, and then fill in the
   port address below.
 
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-gemtek.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-gemtek.o.
 
-GemTek i/o port
+GemTek I/O port
 CONFIG_RADIO_GEMTEK_PORT
   Enter either 0x20c, 0x30c, 0x24c or 0x34c here. The card default is
   0x34c, if you haven't changed the jumper setting on the card. On
-  Sound Vision 16 Gold PnP with FM Radio (ESS1869+FM Gemtek), the i/o
+  Sound Vision 16 Gold PnP with FM Radio (ESS1869+FM Gemtek), the I/O
   port is 0x28c.
 
+Gemtek PCI Radio
+CONFIG_RADIO_GEMTEK_PCI
+  Choose Y here if you have this PCI FM radio card.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API.  Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-gemtek-pci.o.
+
 PlanB Video-In for PowerMacs
 CONFIG_VIDEO_PLANB
   PlanB is the V4L driver for the PowerMac 7x00/8x00 series video
   input hardware. If you want to experiment with this, say Y.
   Otherwise, or if you don't understand a word, say N.
-  See http://www.cpu.lu/~mlan/planb.html for more info.
+  See <http://www.cpu.lu/~mlan/planb.html> for more info.
 
   Saying M will compile this driver as a module (planb.o).
 
@@ -18131,34 +21298,27 @@
   Choose Y here if you have this FM radio card, and then fill in the
   port address below. (TODO)
 
-  Note: This driver is in its early stages. Right now volume and
+  Note: This driver is in its early stages.  Right now volume and
   frequency control and muting works at least for me, but
-  unfortunately i have not found anybody who wants to use this card
-  with Linux. So if it is this what YOU are trying to do right now,
-  PLEASE DROP ME A NOTE!! Rolf Offermanns (rolf@offermanns.de)
-  
+  unfortunately I have not found anybody who wants to use this card
+  with Linux.  So if it is this what YOU are trying to do right now,
+  PLEASE DROP ME A NOTE!!  Rolf Offermanns (rolf@offermanns.de)
+
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on
+  that are compatible with the Video For Linux API.  Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-terratec.o.
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-terratec.o.
 
-Terratec i/o port (normally 0x590)
+Terratec I/O port (normally 0x590)
 CONFIG_RADIO_TERRATEC_PORT
-  Fill in the i/o port of your TerraTec FM radio card. If unsure, go
+  Fill in the I/O port of your TerraTec FM radio card. If unsure, go
   with the default.
 
-### Add these
-# Zoran ZR36057/36060 support
-# CONFIG_VIDEO_ZORAN
-
-# Include support for Iomega Buz
-# CONFIG_VIDEO_BUZ
-
 Trust FM radio card
 CONFIG_RADIO_TRUST
   This is a driver for the Trust FM radio cards. Say Y if you have
@@ -18167,38 +21327,76 @@
   This driver is also available as a module called radio-trust.o ( =
   code which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-Trust i/o port (usually 0x350 or 0x358)
+Trust I/O port (usually 0x350 or 0x358)
 CONFIG_RADIO_TRUST_PORT
-  Enter the i/o port of your Trust FM radio card. If unsure, try the
+  Enter the I/O port of your Trust FM radio card. If unsure, try the
   values "0x350" or "0x358".
 
 BT848 Video For Linux
 CONFIG_VIDEO_BT848
   Support for BT848 based frame grabber/overlay boards. This includes
   the Miro, Hauppauge and STB boards. Please read the material in
-  Documentation/video4linux/bttv for more information.
+  <file:Documentation/video4linux/bttv> for more information.
 
   If you say Y or M here, you need to say Y or M to "I2C support" and
   "I2C bit-banging interfaces" in the character device section.
-  
+
   This driver is available as a module called bttv.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
+
+BT878 Audio DMA
+CONFIG_SOUND_BT878
+  Audio DMA support for bt878 based grabber boards.  As you might have
+  already noticed, bt878 is listed with two functions in /proc/pci.
+  Function 0 does the video stuff (bt848 compatible), function 1 does
+  the same for audio data.  This is a driver for the audio part of
+  the chip.  If you say 'Y' here you get a oss-compatible dsp device
+  where you can record from.  If you want just watch TV you probably
+  don't need this driver as most TV cards handle sound with a short
+  cable from the TV card to your sound card's line-in.
+
+  This driver is available as a module called btaudio.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+SGI Vino Video For Linux
+CONFIG_VIDEO_VINO
+  Say Y here to build in support for the Vino video input system found
+  on SGI Indy machines.
+
+Stradis 4:2:2 MPEG-2 video driver
+CONFIG_VIDEO_STRADIS
+  Say Y here to enable support for the Stradis 4:2:2 MPEG-2 video
+  driver for PCI.  There is a product page at
+  <http://www.stradis.com/decoder.html>.
+
+Zoran ZR36057/36060 Video For Linux
+CONFIG_VIDEO_ZORAN
+  Say Y here to include support for video cards based on the Zoran
+  ZR36057/36060 encoder/decoder chip (including the Iomega Buz and the
+  Miro DC10 and DC30 video capture cards).
+
+Include support for Iomega Buz
+CONFIG_VIDEO_BUZ
+  Say Y here to include support for the Iomega Buz video card.  There
+  is a Buz/Linux homepage at <http://www.lysator.liu.se/~gz/buz/>.
 
-ZR36120/36125 Video for Linux
+Zoran ZR36120/36125 Video For Linux
 CONFIG_VIDEO_ZR36120
   Support for ZR36120/ZR36125 based frame grabber/overlay boards.
   This includes the Victor II, WaveWatcher, Video Wonder, Maxi-TV,
   and Buster boards. Please read the material in
-  Documentation/video4linux/zr36120.txt for more information.
+  <file:Documentation/video4linux/zr36120.txt> for more information.
 
   This driver is also available as a module called zr36120.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
 SAA5249 Teletext processor
 CONFIG_VIDEO_SAA5249
@@ -18208,26 +21406,37 @@
   This driver is also available as a module called saa5249.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-Quickcam BW Video For Linux
+QuickCam BW Video For Linux
 CONFIG_VIDEO_BWQCAM
   Say Y have if you the black and white version of the QuickCam
-  camera. See the next option for the color version. 
+  camera. See the next option for the color version.
 
   This driver is also available as a module called bw-qcam.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
-  here and read Documentation/modules.txt.
+  here and read <file:Documentation/modules.txt>.
 
-Colour QuickCam Video For Linux
+QuickCam Colour Video For Linux
 CONFIG_VIDEO_CQCAM
   This is the video4linux driver for the colour version of the
-  Connectix Quickcam. If you have one of these cameras, say Y here,
-  otherwise say N. This driver does not work with the original
-  monochrome Quickcam, Quickcam VC or QuickClip. It is also available
-  as a module (c-qcam.o). Read Documentation/video4linux/CQcam.txt for
-  more information.
+  Connectix QuickCam.  If you have one of these cameras, say Y here,
+  otherwise say N.  This driver does not work with the original
+  monochrome QuickCam, QuickCam VC or QuickClip.  It is also available
+  as a module (c-qcam.o).
+  Read <file:Documentation/video4linux/CQcam.txt> for more information.
+
+Winbond W9966CF Webcam Video For Linux
+CONFIG_VIDEO_W9966
+  Video4linux driver for Winbond's w9966 based Webcams.
+  Currently tested with the LifeView FlyCam Supra.
+  If you have one of these cameras, say Y here
+  otherwise say N.
+  This driver is also available as a module (w9966.o).
+
+  Check out <file:Documentation/video4linux/w9966.txt> and
+  <file:Documentation/video4linux/w9966.c> for more information.
 
 CPiA Video For Linux
 CONFIG_VIDEO_CPIA
@@ -18236,10 +21445,10 @@
   Blaster Webcam II. If you have one of these cameras, say Y here
   and select parallel port and/or USB lowlevel support below,
   otherwise say N. This will not work with the Creative Webcam III.
-  
-  Please read Documentation/video4linux/README.cpia for more
+
+  Please read <file:Documentation/video4linux/README.cpia> for more
   information.
-  
+
   This driver is also available as a module (cpia.o).
 
 CPiA Parallel Port Lowlevel Support
@@ -18260,11 +21469,13 @@
 
 Mediavision Pro Movie Studio Video For Linux
 CONFIG_VIDEO_PMS
-  Say Y if you have such a thing. This driver is also available as a
+  Say Y if you have such a thing.  This driver is also available as a
   module called pms.o ( = code which can be inserted in and removed
-  from the running kernel whenever you want). If you want to compile
-  it as a module, say M here and read Documentation/modules.txt.
+  from the running kernel whenever you want).  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
 
+Sony Vaio Picturebook Motion Eye Video for Linux
 CONFIG_VIDEO_MEYE
   This is the video4linux driver for the Motion Eye camera found
   in the Vaio Picturebook laptops. Please read the material in
@@ -18285,20 +21496,20 @@
   s390-compiler released by IBM (based on gcc-2.95.1) before.
 
 Merge some code into the kernel to make the image IPLable
-CONFIG_IPLABLE
+CONFIG_IPL
   If you want to use the produced kernel to IPL directly from a
   device, you have to merge a bootsector specific to the device
   into the first bytes of the kernel. You will have to select the
-  IPL device on another question, that pops up, when you select
-  CONFIG_IPLABE.
+  IPL device.
 
-IPL from a /390 tape unit
+# Choice: s390_ipl
+IPL from a S/390 tape unit
 CONFIG_IPL_TAPE
   Select this option if you want to IPL the image from a Tape.
 
 IPL from a virtual card reader emulated by VM/ESA
 CONFIG_IPL_RDR_VM
-  Select this option if you are running under VM/ESA and want 
+  Select this option if you are running under VM/ESA and want
   to IPL the image from the emulated card reader.
 
 IPL from a real card reader
@@ -18307,7 +21518,7 @@
   card reader. Maybe you still got one and want to try. We didn't
   test.
 
-IBMs S/390 Harddisks (DASDs)
+Support for DASD hard disks
 CONFIG_DASD
   Enable this option if you want to access DASDs directly utilizing
   S/390s channel subsystem commands. This is necessary for running
@@ -18340,6 +21551,163 @@
 CONFIG_DASD_FBA
   FBA devices are currently unsupported.
 
+Merge some code into the kernel to make the image IPLable
+CONFIG_IPLABLE
+  If you want to use the produced kernel to IPL directly from a
+  device, you have to merge a bootsector specific to the device
+  into the first bytes of the kernel. You will have to select the
+  IPL device on another question, that pops up, when you select
+  CONFIG_IPLABE.
+
+Support for 3215 line mode terminal
+CONFIG_3215
+  Include support for IBM 3215 line-mode terminals.  Can't be used
+  if 3270 console support is chosen.
+
+Support for console on 3215 line mode terminal
+CONFIG_3215_CONSOLE
+  Include support for using an IBM 3215 line-mode terminal as the
+  Linux system console.  Can't be used if 3270 console support is
+  chosen.
+
+Support for 3270 line mode terminal
+CONFIG_3270
+  Include support for IBM 3270 line-mode terminals.
+
+Support for console on 3270 line mode terminal
+CONFIG_3270_CONSOLE
+  Include support for using an IBM 3270 line-mode terminal as the
+  Linux system console.  Excludes using 3215s.  Available only if 3270
+  support is compiled in statically.
+
+Support for HWC line mode terminal
+CONFIG_HWC
+  Include support for IBM HWC line-mode terminals.
+
+Console on HWC line mode terminal
+CONFIG_HWC_CONSOLE
+  Include support for using an IBM HWC line-mode terminal as the Linux
+  system console.
+
+S/390 tape device support
+CONFIG_S390_TAPE
+  Select this option if you want to access channel-attached tape
+  devices on IBM S/390 or zSeries.
+  If you select this option you will also want to select at
+  least one of the tape interface options and one of the tape
+  hardware options in order to access a tape device.
+  This option is also available as a module. The module will be
+  called tape390.o and include all selected interfaces and
+  hardware drivers.
+
+Support for tape character devices
+CONFIG_S390_TAPE_CHAR
+  Select this option if you want to access your channel-attached
+  tape devices using the character device interface.
+  This interface is similar to other Linux tape devices like
+  SCSI-Tapes (st) and the floppy tape device (ftape).
+  If unsure, say "Y".
+
+Support for tape block devices
+CONFIG_S390_TAPE_BLOCK
+  Select this option if you want to access your channel-attached tape
+  devices using the block device interface.  This interface is similar
+  to CD-ROM devices on other platforms.  The tapes can only be
+  accessed read-only when using this interface.  Have a look at
+  Documentation/s390/TAPE for further information about creating
+  volumes for and using this interface.  It is safe to say "Y" here.
+
+Support for 3490 tape hardware
+CONFIG_S390_TAPE_3490
+  Select this option if you want to access IBM 3480 magnetic
+  tape subsystems and 100% compatibles.
+  It is safe to say "Y" here.
+
+Support for 3480 tape hardware
+CONFIG_S390_TAPE_3480
+  Select this option if you want to access IBM 3490 magnetic
+  tape subsystems and 100% compatibles.
+
+CTC device support
+CONFIG_CTC
+  Select this option if you want to use channel-to-channel networking
+  on IBM S/390 or zSeries. This device driver supports real CTC
+  coupling using ESCON. It also supports virtual CTCs when running
+  under VM. It will use the channel device configuration if this is
+  available.  This option is also available as a module which will be
+  called ctc.o.  If you do not know what it is, it's safe to say "Y".
+
+Support for DIAG access to CMS reserved Disks
+CONFIG_DASD_DIAG
+  Select this option if you want to use CMS reserved Disks under VM
+  with the Diagnose250 command.  If you are not running under VM or
+  unsure what it is, say "N".
+
+XPRAM disk support
+CONFIG_BLK_DEV_XPRAM
+  Select this option if you want to use your expanded storage on S/390
+  or zSeries as a disk.  This is useful as a _fast_ swap device if you
+  want to access more than 2G of memory when running in 31 bit mode.
+  This option is also available as a module which will be called
+  xpram.o.  If unsure, say "N".
+
+Fast IRQ handling
+CONFIG_FAST_IRQ
+  Select this option in order to get the interrupts processed faster
+  on your S/390 or zSeries machine.  If selected, after an interrupt
+  is processed, the channel subsystem will be asked for other pending
+  interrupts which will also be processed before leaving the interrupt
+  context.  This speeds up the I/O a lot. Say "Y".
+
+IUCV device support (VM only)
+CONFIG_IUCV
+  Select this option if you want to use inter-user communication
+  vehicle networking under VM or VIF.  This option is also available
+  as a module which will be called iucv.o. If unsure, say "Y".
+
+Kernel support for 31 bit ELF binaries
+CONFIG_S390_SUPPORT
+  Select this option if you want to enable your system kernel to
+  handle system-calls from ELF binaries for 31 bit ESA.  This option
+  (and some other stuff like libraries and such) is needed for
+  executing 31 bit applications.  It is safe to say "Y".
+
+Channel Device Configuration
+CONFIG_CHANDEV
+  The channel device layer is a layer to provide a consistent
+  interface for configuration & default machine check (devices
+  appearing & disappearing) handling on Linux for s/390 & z/Series
+  channel devices.
+
+  s/390 & z/Series channel devices include among others
+
+  lcs (the most common ethernet/token ring/fddi standard on
+  zSeries)
+  ctc/escon hi speed like serial link standard on zSeries
+  claw used to talk to cisco routers.
+  qeth gigabit ethernet.
+
+  These devices use two channels one read & one write for
+  configuration & communication (& a third channel, the data
+  channel the case of gigabit ethernet). The motivation
+  behind developing this layer was that there was a lot of
+  duplicate code among the channel device drivers for
+  configuration.
+
+  Also the lcs & ctc drivers tended to fight over
+  3088/08's & 3088/1F's which could be either 2216/3172
+  channel attached lcs compatible devices or escon/ctc pipes
+  had to be configured separately as they couldn't autodetect,
+  this is now simplified by doing the configuration in a single
+  place (the channel device layer).
+
+  This layer isn't invasive & it is quite okay to use channel
+  drivers which don't use the channel device layer in
+  conjunction with drivers which do.
+
+  For more info see the chandev manpage usually distributed in
+  <file:Documentation/s390/chandev.8> in the Linux source tree.
+
 SAB3036 tuner support
 CONFIG_TUNER_3036
   Say Y here to include support for Philips SAB3036 compatible tuners.
@@ -18347,15 +21715,24 @@
 
 Compaq SMART2 support
 CONFIG_BLK_CPQ_DA
-   This is the driver for Compaq Smart Array controllers.  
-   Everyone using these boards should say Y here.  
-   See the file Documentation/cpqarray.txt for the current list of 
-   boards supported by this driver, and for further information 
-   on the use of this driver. 
+  This is the driver for Compaq Smart Array controllers.  Everyone
+  using these boards should say Y here.  See the file
+  <file:Documentation/cpqarray.txt> for the current list of boards
+  supported by this driver, and for further information on the use of
+  this driver.
+
+Show crashed user process info
+CONFIG_PROCESS_DEBUG
+  Say Y to print all process fault locations to the console.  This is
+  a debugging option; you probably do not want to set it unless you
+  are an S390 port maintainer.
 
 #
 # ARM options
 #
+# CML2 transition note: CML1 asks ARCH_ARCA5K, then has ARCH_A5K and ARCH_ARK
+# as subquestions.  CML2 asks the subquestions in the armtype menu and makes
+# ARCH_ARCA5K a derived symbol.
 ARM System type
 CONFIG_ARCH_ARCA5K
   This selects what ARM system you wish to build the kernel for. It
@@ -18363,110 +21740,224 @@
   to set this option to, please consult any information supplied with
   your system.
 
+# Choice: armtype
+A5000
+CONFIG_ARCH_A5K
+  Say Y here to to support the Acorn A5000.  Linux can support the
+  internal IDE disk and CD-ROM interface, serial and parallel port,
+  and the floppy drive.  Note that on some A5000s the floppy is
+  plugged into the wrong socket on the motherboard.
+
+Archimedes
+CONFIG_ARCH_ARC
+  The Acorn Archimedes was an personal computer based on an 8K ARM2
+  processor, released in 1987.  It supported 512K of RAM and 2 800K
+  floppy disks.  Picture and more detailed specifications at
+  <http://www.computingmuseum.com/museum/archi.htm>.
+
+EBSA-110
+CONFIG_ARCH_EBSA110
+  This is an evaluation board for the StrongARM processor available
+  from Digital. It has limited hardware on-board, including an onboard
+  Ethernet interface, two PCMCIA sockets, two serial ports and a
+  parallel port.
+
+RiscPC
+CONFIG_ARCH_RPC
+  On the Acorn Risc-PC, Linux can support the internal IDE disk and
+  CD-ROM interface, serial and parallel port, and the floppy drive.
+
 2MB physical memory
 CONFIG_PAGESIZE_16
   Say Y here if your Archimedes or A5000 system has only 2MB of
   memory, otherwise say N.  The resulting kernel will not run on a
   machine with 4MB of memory.
 
-Include support for the CATS
+CATS
 CONFIG_ARCH_CATS
   Say Y here if you intend to run this kernel on the CATS.
 
   Saying N will reduce the size of the Footbridge kernel.
 
-Include support for the EBSA285
+EBSA285 (addin mode)
+CONFIG_ARCH_EBSA285_ADDIN
+  Say Y here if you intend to run this kernel on the EBSA285 card
+  in addin mode.
+
+  Saying N will reduce the size of the Footbridge kernel.
+
+EBSA285 (host mode)
 CONFIG_ARCH_EBSA285_HOST
   Say Y here if you intend to run this kernel on the EBSA285 card
   in host ("central function") mode.
 
   Saying N will reduce the size of the Footbridge kernel.
 
-Include support for the LinkUp Systems L7200 SDB
+LinkUp Systems L7200 SDB
 CONFIG_ARCH_L7200
   Say Y here if you intend to run this kernel on a LinkUp Systems
   L7200 Software Development Board which uses an ARM720T processor.
   Information on this board can be obtained at:
 
-  http://www.linkupsys.com/
+  <http://www.linkupsys.com/>
 
   If you have any questions or comments about the Linux kernel port
-  to this board, send e-mail to sjhill@cotw.com
+  to this board, send e-mail to sjhill@cotw.com.
 
-Include support for the NetWinder
+NetWinder
 CONFIG_ARCH_NETWINDER
   Say Y here if you intend to run this kernel on the Rebel.COM
   NetWinder.  Information about this machine can be found at:
 
-  http://www.netwinder.org/
+  <http://www.netwinder.org/>
 
   Saying N will reduce the size of the Footbridge kernel.
 
-Include support for the Compaq Personal Server
+P720T
+CONFIG_ARCH_P720T
+  Say Y here if you intend to run this kernel on the ARM Prospector
+  720T.
+
+Compaq Personal Server
 CONFIG_ARCH_PERSONAL_SERVER
   Say Y here if you intend to run this kernel on the Compaq
   Personal Server.
-  
+
   Saying N will reduce the size of the Footbridge kernel.
 
-  The Compaq Personal Server is not available for purchase. 
+  The Compaq Personal Server is not available for purchase.
   There are no product plans beyond the current research
   prototypes at this time.  Information is available at:
-  
-  http://crl.research.compaq.com/projects/personalserver
-  
+
+  <http://crl.research.compaq.com/projects/personalserver>
+
   If you have any questions or comments about the  Compaq Personal
-  Server, send e-mail to skiff@crl.dec.com
+  Server, send e-mail to skiff@crl.dec.com.
 
-Include support for Assabet
+Assabet
 CONFIG_SA1100_ASSABET
   Say Y here if you are using the Intel(R) StrongARM(R) SA-1110
   Microprocessor Development Board (also known as the Assabet).
 
-Include support for Neponset
+Neponset
 CONFIG_ASSABET_NEPONSET
   Say Y here if you are using the Intel(R) StrongARM(R) SA-1110
   Microprocessor Development Board (Assabet)  with the SA-1111
   Development Board (Nepon).
 
-Include support for the Compaq iPAQ H3600 (Bitsy)
-CONFIG_SA1100_BITSY
-  Say Y here if you intend to run this kernel on the Compaq iPAQ 
+Compaq iPAQ H3600
+CONFIG_SA1100_H3600
+  Say Y here if you intend to run this kernel on the Compaq iPAQ
   H3600 handheld computer.  Information about this machine and the
   Linux port to this machine can be found at:
 
-  http://www.handhelds.org/Compaq/index.html#iPAQ_H3600
-  http://www.compaq.com/products/handhelds/pocketpc/
+  <http://www.handhelds.org/Compaq/index.html#iPAQ_H3600>
+  <http://www.compaq.com/products/handhelds/pocketpc/>
 
-Include support for Brutus
+Brutus
 CONFIG_SA1100_BRUTUS
   Say Y here if you are using the Intel(R) StrongARM(R) SA-1100
   Microprocessor Development Board (also known as the Brutus).
 
-Include support for LART
+LART
 CONFIG_SA1100_LART
   Say Y here if you are using the Linux Advanced Radio Terminal
-  (also known as the LART).  See http://www.lart.tudelft.nl/ for
+  (also known as the LART).  See <http://www.lart.tudelft.nl/> for
   information on the LART.
 
-Include support for GraphicsClient
+GraphicsClient
 CONFIG_SA1100_GRAPHICSCLIENT
   Say Y here if you are using an Applied Data Systems Intel(R)
   StrongARM(R) SA-1100 based Graphics Client SBC.  See
-  http://www.flatpanels.com/ for information on this system.
+  <http://www.flatpanels.com/> for information on this system.
+
+CerfBoard
+CONFIG_SA1100_CERF
+  The Intrinsyc CerfBoard is based on the StrongARM 1110.
+  More information is available at:
+  <http://www.intrinsyc.com/products/referenceplatforms/cerfboard.html>.
+
+  Say Y if configuring for an Intrinsyc CerfBoard.
+  Say N otherwise.
+
+nanoEngine
+CONFIG_SA1100_NANOENGINE
+  The nanoEngine is a StrongARM 1110-based single board computer
+  from Bright Star Engineering. More information is available at:
+  <http://www.brightstareng.com/arm/nanoeng.htm>.
+
+  Say Y if configuring for a nanoEngine.
+  Say N otherwise.
+
+Pangolin
+CONFIG_SA1100_PANGOLIN
+  Pangolin is a StrongARM 1110-based evaluation platform produced
+  by Dialogue Technology.  It has EISA slots for ease of configuration
+  with SDRAM/Flash memory card, USB/Serial/Audio card, Compact Flash
+  card, and TFT-LCD card.
+
+  Say Y if configuring for a Pangolin.
+  Say N otherwise.
 
-Include support for Victor
+Victor
 CONFIG_SA1100_VICTOR
   Say Y here if you are using a Visu Aide Intel(R) StrongARM(R)
   SA-1100 based Victor Digital Talking Book Reader.  See
-  http://www.visuaide.com/pagevictor.en.html for information on
+  <http://www.visuaide.com/pagevictor.en.html> for information on
   this system.
 
-Load kernel using Angel Debug Monitor
-CONFIG_ANGELBOOT
-  Say Y if you plan to load the kernel using Angel, ARM Ltd's target
-  debug stub.  If you are not using Angel, you must say N.  It is
-  important to get this setting correct.
+Support ARM610 processor
+CONFIG_CPU_ARM610
+  The ARM610 is the successor to the ARM3 processor
+  and was produced by VLSI Technology Inc.
+
+  Say Y if you want support for the ARM610 processor.
+  Otherwise, say N.
+
+Support ARM710 processor
+CONFIG_CPU_ARM710
+  A 32-bit RISC microprocessor based on the ARM7 processor core
+  designed by Advanced RISC Machines Ltd. The ARM710 is the
+  successor to the ARM610 processor. It was released in
+  July 1994 by VLSI Technology Inc.
+
+  Say Y if you want support for the ARM710 processor.
+  Otherwise, say N.
+
+Support ARM720T processor
+CONFIG_CPU_ARM720T
+  A 32-bit RISC processor with 8kByte Cache, Write Buffer and
+  MMU built around an ARM7TDMI core.
+
+  Say Y if you want support for the ARM720T processor.
+  Otherwise, say N.
+
+Support ARM920T processor
+CONFIG_CPU_ARM920T
+  The ARM920T is licensed to be produced by numerous vendors,
+  and is used in the Maverick EP9312.  More information at
+  <http://linuxdevices.com/products/PD2382866068.html>.
+
+  Say Y if you want support for the ARM920T processor.
+  Otherwise, say N.
+
+Support ARM1020 processor
+CONFIG_CPU_ARM1020
+  The ARM1020 is the cached version of the ARM10 processor,
+  with an addition of a floating-point unit.
+
+  Say Y if you want support for the ARM1020 processor.
+  Otherwise, say N.
+
+Support StrongARM SA-110 processor
+CONFIG_CPU_SA110
+  The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and
+  is available at five speeds ranging from 100 MHz to 233 MHz.
+  More information is available at
+  <http://developer.intel.com/design/strong/sa110.htm>.
+
+  Say Y if you want support for the SA-110 processor.
+  Otherwise, say N.
 
 Math emulation
 CONFIG_FPE_NWFPE
@@ -18483,24 +21974,26 @@
   You may say N here if you are going to load the Acorn FPEmulator
   early in the bootup.
 
+FastFPE math emulation
 CONFIG_FPE_FASTFPE
   Say Y here to include the FAST floating point emulator in the kernel.
   This is an experimental much faster emulator which has only 32 bit
-  precision for the mantissa. It does not support any exceptions. This
-  makes it very simple, it is approximately 4-8 times faster than NWFPE.
-
-  It should be sufficient for most programs. It is definitely not
-  suitable if you do scientific calculations that need double precision
-  for iteration formulas that sum up lots of very small numbers. If you
-  do not feel you need a faster FP emulation you should better choose
+  precision for the mantissa.  It does not support any exceptions.
+  This makes it very simple, it is approximately 4-8 times faster than
   NWFPE.
 
+  It should be sufficient for most programs.  It is definitely not
+  suitable if you do scientific calculations that need double
+  precision for iteration formulas that sum up lots of very small
+  numbers.  If you do not feel you need a faster FP emulation you
+  should better choose NWFPE.
+
   It is also possible to say M to build the emulator as a module
-  (fastfpe.o). But keep in mind that you should only load the FP emulator
-  early in the bootup. You should never change from NWFPE to FASTFPE or
-  vice versa in an active system!
+  (fastfpe.o).  But keep in mind that you should only load the FP
+  emulator early in the bootup.  You should never change from NWFPE to
+  FASTFPE or vice versa in an active system!
 
-DS1620 Thermometer support
+DS1620 thermometer support
 CONFIG_DS1620
   Say Y here to include support for the thermal management hardware
   found in the NetWinder. This driver allows the user to control the
@@ -18531,7 +22024,7 @@
   information that is reported is severely limited. Most people
   should say N here.
 
-User fault debugging
+Verbose user fault messages
 CONFIG_DEBUG_USER
   When a user program crashes due to an exception, the kernel can
   print a brief message explaining what the problem was. This is
@@ -18555,22 +22048,18 @@
 
 Kernel low-level debugging messages via footbridge serial port
 CONFIG_DEBUG_DC21285_PORT
-  Say Y here if you want the low-level print routines to direct their
-  output to the serial port in the DC21285 (Footbridge).
+  Say Y here if you want the debug print routines to direct their
+  output to the serial port in the DC21285 (Footbridge). Saying N
+  will cause the debug messages to appear on the first 16550
+  serial port.
+
+Kernel low-level debugging messages via UART2
+CONFIG_DEBUG_CLPS711X_UART2
+  Say Y here if you want the debug print routines to direct their
+  output to the second serial port on these devices.  Saying N will
+  cause the debug messages to appear on the first serial port.
 
-Split initialisation functions into discardable section
-CONFIG_TEXT_SECTIONS
-  If you say Y here, kernel code that is only used during
-  initialisation is collected into a special area of the kernel so
-  that it can be discarded and the memory reclaimed when
-  initialisation is complete. In addition, if the kernel you wish to
-  build is able to run on multiple architectures, it allows the unused
-  code to be discarded. Some versions of binutils, however, have a bug
-  that causes the kernel to crash during startup when this option is
-  enabled. Say Y unless you experience problems that you suspect may
-  be caused by this.
-
-Disable pgtable cache (EXPERIMENTAL)
+Disable pgtable cache
 CONFIG_NO_PGT_CACHE
   Normally the kernel maintains a `quicklist' of preallocated
   pagetable structures in order to increase performance. On machines
@@ -18580,7 +22069,7 @@
 RISC OS personality
 CONFIG_ARTHUR
   Say Y here to include the kernel code necessary if you want to run
-  Acorn RISC OS/Arthur binaries under Linux. This code is still very 
+  Acorn RISC OS/Arthur binaries under Linux. This code is still very
   experimental; if this sounds frightening, say N and sleep in peace.
   You can also say M here to compile this support as a module (which
   will be called arthur.o).
@@ -18591,9 +22080,9 @@
   for the boot loader to pass arguments to the kernel. For these
   architectures, you should supply some command-line options at build
   time by entering them here. As a minimum, you should specify the
-  memory size and the root device (e.g., mem=64M root=/dev/nfs)
+  memory size and the root device (e.g., mem=64M root=/dev/nfs).
 
-Hardware alignment trap (EXPERIMENTAL)
+Kernel-mode alignment trap handler
 CONFIG_ALIGNMENT_TRAP
   ARM processors can not fetch/store information which is not
   naturally aligned on the bus, i.e., a 4 byte fetch must start at an
@@ -18603,57 +22092,82 @@
   correct operation of some network protocols. With an IP-only
   configuration it is safe to say N, otherwise say Y.
 
-21285 serial port support
+DC21285 serial port support
 CONFIG_SERIAL_21285
   If you have a machine based on a 21285 (Footbridge) StrongARM(R)/
   PCI bridge you can enable its onboard serial port by enabling this
   option. The device has major ID 4, minor 64.
 
-Console on 21285 serial port
+Console on DC21285 serial port
 CONFIG_SERIAL_21285_CONSOLE
   If you have enabled the serial port on the 21285 footbridge you can
   make it the console by answering Y to this option.
 
 SA1100 serial port support
 CONFIG_SERIAL_SA1100
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   If you have a machine based on a SA1100/SA1110 StrongARM CPU you can
   enable its onboard serial port by enabling this option.
-  Please read Documentation/arm/SA1100/serial_UART for further info.
+  Please read <file:Documentation/arm/SA1100/serial_UART> for further
+  info.
 
 Console on SA1100 serial port
 CONFIG_SERIAL_SA1100_CONSOLE
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   If you have enabled the serial port on the SA1100/SA1110 StrongARM
   CPU you can make it the console by answering Y to this option.
 
 L7200 serial port support
 CONFIG_SERIAL_L7200
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   If you have a LinkUp Systems L7200 board you can enable its two
   onboard serial ports by enabling this option. The device numbers
   are major ID 4 with minor 64 and 65 respectively.
 
 Console on L7200 serial port
 CONFIG_SERIAL_L7200_CONSOLE
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   If you have enabled the serial ports on the L7200 development board
   you can make the first serial port the console by answering Y to
   this option.
 
 L7200 SDB keyboard support
 CONFIG_KEYBOARD_L7200
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   Enable this option if you would like to be able to use a keyboard
   on a LinkUp Systems L7200 board.
 
 L7200 SDB Fujitsu keyboard support
 CONFIG_KEYBOARD_L7200_NORM
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   Select the Fujitsu keyboard if you want a normal QWERTY style
   keyboard on the LinkUp SDB.
 
 L7200 SDB Prototype keyboard support
 CONFIG_KEYBOARD_L7200_DEMO
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   Select the prototype keyboard if you want to play with the
   LCD/keyboard combination on the LinkUp SDB.
 
 Footbridge Mode
 CONFIG_HOST_FOOTBRIDGE
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
   The 21285 Footbridge chip can operate in either `host mode' or
   `add-in' mode.  Say Y if your 21285 is in host mode, and therefore
   is the configuration master, otherwise say N. This must not be
@@ -18691,7 +22205,7 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called nwflash.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  module, say M here and read <file:Documentation/modules.txt>.
 
   If you're not sure, say N.
 
@@ -18704,22 +22218,22 @@
 
   This driver is also available as a module and will be called
   srm_env.o if you build it as a module.
-  
+
 Footbridge internal watchdog
 CONFIG_21285_WATCHDOG
-  The Intel Footbridge chip contains a builtin watchdog circuit. Say Y 
+  The Intel Footbridge chip contains a builtin watchdog circuit. Say Y
   here if you wish to use this. Alternatively say M to compile the
   driver as a module, which will be called wdt285.o.
 
-  This driver does not work on all machines. In particular, early CATS 
-  boards have hardware problems that will cause the machine to simply 
+  This driver does not work on all machines. In particular, early CATS
+  boards have hardware problems that will cause the machine to simply
   lock up if the watchdog fires.
 
   "If in doubt, leave it out" - say N.
 
-NetWinder WB977 watchdog
+NetWinder WB83C977 watchdog
 CONFIG_977_WATCHDOG
-  Say Y here to include support for the WB977 watchdog included in 
+  Say Y here to include support for the WB977 watchdog included in
   NetWinder machines. Alternatively say M to compile the driver as
   a module, which will be called wdt977.o.
 
@@ -18732,27 +22246,41 @@
   infrared communication and is supported by most laptops and PDA's.
 
   To use Linux support for the IrDA (tm) protocols, you will also need
-  some user-space utilities like irattach. For more information, see the file
-  Documentation/networking/irda.txt. You also want to read the
-  IR-HOWTO, available at http://www.linuxdoc.org/docs.html#howto .
+  some user-space utilities like irattach.  For more information, see
+  the file <file:Documentation/networking/irda.txt>.  You also want to
+  read the IR-HOWTO, available at
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+  If you want to exchange bits of data (vCal, vCard) with a PDA, you
+  will need to install some OBEX application, such as OpenObex :
+  <http://sourceforge.net/projects/openobex/>
 
-  This support is also available as a module called irda.o. If you
+  This support is also available as a module called irda.o.  If you
   want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  <file:Documentation/modules.txt>.
+
+Ultra (connectionless) protocol
+CONFIG_IRDA_ULTRA
+  Say Y here to support the connectionless Ultra IRDA protocol.
+  Ultra allows to exchange data over IrDA with really simple devices
+  (watch, beacon) without the overhead of the IrDA protocol (no handshaking,
+  no management frames, simple fixed header).
+  Ultra is available as a special socket : socket(AF_IRDA, SOCK_DGRAM, 1);
 
 IrDA protocol options
 CONFIG_IRDA_OPTIONS
-  Say Y here if you want to configure any of the following IrDA options.
+  Say Y here if you want to configure any of the following IrDA
+  options.
 
-IrDA Cache last LSAP
+IrDA cache last LSAP
 CONFIG_IRDA_CACHE_LAST_LSAP
-  Say Y here if you want IrLMP to cache the last LSAP used. This makes
-  sense since most frames will be sent/received on the same
-  connection. Enabling this option will save a hash-lookup per frame.
+  Say Y here if you want IrLMP to cache the last LSAP used.  This
+  makes sense since most frames will be sent/received on the same
+  connection.  Enabling this option will save a hash-lookup per frame.
 
   If unsure, say Y.
 
-IrDA Fast RR's
+IrDA Fast RRs
 CONFIG_IRDA_FAST_RR
   Say Y here is you want IrLAP to send fast RR (Receive Ready) frames
   when acting as a primary station. This will make IrLAP send out a RR
@@ -18768,129 +22296,165 @@
 
   If unsure, say N.
 
-IrDA Debug
+IrDA debugging information
 CONFIG_IRDA_DEBUG
   Say Y here if you want the IrDA subsystem to write debug information
   to your syslog. You can change the debug level in
-  /proc/sys/net/irda/debug
+  /proc/sys/net/irda/debug .
 
   If unsure, say Y (since it makes it easier to find the bugs).
 
-IrLAP Compression support
+IrLAP compression support
 CONFIG_IRDA_COMPRESSION
   Compression is _not_ part of the IrDA(tm) protocol specification,
   but it's working great! Linux is the first to try out compression
   support at the IrLAP layer. This means that you will only benefit
   from compression if you are running a Linux <-> Linux configuration.
-  
+
   If you say Y here, you also need to say Y or M to a compression
   protocol below.
 
-IrLAP Deflate Compression Protocol (EXPERIMENTAL)
+IrLAP Deflate compression
 CONFIG_IRDA_DEFLATE
   Say Y here if you want to build support for the Deflate compression
   protocol. The deflate compression (GZIP) is exactly
-  the same as the one used by the PPP protocol. 
+  the same as the one used by the PPP protocol.
 
   If you want to compile this compression support as a module, say M
-  here and read Documentation/modules.txt. The module will be called
-  irda_deflate.o.
+  here and read <file:Documentation/modules.txt>.  The module will be
+  called irda_deflate.o.
 
-IrLAN Protocol 
+IrLAN protocol
 CONFIG_IRLAN
-  Say Y here if you want to build support for the IrLAN protocol. If
+  Say Y here if you want to build support for the IrLAN protocol.  If
   you want to compile it as a module (irlan.o), say M here and read
-  Documentation/modules.txt. IrLAN emulates an Ethernet and makes it
-  possible to put up a wireless LAN using infrared beams.
+  <file:Documentation/modules.txt>.  IrLAN emulates an Ethernet and
+  makes it possible to put up a wireless LAN using infrared beams.
 
-  The IrLAN protocol can be used to talk with infrared access points 
-  like the HP NetbeamIR, or the ESI JetEye NET. You can also connect 
-  to another Linux machine running the IrLAN protocol for ad-hoc 
+  The IrLAN protocol can be used to talk with infrared access points
+  like the HP NetbeamIR, or the ESI JetEye NET.  You can also connect
+  to another Linux machine running the IrLAN protocol for ad-hoc
   networking!
 
-IrNET Protocol 
+IrNET protocol
 CONFIG_IRNET
-  Say Y here if you want to build support for the IrNET protocol. If
+  Say Y here if you want to build support for the IrNET protocol.  If
   you want to compile it as a module (irnet.o), say M here and read
-  Documentation/modules.txt. IrNET is a PPP driver, so you will also
-  need a working PPP subsystem (driver, daemon and config)...
+  <file:Documentation/modules.txt>.  IrNET is a PPP driver, so you
+  will also need a working PPP subsystem (driver, daemon and
+  config)...
 
-  IrNET is an alternate way to tranfer TCP/IP traffic over IrDA. It
-  uses synchronous PPP over a set of point to point IrDA sockets. You
+  IrNET is an alternate way to tranfer TCP/IP traffic over IrDA.  It
+  uses synchronous PPP over a set of point to point IrDA sockets.  You
   can use it between Linux machine or with W2k.
 
-IrCOMM Protocol
+IrCOMM protocol
 CONFIG_IRCOMM
-  Say Y here if you want to build support for the IrCOMM protocol. If
+  Say Y here if you want to build support for the IrCOMM protocol.  If
   you want to compile it as a module (you will get ircomm.o and
-  ircomm-tty.o), say M here and read Documentation/modules.txt. IrCOMM
-  implements serial port emulation, and makes it possible to use all
-  existing applications that understands TTY's with an infrared link.
-  Thus you should be able to use application like PPP, minicom and
-  others. Enabling this option will create two modules called ircomm
-  and ircomm_tty.
+  ircomm-tty.o), say M here and read <file:Documentation/modules.txt>.
+  IrCOMM implements serial port emulation, and makes it possible to
+  use all existing applications that understands TTY's with an
+  infrared link.  Thus you should be able to use application like PPP,
+  minicom and others.  Enabling this option will create two modules
+  called ircomm and ircomm_tty.
 
 IrTTY IrDA Device Driver
 CONFIG_IRTTY_SIR
   Say Y here if you want to build support for the IrTTY line
-  discipline. If you want to compile it as a module (irtty.o), say M
-  here and read Documentation/modules.txt. IrTTY makes it possible to
-  use Linux's own serial driver for all IrDA ports that are 16550
-  compatible. Most IrDA chips are 16550 compatible so you should
-  probably say Y to this option. Using IrTTY will however limit the
-  speed of the connection to 115200 bps (IrDA SIR mode)
+  discipline.  If you want to compile it as a module (irtty.o), say M
+  here and read <file:Documentation/modules.txt>.  IrTTY makes it
+  possible to use Linux's own serial driver for all IrDA ports that
+  are 16550 compatible.  Most IrDA chips are 16550 compatible so you
+  should probably say Y to this option.  Using IrTTY will however
+  limit the speed of the connection to 115200 bps (IrDA SIR mode).
 
   If unsure, say Y.
 
-IrPORT IrDA Device Driver
+IrPORT IrDA serial driver
 CONFIG_IRPORT_SIR
   Say Y here if you want to build support for the IrPORT IrDA device
   driver. If you want to compile it as a module (irport.o), say M here
-  and read Documentation/modules.txt. IrPORT can be used instead of
-  IrTTY and sometimes this can be better. One example is if your IrDA
-  port does not have echo-canceling, which will work OK with IrPORT
-  since this driver is working in half-duplex mode only. You don't
-  need to use irattach with IrPORT, but you just insert it the same
-  way as FIR drivers (insmod irport io=0x3e8 irq=11). Notice that
-  IrPORT is a SIR device driver which means that speed is limited to
-  115200 bps.
+  and read <file:Documentation/modules.txt>.  IrPORT can be used
+  instead of IrTTY and sometimes this can be better.  One example is
+  if your IrDA port does not have echo-canceling, which will work OK
+  with IrPORT since this driver is working in half-duplex mode only.
+  You don't need to use irattach with IrPORT, but you just insert it
+  the same way as FIR drivers (insmod irport io=0x3e8 irq=11).  Notice
+  that IrPORT is a SIR device driver which means that speed is limited
+  to 115200 bps.
 
   If unsure, say Y.
 
+USB IrDA FIR dongle Device Driver
+CONFIG_USB_IRDA
+  Say Y here if you want to build support for the USB IrDA FIR Dongle
+  device driver.  If you want to compile it as a module (irda-usb.o),
+  say M here and read <file:Documentation/modules.txt>.  IrDA-USB
+  support the various IrDA USB dongles available and most of their
+  pecularities.  Those dongles plug in the USB port of your computer,
+  are plug and play, and support SIR and FIR (4Mbps) speeds.  On the
+  other hand, those dongles tend to be less efficient than a FIR
+  chipset.
+
+  Please note that the driver is still experimental.  And of course,
+  you will need both USB and IrDA support in your kernel...
+
 Winbond W83977AF IrDA Device Driver
 CONFIG_WINBOND_FIR
   Say Y here if you want to build IrDA support for the Winbond
-  W83977AF super-io chipset. This driver should be used for the IrDA
-  chipset in the Corel NetWinder. The driver supports SIR, MIR and FIR
-  (4Mbps) speeds.
+  W83977AF super-io chipset.  This driver should be used for the IrDA
+  chipset in the Corel NetWinder.  The driver supports SIR, MIR and
+  FIR (4Mbps) speeds.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The module will be called w83977af_ir.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  w83977af_ir.o.
 
-NSC PC87108 IrDA Device Driver
+NSC PC87108/PC87338 IrDA Device Driver
 CONFIG_NSC_FIR
   Say Y here if you want to build support for the NSC PC87108 and
-  PC87338 IrDA chipsets. This driver supports SIR, 
-  MIR and FIR (4Mbps) speeds. 
+  PC87338 IrDA chipsets.  This driver supports SIR,
+  MIR and FIR (4Mbps) speeds.
 
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The module will be called nsc-ircc.o.
+  <file:Documentation/modules.txt>.  The module will be called
+  nsc-ircc.o.
 
-Toshiba Type-O IR Port Device Driver
+National Semiconductor DP83820 series driver
+CONFIG_NS83820
+  This is a driver for the National Semiconductor DP83820 series
+  of gigabit ethernet MACs.  Cards using this chipset include
+  the D-Link DGE-500T, PureData's PDP8023Z-TG, SMC's SMC9462TX,
+  SOHO-GA2000T, SOHO-GA2500T.  The driver supports the use of
+  zero copy.
+
+Toshiba Type-O IR Port device driver
 CONFIG_TOSHIBA_FIR
   Say Y here if you want to build support for the Toshiba Type-O IR
-  chipset. This chipset is used by the Toshiba Libretto 100CT, and
-  many more laptops. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. The module will be called
-  toshoboe.o.
+  chipset.  This chipset is used by the Toshiba Libretto 100CT, and
+  many more laptops.  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.  The module will be
+  called toshoboe.o.
 
-SMC IrCC (Experimental)
+SMC IrCC
 CONFIG_SMC_IRCC_FIR
   Say Y here if you want to build support for the SMC Infrared
-  Communications Controller. It is used in the Fujitsu Lifebook 635t
-  and Sony PCG-505TX. If you want to compile it as a module, say M
-  here and read Documentation/modules.txt. The module will be called
-  smc-ircc.o.
+  Communications Controller.  It is used in the Fujitsu Lifebook 635t
+  and Sony PCG-505TX.  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.  The module will be
+  called smc-ircc.o.
+
+ALi M5123 FIR Controller Driver
+CONFIG_ALI_FIR
+  Say Y here if you want to build support for the ALi M5123 FIR
+  Controller.  The ALi M5123 FIR Controller is embedded in ALi M1543C,
+  M1535, M1535D, M1535+, M1535D Sourth Bridge.  This driver supports
+  SIR, MIR and FIR (4Mbps) speeds.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  ali-ircc.o.
 
 VLSI 82C147 PCI-IrDA Controller Driver
 CONFIG_VLSI_FIR
@@ -18909,69 +22473,76 @@
   or M to the driver for your particular dongle below.
 
   Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause this configure script to skip all
+  kernel: saying N will just cause the configurator to skip all
   the questions about serial dongles.
 
-ESI JetEye PC Dongle
+ESI JetEye PC dongle
 CONFIG_ESI_DONGLE
   Say Y here if you want to build support for the Extended Systems
-  JetEye PC dongle. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. The ESI dongle attaches to the
-  normal 9-pin serial port connector, and can currently only be used
-  by IrTTY. To activate support for ESI dongles you will have to
+  JetEye PC dongle.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  The ESI dongle attaches
+  to the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for ESI dongles you will have to
   start irattach like this: "irattach -d esi".
 
 ACTiSYS IR-220L and IR220L+ dongle
 CONFIG_ACTISYS_DONGLE
-  Say Y here if you want to build support for the ACTiSYS
-  IR-220L and IR220L+ dongles. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt. The ACTiSYS dongles
+  Say Y here if you want to build support for the ACTiSYS IR-220L and
+  IR220L+ dongles.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  The ACTiSYS dongles
   attaches to the normal 9-pin serial port connector, and can
-  currently only be used by IrTTY. To activate support for ACTiSYS
-  dongles you will have to start irattach like this: 
+  currently only be used by IrTTY.  To activate support for ACTiSYS
+  dongles you will have to start irattach like this:
   "irattach -d actisys" or "irattach -d actisys+".
 
 Tekram IrMate 210B dongle
 CONFIG_TEKRAM_DONGLE
-  Say Y here if you want to build support for the Tekram IrMate 210B 
-  dongle. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. The Tekram dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY. To activate support for Tekram dongles you will have
-  to start irattach like this: "irattach -d tekram".
+  Say Y here if you want to build support for the Tekram IrMate 210B
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The Tekram dongle attaches to the
+  normal 9-pin serial port connector, and can currently only be used
+  by IrTTY.  To activate support for Tekram dongles you will have to
+  start irattach like this: "irattach -d tekram".
 
 Greenwich GIrBIL dongle
 CONFIG_GIRBIL_DONGLE
   Say Y here if you want to build support for the Greenwich GIrBIL
-  dongle. If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The Greenwich dongle attaches to the
-  normal 9-pin serial port connector, and can currently only be used
-  by IrTTY. To activate support for Greenwich dongles you will have to
-  insert "irattach -d girbil" in the /etc/irda/drivers script.
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The Greenwich dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for Greenwich dongles you will
+  have to insert "irattach -d girbil" in the /etc/irda/drivers script.
 
-Parallax Litelink dongle
+Parallax LiteLink dongle
 CONFIG_LITELINK_DONGLE
   Say Y here if you want to build support for the Parallax Litelink
-  dongle. If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The Parallax dongle attaches to the
-  normal 9-pin serial port connector, and can currently only be used
-  by IrTTY. To activate support for Parallax dongles you will have to
-  start irattach like this "irattach -d litelink".
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The Parallax dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for Parallax dongles you will
+  have to start irattach like this "irattach -d litelink".
 
 Old Belkin dongle
 CONFIG_OLD_BELKIN_DONGLE
   Say Y here if you want to build support for the Adaptec Airport 1000
-  and 2000 dongles. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. The module will be called
-  old_belkin.o. Some information is contained in the comments at the
-  top of drivers/net/irda/old_belkin.c.
+  and 2000 dongles.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  The module will be
+  called old_belkin.o.  Some information is contained in the comments
+  at the top of <file:drivers/net/irda/old_belkin.c>.
 
 VME (Motorola and BVM) support
 CONFIG_VME
   Say Y here if you want to build a kernel for a 680x0 based VME
-  board.  Boards currently supported include Motorola boards MVME162,
-  MVME166, MVME167, MVME172, and MVME177.  BVME4000 and BVME6000
-  boards from BVM Ltd are also supported.
+  board.  Boards currently supported include Motorola boards MVME147,
+  MVME162, MVME166, MVME167, MVME172, and MVME177.  BVME4000 and
+  BVME6000 boards from BVM Ltd are also supported.
+
+MVME147 support
+CONFIG_MVME147
+  Say Y to include support for early Motorola VME boards.  This will
+  build a kernel which can run on MVME147 single-board computers.  If
+  you select this option you will have to select the appropriate
+  drivers for SCSI, Ethernet and serial ports later on.
 
 MVME162, 166 and 167 support
 CONFIG_MVME16x
@@ -19001,6 +22572,16 @@
   is hardwired on.  The 53c710 SCSI driver is known to suffer from
   this problem.
 
+WD33C93 SCSI driver for MVME147
+CONFIG_MVME147_SCSI
+  Support for the on-board SCSI controller on the Motorola MVME147
+  single-board computer.
+
+SCC support for MVME147 serial ports
+CONFIG_MVME147_SCC
+  This is the driver for the serial ports on the Motorola MVME147
+  boards.  Everyone using one of these boards should say Y here.
+
 NCR53C710 SCSI driver for MVME16x
 CONFIG_MVME16x_SCSI
   The Motorola MVME162, 166, 167, 172 and 177 boards use the NCR53C710
@@ -19013,19 +22594,26 @@
   SCSI controller chip.  Almost everyone using one of these boards
   will want to say Y to this question.
 
+MVME147 (Lance) Ethernet support
+CONFIG_MVME147_NET
+  Support for the on-board Ethernet interface on the Motorola MVME147
+  single-board computer.  Say Y here to include the
+  driver for this chip in your kernel.   If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
 MVME16x Ethernet support
 CONFIG_MVME16x_NET
   This is the driver for the Ethernet interface on the Motorola
   MVME162, 166, 167, 172 and 177 boards.  Say Y here to include the
   driver for this chip in your kernel.   If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
+  a module, say M here and read <file:Documentation/modules.txt>.
 
 BVME6000 Ethernet support
 CONFIG_BVME6000_NET
   This is the driver for the Ethernet interface on BVME4000 and
   BVME6000 VME boards.  Say Y here to include the driver for this chip
   in your kernel.   If you want to compile it as a module, say M here
-  and read Documentation/modules.txt.
+  and read <file:Documentation/modules.txt>.
 
 CD2401 support for MVME166/7 serial ports
 CONFIG_SERIAL167
@@ -19052,11 +22640,707 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called display7seg.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
   If you do not have a CompactPCI model CP1400 or CP1500, or
   another UltraSPARC-IIi-cEngine boardset with a 7-segment display,
-  you should say N to this option. 
+  you should say N to this option.
+
+# Choice: cristype
+Etrax-100-LX-v1
+CONFIG_ETRAX100LX
+  Support version 1 of the Etrax 100LX.
+
+Etrax-100-LX-v2
+CONFIG_ETRAX100LX_V2
+  Support version 2 of the Etrax 100LX.
+
+Etrax-100-LX-for-xsim-simulator
+CONFIG_SVINTO_SIM
+  Support the xsim ETRAX Simulator.
+
+DRAM size (dec, in MB)
+CONFIG_ETRAX_DRAM_SIZE
+  Size of DRAM (decimal in MB) typically 2, 8 or 16.
+
+ETRAX Flash Memory configuration
+CONFIG_ETRAX_FLASH_BUSWIDTH
+  Width in bytes of the Flash bus (1, 2 or 4). Is usually 2.
+
+LED configuration on PA
+CONFIG_ETRAX_PA_LEDS
+  The Etrax network driver is responsible for flashing LED's when
+  packets arrive and are sent.  It uses macros defined in
+  <file:include/asm-cris/io.h>, and those macros are defined after what
+  YOU choose in this option.  The actual bits used are configured
+  separately.  Select this if the LEDs are on port PA.  Some products
+  put the leds on PB or a memory-mapped latch (CSP0) instead.
+
+LED configuration on PB
+CONFIG_ETRAX_PB_LEDS
+  The Etrax network driver is responsible for flashing LED's when
+  packets arrive and are sent.  It uses macros defined in
+  <file:include/asm-cris/io.h>, and those macros are defined after what
+  YOU choose in this option.  The actual bits used are configured
+  separately.  Select this if the LEDs are on port PB.  Some products
+  put the leds on PA or a memory-mapped latch (CSP0) instead.
+
+LED configuration on CSP0
+CONFIG_ETRAX_CSP0_LEDS
+  The Etrax network driver is responsible for flashing LED's when
+  packets arrive and are sent. It uses macros defined in
+  <file:include/asm-cris/io.h>, and those macros are defined after what
+  YOU choose in this option.  The actual bits used are configured
+  separately.  Select this if the LEDs are on a memory-mapped latch
+  using chip select CSP0, this is mapped at 0x90000000.
+  Some products put the leds on PA or PB instead.
+
+No LED at all
+CONFIG_ETRAX_NO_LEDS
+  Select this option if you don't have any LED at all.
+
+First green LED bit
+CONFIG_ETRAX_LED1G
+  Bit to use for the first green LED.
+  Most Axis products use bit 2 here.
+
+First red LED bit
+CONFIG_ETRAX_LED1R
+  Bit to use for the first red LED.
+  Most Axis products use bit 3 here.
+  For products with only one controllable LED,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Second green LED bit
+CONFIG_ETRAX_LED2G
+  Bit to use for the second green LED. The "Active" LED.
+  Most Axis products use bit 4 here.
+  For products with only one controllable LED,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Second red LED bit
+CONFIG_ETRAX_LED2R
+  Bit to use for the second red LED.
+  Most Axis products use bit 5 here.
+  For products with only one controllable LED,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Third green LED bit
+CONFIG_ETRAX_LED3G
+  Bit to use for the third green LED. The "Drive" LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Third red LED bit
+CONFIG_ETRAX_LED3R
+  Bit to use for the third red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fourth green LED bit
+CONFIG_ETRAX_LED4G
+  Bit to use for the fourth green LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fourth red LED bit
+CONFIG_ETRAX_LED4R
+  Bit to use for the fourth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fifth green LED bit
+CONFIG_ETRAX_LED5G
+  Bit to use for the fifth green LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fifth red LED bit
+CONFIG_ETRAX_LED5R
+  Bit to use for the fifth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Sixth green LED bit
+CONFIG_ETRAX_LED6G
+  Bit to use for the sixth green LED. The "Drive" LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Sixth red LED bit
+CONFIG_ETRAX_LED6R
+  Bit to use for the sixth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Seventh green LED bit
+CONFIG_ETRAX_LED7G
+  Bit to use for the seventh green LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Seventh red LED bit
+CONFIG_ETRAX_LED7R
+  Bit to use for the seventh red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Eighth yellow LED bit
+CONFIG_ETRAX_LED8Y
+  Bit to use for the eighth yellow LED. The "Drive" LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Ninth yellow LED bit
+CONFIG_ETRAX_LED9Y
+  Bit to use for the ninth yellow LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Tenth yellow LED bit
+CONFIG_ETRAX_LED10Y
+  Bit to use for the tenth yellow LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Eleventh yellow LED bit
+CONFIG_ETRAX_LED11Y
+  Bit to use for the eleventh yellow LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Twelfth red LED bit
+CONFIG_ETRAX_LED12R
+  Bit to use for the twelfth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Flash LED off during activity
+CONFIG_ETRAX_LED_OFF_DURING_ACTIVITY
+  This option allows you to decide whether the network LED (and
+  Bluetooth LED in case you use Bluetooth) will be on or off when
+  the network is connected, and whether it should flash off or on
+  when there is activity. If you say y to this option the network
+  LED will be lit when there is a connection, and will flash off
+  when there is activity.
+
+PA button configuration
+CONFIG_ETRAX_PA_BUTTON_BITMASK
+  This is a bitmask with information about what bits on PA that
+  are used for buttons.
+  Most products has a so called TEST button on PA1, if that's true
+  use 02 here.
+  Use 00 if there are no buttons on PA.
+  If the bitmask is <> 00 a button driver will be included in the gpio
+  driver. Etrax general I/O support must be enabled.
+
+PA changeable direction bits
+CONFIG_ETRAX_PA_CHANGEABLE_DIR
+  This is a bitmask with information of what bits in PA that a user
+  can change direction on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+PA changeable data bits
+CONFIG_ETRAX_PA_CHANGEABLE_BITS
+  This is a bitmask with information of what bits in PA that a user
+  can change change the value on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+PA changeable direction bits
+CONFIG_ETRAX_PB_CHANGEABLE_DIR
+  This is a bitmask with information of what bits in PB that a user
+  can change direction on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+PB changeable data bits
+CONFIG_ETRAX_PB_CHANGEABLE_BITS
+  This is a bitmask with information of what bits in PB that a user
+  can change the value on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+Kernel debugger (kgdb)
+CONFIG_ETRAX_KGDB
+  The CRIS version of gdb can be used to remotely debug a running
+  Linux kernel via the serial debug port.  Provided you have gdb-cris
+  installed, run gdb-cris vmlinux, then type
+
+  (gdb) set remotebaud 115200           <- kgdb uses 115200 as default
+  (gdb) target remote /dev/ttyS0        <- maybe you use another port
+
+  This should connect you to your booted kernel (or boot it now if you
+  didn't before).  The kernel halts when it boots, waiting for gdb if
+  this option is turned on!
+
+Etrax bus waitstates
+CONFIG_ETRAX_DEF_R_WAITSTATES
+  Waitstates for SRAM, Flash and peripherials (not DRAM).  95f8 is a
+  good choice for most Axis products...
+
+Etrax bus configuration
+CONFIG_ETRAX_DEF_R_BUS_CONFIG
+  Assorted bits controlling write mode, DMA burst length etc.  104 is
+  a good choice for most Axis products...
+
+Etrax SDRAM configuration
+CONFIG_ETRAX_SDRAM
+  Enable this if you use SDRAM chips and configure
+  R_SDRAM_CONFIG and R_SDRAM_TIMING as well.
+
+DRAM size (dec, in MB)
+CONFIG_ETRAX_DEF_R_DRAM_CONFIG
+  The R_DRAM_CONFIG register specifies everything on how the DRAM
+  chips in the system are connected to the Etrax CPU.  This is
+  different depending on the manufacturer, chip type and number of
+  chips.  So this value often needs to be different for each Axis
+  product.
+
+Etrax DRAM timing
+CONFIG_ETRAX_DEF_R_DRAM_TIMING
+  Different DRAM chips have different speeds.  Current Axis products
+  use 50ns DRAM chips which can use the timing: 5611.
+
+Etrax SDRAM configuration
+CONFIG_ETRAX_DEF_R_SDRAM_CONFIG
+  The R_SDRAM_CONFIG register specifies everything on how the SDRAM
+  chips in the system are connected to the Etrax CPU.  This is
+  different depending on the manufacturer, chip type and number of
+  chips.  So this value often needs to be different for each Axis
+  product.
+
+Etrax SDRAM timing
+CONFIG_ETRAX_DEF_R_SDRAM_TIMING
+  Different SDRAM chips have different timing.
+
+Etrax General port A direction
+CONFIG_ETRAX_DEF_R_PORT_PA_DIR
+  Configures the direction of general port A bits.  1 is out, 0 is in.
+  This is often totally different depending on the product used.
+  There are some guidelines though - if you know that only LED's are
+  connected to port PA, then they are usually connected to bits 2-4
+  and you can therefore use 1c.  On other boards which don't have the
+  LED's at the general ports, these bits are used for all kinds of
+  stuff.  If you don't know what to use, it is always safe to put all
+  as inputs, although floating inputs isn't good.
+
+Etrax General port A data
+CONFIG_ETRAX_DEF_R_PORT_PA_DATA
+  Configures the initial data for the general port A bits.  Most
+  products should use 00 here.
+
+Etrax General port B config
+CONFIG_ETRAX_DEF_R_PORT_PB_CONFIG
+  Configures the type of the general port B bits.  1 is chip select,
+  0 is port.  Most products should use 00 here.
+
+Etrax General port B direction
+CONFIG_ETRAX_DEF_R_PORT_PB_DIR
+  Configures the direction of general port B bits. 1 is out, 0 is in.
+  This is often totally different depending on the product used.  Bits
+  0 and 1 on port PB are usually used for I2C communication, but the
+  kernel I2C driver sets the appropriate directions itself so you
+  don't need to take that into consideration when setting this option.
+  If you don't know what to use, it is always safe to put all as
+  inputs.
+
+Etrax General port B data
+CONFIG_ETRAX_DEF_R_PORT_PB_DATA
+  Configures the initial data for the general port A bits.  Most
+  products should use FF here.
+
+Etrax General port device
+CONFIG_ETRAX_GPIO
+  Enables the Etrax general port device (major 120, minors 0 and 1).
+  You can use this driver to access the general port bits. It supports
+  these ioctl's:
+        #include <linux/etraxgpio.h>
+       fd = open("/dev/gpioa", O_RDWR); // or /dev/gpiob
+       ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS), bits_to_set);
+       ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS), bits_to_clear);
+       val = ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_READBITS), NULL);
+  Remember that you need to setup the port directions appropriately in
+  the General configuration.
+
+Etrax parallel data support
+CONFIG_ETRAX_PARDATA
+  Adds support for writing data to the parallel port par0 of the ETRAX
+  100.  If you create a character special file with major number 126,
+  you can write to the data bits of par0.
+  Note: you need to disable Etrax100 parallel port support.
+
+Etrax parallel LCD (HD44780) Driver
+CONFIG_ETRAX_LCD_HD44780
+  Adds support for a HD44780 controlled LCD connected to the parallel
+  port par0 of the Etrax.
+
+Etrax Serial port ser0 support
+CONFIG_ETRAX_SERIAL
+  Enables the ETRAX 100 serial driver for ser0 (ttyS0)
+  You probably want this enabled.
+
+/proc/serial entry
+CONFIG_ETRAX_SERIAL_PROC_ENTRY
+  Enables /proc/serial entry where errors and statistics can be
+  viewed.  CONFIG_PROC_FS must also be set for this to work.
+
+Etrax Serial port fast flush of DMA using fast timer API
+CONFIG_ETRAX_SERIAL_FAST_TIMER
+  Select this to have the serial DMAs flushed at a higher rate than
+  normally, possible by using the fast timer API, the timeout is
+  approx. 4 character times.
+  If unsure, say N.
+
+Etrax Serial port fast flush of DMA
+CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
+  Select this to have the serial DMAs flushed at a higher rate than
+  normally possible through a fast timer interrupt (currently at
+  15360 Hz).
+  If unsure, say N.
+
+Etrax Serial port receive flush timeout
+CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS
+  Number of timer ticks between flush of receive fifo (1 tick = 10ms).
+  Try 0-3 for low latency applications.  Approx 5 for high load
+  applications (e.g. PPP).  Maybe this should be more adaptive some
+  day...
+
+Etrax Serial port ser0 DTR, RI, DSR and CD support on PB
+CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB
+  Enables the status and control signals DTR, RI, DSR and CD on PB for
+  ser0.
+
+Serial port 1 enabled
+CONFIG_ETRAX_SERIAL_PORT1
+  Enables the ETRAX 100 serial driver for ser1 (ttyS1).
+
+Etrax Serial port ser1 DTR, RI, DSR and CD support on PB
+CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_ON_PB
+  Enables the status and control signals DTR, RI, DSR and CD on PB for
+  ser1.
+
+Serial port 2 enabled
+CONFIG_ETRAX_SERIAL_PORT2
+  Enables the ETRAX 100 serial driver for ser2 (ttyS2).
+
+Etrax Serial port ser2 DTR, RI, DSR and CD support on PA
+CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PA
+  Enables the status and control signals DTR, RI, DSR and CD on PA for
+  ser2.
+
+Serial port 3 enabled
+CONFIG_ETRAX_SERIAL_PORT3
+  Enables the ETRAX 100 serial driver for ser3 (ttyS3).
+
+Etrax100 RS-485 support
+CONFIG_ETRAX_RS485
+  Enables support for RS-485 serial communication.  For a primer on
+  RS-485, see <http://www.hw.cz/english/docs/rs485/rs485.html>.
+
+Etrax100 RS-485 mode on PA
+CONFIG_ETRAX_RS485_ON_PA
+  Control Driver Output Enable on RS485 tranceiver using a pin on PA
+  port:
+          Axis 2400/2401 uses PA 3.
+
+Etrax100 RS-485 mode on PA bit
+CONFIG_ETRAX_RS485_ON_PA_BIT
+  Control Driver Output Enable on RS485 tranceiver using a this bit
+  on PA port.
+
+Ser0 DTR on PB bit
+CONFIG_ETRAX_SER0_DTR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DTR signal for serial
+  port 0.
+
+Ser0 RI  on PB bit
+CONFIG_ETRAX_SER0_RI_ON_PB_BIT
+  Specify the pin of the PB port to carry the RI signal for serial
+  port 0.
+
+Ser0 DSR on PB bit
+CONFIG_ETRAX_SER0_DSR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DSR signal for serial
+  port 0.
+
+Ser0 CD  on PB bit
+CONFIG_ETRAX_SER0_CD_ON_PB_BIT
+  Specify the pin of the PB port to carry the CD signal for serial
+  port 0.
+
+Ser1 DTR on PB bit
+CONFIG_ETRAX_SER1_DTR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DTR signal for serial
+  port 1.
+
+Ser1 RI  on PB bit
+CONFIG_ETRAX_SER1_RI_ON_PB_BIT
+  Specify the pin of the PB port to carry the RI signal for serial
+  port 1.
+
+Ser1 DSR on PB bit
+CONFIG_ETRAX_SER1_DSR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DSR signal for serial
+  port 1.
+
+Ser1 CD  on PB bit
+CONFIG_ETRAX_SER1_CD_ON_PB_BIT
+  Specify the pin of the PB port to carry the CD signal for serial
+  port 1.
+
+Ser2 DTR on PA bit
+CONFIG_ETRAX_SER2_DTR_ON_PA_BIT
+  Specify the pin of the PA port to carry the DTR signal for serial
+  port 2.
+
+Ser2 RI  on PA bit
+CONFIG_ETRAX_SER2_RI_ON_PA_BIT
+  Specify the pin of the PA port to carry the RI signal for serial
+  port 2.
+
+Ser2 DSR on PA bit
+CONFIG_ETRAX_SER2_DSR_ON_PA_BIT
+  Specify the pin of the PA port to carry the DTR signal for serial
+  port 2.
+
+Ser2 CD  on PA bit
+CONFIG_ETRAX_SER2_CD_ON_PA_BIT
+  Specify the pin of the PA port to carry the CD signal for serial
+  port 2.
+
+Etrax100 RS-485 disable receiver
+CONFIG_ETRAX_RS485_DISABLE_RECEIVER
+  It's necessary to disable the serial receiver to avoid serial
+  loopback.  Not all products are able to do this in software only.
+  Axis 2400/2401 must disable receiver.
+
+Etrax100 I2C Support
+CONFIG_ETRAX_I2C
+  Enables an I2C driver on PB0 and PB1 on ETRAX100.
+  EXAMPLE usage:
+        i2c_arg = I2C_WRITEARG(STA013_WRITE_ADDR, reg, val);
+       ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_WRITEREG), i2c_arg);
+       i2c_arg = I2C_READARG(STA013_READ_ADDR, reg);
+       val = ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_READREG), i2c_arg);
+
+Etrax100 I2C configuration
+CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
+  Select whether to use the special I2C mode in the PB I/O register or
+  not.  This option needs to be selected in order to use some drivers
+  that access the I2C I/O pins directly instead of going through the
+  I2C driver, like the DS1302 realtime-clock driver.  If you are
+  uncertain, choose Y here.
+
+Etrax100 I2C EEPROM (NVRAM) support
+CONFIG_ETRAX_I2C_EEPROM
+  Enables I2C EEPROM (non-volatile RAM) on PB0 and PB1 using the I2C
+  driver.  Select size option: Probed, 2k, 8k, 16k.
+  (Probing works for 2k and 8k but not that well for 16k)
+
+Etrax100 I2C EEPROM (NVRAM) size/16kB
+CONFIG_ETRAX_I2C_EEPROM_16KB
+  Use a 16kB EEPROM.
+
+Etrax100 I2C EEPROM (NVRAM) size/2kB
+CONFIG_ETRAX_I2C_EEPROM_2KB
+  Use a 2kB EEPROM.
+
+Etrax100 I2C EEPROM (NVRAM) size/8kB
+CONFIG_ETRAX_I2C_EEPROM_8KB
+  Use a 8kB EEPROM.
+
+Etrax100 I2C EEPROM (NVRAM) size/probe
+CONFIG_ETRAX_I2C_EEPROM_PROBE
+  Specifies size or auto probe of the EEPROM size.
+  Options: Probed, 2k, 8k, 16k.
+  (Probing works for 2k and 8k but not that well for 16k)
+
+Etrax DS1302 Real-Time Clock driver
+CONFIG_ETRAX_DS1302
+  Enables the driver for the DS1302 Real-Time Clock battery-backed
+  chip on some products.  The kernel reads the time when booting, and
+  the date can be set using ioctl(fd, RTC_SET_TIME, &rt) with rt a
+  rtc_time struct (see <file:include/asm-cris/rtc.h>) on the /dev/rtc
+  device, major 121.  You can check the time with cat /proc/rtc, but
+  normal time reading should be done using libc function time and
+  friends.
+
+Etrax DS1302 RST on the Generic Port
+CONFIG_ETRAX_DS1302_RST_ON_GENERIC_PORT
+  If your product has the RST signal line for the DS1302 RTC on the
+  Generic Port then say Y here, otherwise leave it as N in which
+  case the RST signal line is assumed to be connected to Port PB
+  (just like the SCL and SDA lines).
+
+Etrax DS1302 RST bit number
+CONFIG_ETRAX_DS1302_RSTBIT
+  This is the bit number for the RST signal line of the DS1302 RTC on
+  the selected port. If you have selected the generic port then it
+  should be bit 27, otherwise your best bet is bit 5.
+
+Etrax DS1302 SCL bit number
+CONFIG_ETRAX_DS1302_SCLBIT
+  This is the bit number for the SCL signal line of the DS1302 RTC on
+  Port PB. This is probably best left at 3.
+
+Etrax DS1302 SDA bit number
+CONFIG_ETRAX_DS1302_SDABIT
+  This is the bit number for the SDA signal line of the DS1302 RTC on
+  Port PB. This is probably best left at 2.
+
+Etrax 100 IDE Reset
+CONFIG_ETRAX_IDE_CSP0_8_RESET
+  Configures the pin used to reset the IDE bus.
+
+Etrax 100 IDE Reset
+CONFIG_ETRAX_IDE_CSPE1_16_RESET
+  Configures the pin used to reset the IDE bus.
+
+Etrax 100 ATA/IDE support
+CONFIG_ETRAX_IDE_DELAY
+  Sets the time to wait for disks to regain consciousness after reset.
+
+Etrax 100 IDE Reset
+CONFIG_ETRAX_IDE_G27_RESET
+  Configures the pin used to reset the IDE bus.
+
+IDE reset on PB Bit 7
+CONFIG_ETRAX_IDE_PB7_RESET
+  Configures the pin used to reset the IDE bus.
+
+USB 1.1 host
+CONFIG_ETRAX_USB_HOST
+  This option enables the host functionality of the ETRAX 100LX
+  built-in USB controller. In host mode the controller is designed
+  for CTRL and BULK traffic only, INTR traffic may work as well
+  however (depending on the requirements of timeliness).
+
+USB 1.1 host port 1 enabled
+CONFIG_ETRAX_USB_HOST_PORT1
+  This option enables port 1 of the ETRAX 100LX USB root hub (RH).
+
+USB 1.1 host port 2 enabled
+CONFIG_ETRAX_USB_HOST_PORT2
+  This option enables port 2 of the ETRAX 100LX USB root hub (RH).
+
+ETRAX 100LX 10/100Mbit Ethernet controller
+CONFIG_ETRAX_ETHERNET
+  This option enables the ETRAX 100LX built-in 10/100Mbit Ethernet
+  controller.
+
+ETRAX 100LX Synchronous serial ports
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL
+  This option enables support for the ETRAX 100LX built-in
+  synchronous serial ports. These ports are used for continuous
+  streamed data like audio. The default setting is compatible
+  with the STA 013 MP3 decoder, but can easily be tuned to fit
+  any other audio encoder/decoder and SPI.
+
+ETRAX 100LX Synchronous serial port 0 enabled
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT0
+  Enables the ETRAX 100LX synchronous serial port 0 (syncser0).
+
+ETRAX 100LX Synchronous serial port 0 uses DMA
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL0_DMA
+  Makes synchronous serial port 0 use DMA.
+
+ETRAX 100LX Synchronous serial port 1 enabled
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT1
+  Enables the ETRAX 100LX synchronous serial port 1 (syncser1).
+
+ETRAX 100LX Synchronous serial port 1 uses DMA
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL1_DMA
+  Makes synchronous serial port 1 use DMA.
+
+Delay for drives to regain consciousness
+CONFIG_IDE_DELAY
+  Number of seconds to wait for IDE drives to spin up after an IDE
+  reset.
+
+ARTPEC-1 support
+CONFIG_JULIETTE
+  The ARTPEC-1 is a video-compression chip used in the AXIS 2100
+  network camera, which is built around an ETRAX-100 board.  With this
+  option selected, the ETRAX kernel configures a DMA channel at boot
+  time to talk to the chip.
+
+Axis flash-map support
+CONFIG_ETRAX_AXISFLASHMAP
+  This option enables MTD mapping of flash devices.  Needed to use
+  flash memories.  If unsure, say Y.
+
+Byte-offset of partition table sector
+CONFIG_ETRAX_PTABLE_SECTOR
+  Byte-offset of the partition table in the first flash chip.
+  The default value is 64kB and should not be changed unless
+  you know exactly what you are doing. The only valid reason
+  for changing this is when the flash block size is bigger
+  than 64kB (e.g. when using two parallel 16 bit flashes).
+
+Enable Etrax100 watchdog
+CONFIG_ETRAX_WATCHDOG
+  Enable the built-in watchdog timer support on Etrax100 embedded
+  network computers.
+
+# Choice: crisdebug
+Serial-0
+CONFIG_ETRAX_DEBUG_PORT0
+  Choose a serial port for the ETRAX debug console.  Default to
+  port 0.
+
+Etrax debug port on ser1
+CONFIG_ETRAX_DEBUG_PORT1
+  Use serial port 1 for the console.
+
+Etrax debug port on ser2
+CONFIG_ETRAX_DEBUG_PORT2
+  Use serial port 2 for the console.
+
+Etrax debug port on ser3
+CONFIG_ETRAX_DEBUG_PORT3
+  Use serial port 3 for the console.
+
+No Etrax debug port
+CONFIG_ETRAX_DEBUG_PORT_NULL
+  Disable serial-port debugging.
+
+Parallel port support
+CONFIG_ETRAX_PARPORT
+  Say Y here to enable the ETRAX on-board parallel ports.
+
+Parallel port 0 enabled
+CONFIG_ETRAX_PARALLEL_PORT0
+  Say Y here to enable parallel port 0.
+
+Parallel port 1 enabled
+CONFIG_ETRAX_PARALLEL_PORT1
+  Say Y here to enable parallel port 1.
+
+# Choice: crisrescue
+Select a product rescue port
+CONFIG_ETRAX_RESCUE_SER0
+  Select one of the four serial ports as a rescue port.  The default
+  is port 0.
+
+Serial-1
+CONFIG_ETRAX_RESCUE_SER1
+  Use serial port 1 as the rescue port.
+
+Serial-2
+CONFIG_ETRAX_RESCUE_SER2
+  Use serial port 2 as the rescue port.
+
+Serial-3
+CONFIG_ETRAX_RESCUE_SER3
+  Use serial port 3 as the rescue port.
+
+RIO Hardware Watchdog support
+CONFIG_WATCHDOG_RIO
+  Say Y here to support the hardware watchdog capability on Sun RIO
+  machines.  The watchdog timeout period is normally one minute but
+  can be changed with a boot-time parameter.
 
 CP1XXX Hardware Watchdog support
 CONFIG_WATCHDOG_CP1XXX
@@ -19066,12 +23350,22 @@
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called cpwatchdog.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
+  as a module, say M here and read <file:Documentation/modules.txt>.
 
   If you do not have a CompactPCI model CP1400 or CP1500, or
   another UltraSPARC-IIi-cEngine boardset with hardware watchdog,
-  you should say N to this option. 
+  you should say N to this option.
+
+# Choice: ia64type
+Itanium
+CONFIG_ITANIUM
+  Select your IA64 processor type.  The default is Intel Itanium.
+
+McKinley
+CONFIG_MCKINLEY
+  Select this to configure for a McKinley processor.
 
+# Choice: ia64system
 IA-64 system type
 CONFIG_IA64_GENERIC
   This selects the system type of your hardware.  A "generic" kernel
@@ -19079,19 +23373,21 @@
   a kernel for your specific system, it will be faster and smaller.
 
   To find out what type of IA-64 system you have, you may want to
-  check the IA-64 Linux web site at http://www.linux-ia64.org/.
+  check the IA-64 Linux web site at <http://www.linux-ia64.org/>.
   As of the time of this writing, most hardware is DIG compliant,
   so the "DIG-compliant" option is usually the right choice.
 
-  HP-simulator   For the HP simulator (http://software.hp.com/ia64linux/).
+  HP-simulator   For the HP simulator
+                 (<http://software.hp.com/ia64linux/>).
   SN1-simulator  For the SGI SN1 simulator.
-  DIG-compliant  For DIG ("Developer's Interface Guide") compliant system.
+  DIG-compliant  For DIG ("Developer's Interface Guide") compliant
+                 system.
 
   If you don't know what to do, choose "generic".
 
+# Choice: pagesize
 Kernel page size
 CONFIG_IA64_PAGE_SIZE_4KB
-
   This lets you select the page size of the kernel.  For best IA-64
   performance, a page size of 8KB or 16KB is recommended.  For best
   IA-32 compatibility, a page size of 4KB should be selected (the vast
@@ -19109,8 +23405,8 @@
 Enable Itanium A-step specific code
 CONFIG_ITANIUM_ASTEP_SPECIFIC
   Select this option to build a kernel for an Itanium prototype system
-  with an A-step CPU.  You have an A-step CPU if the "revision" field in
-  /proc/cpuinfo is 0.
+  with an A-step CPU.  You have an A-step CPU if the "revision" field
+  in /proc/cpuinfo is 0.
 
 Enable Itanium B-step specific code
 CONFIG_ITANIUM_BSTEP_SPECIFIC
@@ -19120,9 +23416,33 @@
 
 Enable Itanium B0-step specific code
 CONFIG_ITANIUM_B0_SPECIFIC
-  Select this option to bild a kernel for an Itanium prototype system
-  with a B0-step CPU.  You have a B0-step CPU if the "revision" field in
-  /proc/cpuinfo is 1.
+  Select this option to build a kernel for an Itanium prototype system
+  with a B0-step CPU.  You have a B0-step CPU if the "revision" field
+  in /proc/cpuinfo is 1.
+
+Enable Itanium C-step specific code
+CONFIG_ITANIUM_CSTEP_SPECIFIC
+  Select this option to build a kernel for an Itanium prototype system
+  with a C-step CPU.  You have a C-step CPU if the "revision" field in
+  /proc/cpuinfo is in the range of 5 to 8.
+
+Enable Itanium B1-step specific code
+CONFIG_ITANIUM_B1_SPECIFIC
+  Select this option to build a kernel for an Itanium prototype system
+  with a B1-step CPU.  You have a B1-step CPU if the "revision" field
+  in /proc/cpuinfo is 2.
+
+Enable Itanium B2-step specific code
+CONFIG_ITANIUM_B2_SPECIFIC
+  Select this option to build a kernel for an Itanium prototype system
+  with a B2-step CPU.  You have a B2-step CPU if the "revision" field
+  in /proc/cpuinfo is 3.
+
+Enable Itanium C0-step specific code
+CONFIG_ITANIUM_C0_SPECIFIC
+  Select this option to build a kernel for an Itanium prototype system
+  with a C0-step CPU.  You have a C0-step CPU if the "revision" field
+  in /proc/cpuinfo is 5.
 
 Force interrupt redirection
 CONFIG_IA64_HAVE_IRQREDIR
@@ -19130,38 +23450,56 @@
   redirect interrupts to different CPUs.  Select N here if you're
   unsure.
 
-Enable use of global TLB purge instruction (ptc.g)
-CONFIG_ITANIUM_PTCG
-  Say Y here if you want the kernel to use the IA-64 "ptc.g"
-  instruction to flush the TLB on all CPUs.  Select N here if
-  you're unsure.
-
-Enable SoftSDV hacks
-CONFIG_IA64_SOFTSDV_HACKS
-  Say Y here to enable hacks to make the kernel work on the Intel
-  SoftSDV simulator.  Select N here if you're unsure.
-
-Enable AzusA hacks
-CONFIG_IA64_AZUSA_HACKS
-  Say Y here to enable hacks to make the kernel work on the NEC
-  AzusA platform.  Select N here if you're unsure.
-
-Force socket buffers below 4GB?
-CONFIG_SKB_BELOW_4GB
-  Most of today's network interface cards (NICs) support DMA to
-  the low 32 bits of the address space only.  On machines with
-  more then 4GB of memory, this can cause the system to slow
-  down if there is no I/O TLB hardware.  Turning this option on
-  avoids the slow-down by forcing socket buffers to be allocated
-  from memory below 4GB.  The downside is that your system could
-  run out of memory below 4GB before all memory has been used up.
-  If you're unsure how to answer this question, answer Y.
-
 Enable IA-64 Machine Check Abort
 CONFIG_IA64_MCA
   Say Y here to enable machine check support for IA-64.  If you're
   unsure, answer Y.
 
+Disable IA-64 Virtual Hash Page Table
+CONFIG_DISABLE_VHPT
+  The Virtual Hash Page Table (VHPT) enhances virtual address
+  translation performance.  Normally you want the VHPT active but you
+  can select this option to disable the VHPT for debugging.  If you're
+  unsure, answer N.
+
+Enable McKinley A-step specific code
+CONFIG_MCKINLEY_ASTEP_SPECIFIC
+  Select this option to build a kernel for an IA64 McKinley system
+  with any A-stepping CPU.
+
+Enable McKinley A0/A1-step specific code
+CONFIG_MCKINLEY_A0_SPECIFIC
+  Select this option to build a kernel for an IA64 McKinley system
+  with an A0 or A1 stepping CPU.
+
+Turn on compare-and-exchange bug checking (slow!)
+CONFIG_IA64_DEBUG_CMPXCHG
+  Selecting this option turns on bug checking for the IA64
+  compare-and-exchange instructions.  This is slow!  Itaniums
+  from step B3 or later don't have this problem. If you're unsure,
+  select N.
+
+IA64 IRQ bug checking
+CONFIG_IA64_DEBUG_IRQ
+  Selecting this option turns on bug checking for the IA64 irq_save
+  and restore instructions.  It's useful for tracking down spinlock
+  problems, but slow!  If you're unsure, select N.
+
+Early printk support (requires VGA!)
+CONFIG_IA64_EARLY_PRINTK
+  Selecting this option uses the VGA screen for printk() output before
+  the consoles are initialised.  It is useful for debugging problems
+  early in the boot process, but only if you have a VGA screen
+  attached.  If you're unsure, select N.
+
+Print possible IA64 hazards to console
+CONFIG_IA64_PRINT_HAZARDS
+  Selecting this option prints more information for Illegal Dependency
+  Faults, that is, for Read after Write, Write after Write or Write
+  after Read violations.  This option is ignored if you are compiling
+  for an Itanium A step processor (CONFIG_ITANIUM_ASTEP_SPECIFIC).  If
+  you're unsure, select Y.
+
 Performance monitor support
 CONFIG_PERFMON
   Selects whether support for the IA-64 performance monitor hardware
@@ -19179,12 +23517,416 @@
   To use this option, you have to check that the "/proc file system
   support" (CONFIG_PROC_FS) is enabled, too.
 
+Kernel support for IA-32 emulation
+CONFIG_IA32_SUPPORT
+  IA64 processors can run IA32 (that is, x86) binaries by emulating
+  the IA32 instruction set.  Say Y here to build in kernel support for
+  this.  If in doubt, say Y.
+
+/proc/efi/vars support
+CONFIG_IA64_EFIVARS
+  If you say Y here, you are able to get EFI (Extensible Firmware
+  Interface) variable information in /proc/efi/vars.  You may read,
+  write, create, and destroy EFI variables through this interface.
+
+  To use this option, you have to check that the "/proc file system
+  support" (CONFIG_PROC_FS) is enabled, too.
+
+Directly Connected Compact Flash support
+CONFIG_CF_ENABLER
+  Compact Flash is a small, removable mass storage device introduced
+  in 1994 originally as a PCMCIA device.  If you say `Y' here, you
+  compile in support for Compact Flash devices directly connected to
+  a SuperH processor.  A Compact Flash FAQ is available at
+  <http://www.compactflash.org/faqs/faq.htm>.
+
+  If your board has "Directly Connected" CompactFlash at area 5 or 6,
+  you may want to enable this option.  Then, you can use CF as
+  primary IDE drive (only tested for SanDisk).
+
+  If in doubt, select 'N'.
+
+Kernel debugging
+CONFIG_DEBUG_KERNEL
+  Say Y here if you are developing drivers or trying to debug and
+  identify kernel problems.
+
+Debug memory allocations
+CONFIG_DEBUG_SLAB
+  Say Y here to have the kernel do limited verification on memory
+  allocation as well as poisoning memory on free to catch use of freed
+  memory.
+
+Memory mapped I/O debug support
+CONFIG_DEBUG_IOVIRT
+  Say Y here to get warned whenever an attempt is made to do I/O on
+  obviously invalid addresses such as those generated when ioremap()
+  calls are forgotten.  Memory mapped I/O will go through an extra
+  check to catch access to unmapped ISA addresses, an access method
+  that can still be used by old drivers that are being ported from
+  2.0/2.2.
+
+Spinlock debugging
+CONFIG_DEBUG_SPINLOCK
+  Say Y here and build SMP to catch missing spinlock initialization
+  and certain other kinds of spinlock errors commonly made.  This is
+  best used in conjunction with the NMI watchdog so that spinlock
+  deadlocks are also debuggable.
+
+Verbose BUG() reporting (adds 70K)
+CONFIG_DEBUG_BUGVERBOSE
+  Say Y here to make BUG() panics output the file name and line number
+  of the BUG call as well as the EIP and oops trace.  This aids
+  debugging but costs about 70-100K of memory.
+
+Include kgdb kernel debugger
+CONFIG_KGDB
+  Include in-kernel hooks for kgdb, the Linux kernel source level
+  debugger.  This project has a web page at
+  <http://kgdb.sourceforge.net/>.
+
+Include xmon kernel debugger
+CONFIG_XMON
+  Include in-kernel hooks for the xmon kernel monitor/debugger
+  supported by the PPC port.
+
+Include kgdb kernel debugger
+CONFIG_KWDB
+  Include in-kernel hooks for kdb, the source level debugger for the
+  PA-RISC port.
+
+IODC console
+CONFIG_IODC_CONSOLE
+  IODC is HP's pre-PCI standard for device identification (a la PCI
+  vendor, device IDs), detection, configuration, initialization and so
+  on.  It also can provide firmware function to do the actual IO,
+  which are slow, not really defined for runtime usage and generally
+  not desirable.
+
+  See <http://www.linuxhq.com/kernel/v2.4/doc/parisc/IODC.txt.html>
+  for the gory details.
+
+  Say Y here to enable use of the IODC firmware functions for console
+  I/O.  This is only useful on older PA-RISC workstations.  If in
+  doubt, say Y.
+
+U2/Uturn I/O MMU
+CONFIG_IOMMU_CCIO
+  Say Y here to enable DMA management routines for the first
+  generation of PA-RISC cache-coherent machines.  Programs the
+  U2/Uturn chip in "Virtual Mode" and use the I/O MMU.
+
+LBA/Elroy PCI support
+CONFIG_PCI_LBA
+  Say Y here to give the PA-RISC kernel access to PCI configuration
+  and IO-port space on PA-RISC workstations equipped with a Lower Bus
+  Adapter (LBA).  This includes A, B, C, J, L, and N-class machines
+  with 4-digit model numbers, also the A300.
+
+LASI I/O support
+CONFIG_GSC_LASI
+  Say Y here to directly support the LASI controller chip found on
+  PA-RISC workstations.  Linux-oriented documentation for this chip
+  can be found at <http://www.parisc-linux.org/documentation/>.
+
+LASI/ASP builtin parallel-port
+CONFIG_PARPORT_GSC
+  Say Y here to build in low-level parallel-support for PC-style
+  hardware integrated in the LASI-Controller (on the GSC Bus) for
+  HP-PARISC workstations.
+
+Fujitsu Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_FUJITSU
+  Enable vendor-specific code for Fujitsu IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+IBM Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_IBM
+  Enable vendor-specific code for IBM IDE disks.  Unless you are the
+  IDE maintainer, you probably do not want to mess with this.
+
+Maxtor Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_MAXTOR
+  Enable vendor-specific code for Maxtor IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+Quantum Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_QUANTUM
+  Enable vendor-specific code for Quantum IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+Seagate Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_SEAGATE
+  Enable vendor-specific code for Seagate IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+Western Digital Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_WD
+  Enable vendor-specific code for Western Digital IDE disks.  Unless
+  you are the IDE maintainer, you probably do not want to mess with
+  this.
+
+TiVo Commerial Application Specific
+CONFIG_BLK_DEV_TIVO
+  Enable vendor-specific code for TiVo IDE disks.  Unless you are the
+  IDE maintainer, you probably do not want to mess with this.
+
+# Choice: superhsys
+Generic
+CONFIG_SH_GENERIC
+  Select Generic if configuring for a generic SuperH system.
+  The "generic" option compiles in *all* the possible hardware
+  support and relies on the sh_mv= kernel commandline option to choose
+  at runtime which routines to use.  "MV" stands for "machine vector";
+  each of the machines below is described by a machine vector.
+
+  Select SolutionEngine if configuring for a Hitachi SH7709
+  or SH7750 evalutation board.
+
+  Select Overdrive if configuring for a ST407750 Overdrive board.
+  More information at
+  <http://linuxsh.sourceforge.net/docs/7750overdrive.php3>.
+
+  Select HP620 if configuring for a HP Jornada HP620.
+  More information (hardware only) at
+  <http://www.hp.com/jornada>.
+
+  Select HP680 if configuring for a HP Jornada HP680.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/products/680>.
+
+  Select HP690 if configuring for a HP Jornada HP690.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/products/680>.
+
+  Select CqREEK if configuring for a CqREEK SH7708 or SH7750.
+  More information at
+  <http://sources.redhat.com/ecos/hardware.html#SuperH>.
+
+  Select DMIDA if configuring for a DataMyte 4000 Industrial
+  Digital Assistant. More information at <http://www.dmida.com>.
+
+  Select EC3104 if configuring for a system with an Eclipse
+  International EC3104 chip, e.g. the Harris AD2000.
+
+  Select Dreamcast if configuring for a SEGA Dreamcast.
+  More information at
+  <http://www.m17n.org/linux-sh/dreamcast>.  There is a
+  Dreamcast project is at <http://linuxdc.sourceforge.net/>.
+
+  Select BareCPU if you know what this means, and it applies
+  to your system.
+
+SolutionEngine
+CONFIG_SH_SOLUTION_ENGINE
+  Select SolutionEngine if configuring for a Hitachi SH7709
+  or SH7750 evalutation board.
+
+7751 SolutionEngine
+CONFIG_SH_7751_SOLUTION_ENGINE
+  Select 7751 SolutionEngine if configuring for a Hitachi SH7751
+  evalutation board.
+
+Overdrive
+CONFIG_SH_OVERDRIVE
+  Select Overdrive if configuring for a ST407750 Overdrive board.
+  More information at
+  <http://linuxsh.sourceforge.net/docs/7750overdrive.php3>.
+
+HP620
+CONFIG_SH_HP620
+  Select HP620 if configuring for a HP jornada HP620.
+  More information (hardware only) at
+  <http://www.hp.com/jornada>.
+
+HP680
+CONFIG_SH_HP680
+  Select HP680 if configuring for a HP Jornada HP680.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/products/680>.
+
+HP690
+CONFIG_SH_HP690
+  Select HP690 if configuring for a HP Jornada HP690.
+  More information (hardware only)
+  at <http://www.hp.com/jornada/products/680>.
+
+CqREEK
+CONFIG_SH_CQREEK
+  Select CqREEK if configuring for a CqREEK SH7708 or SH7750.
+  More information at
+  <http://sources.redhat.com/ecos/hardware.html#SuperH>.
+
+DMIDA
+CONFIG_SH_DMIDA
+  Select DMIDA if configuring for a DataMyte 4000 Industrial
+  Digital Assistant. More information at <http://www.dmida.com>.
+
+EC3104
+CONFIG_SH_EC3104
+  Select EC3104 if configuring for a system with an Eclipse
+  International EC3104 chip, e.g. the Harris AD2000.
+
+Dreamcast
+CONFIG_SH_DREAMCAST
+  Select Dreamcast if configuring for a SEGA Dreamcast.
+  More information at
+  <http://www.m17n.org/linux-sh/dreamcast>.  There is a
+  Dreamcast project is at <http://linuxdc.sourceforge.net/>.
+
+BareCPU
+CONFIG_SH_UNKNOWN
+  "Bare CPU" aka "unknown" means an SH-based system which is not one
+  of the specific ones mentioned above, which means you need to enter
+  all sorts of stuff like CONFIG_MEMORY_START because the config
+  system doesn't already know what it is.  You get a machine vector
+  without any platform-specific code in it, so things like the RTC may
+  not work.
+
+  This option is for the early stages of porting to a new machine.
+
+# Choice: superhtype
+SH7707
+CONFIG_CPU_SUBTYPE_SH7707
+  Select the type of SuperH processor you have.
+
+  Select SH7707 if you have a  60 Mhz SH-3 HD6417707 CPU.
+
+  Select SH7708 if you have a  60 Mhz SH-3 HD6417708S or
+                if you have a 100 Mhz SH-3 HD6417708R CPU.
+
+  Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
+
+  Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
+
+SH7708
+CONFIG_CPU_SUBTYPE_SH7708
+  Select SH7708 if you have a  60 Mhz SH-3 HD6417708S or
+                if you have a 100 Mhz SH-3 HD6417708R CPU.
+
+SH7709
+CONFIG_CPU_SUBTYPE_SH7709
+  Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
+
+SH7750
+CONFIG_CPU_SUBTYPE_SH7750
+  Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
+
+Physical memory start address
+CONFIG_MEMORY_START
+  The physical memory start address will be automatically
+  set to 08000000, unless you selected one of the following
+  processor types: SolutionEngine, Overdrive, HP620, HP680, HP690,
+  in which case the start address will be set to 0c000000.
+
+  Tweak this only when porting to a new machine which is not already
+  known by the config system.  Changing it from the known correct
+  value on any of the known systems will only lead to disaster.
+
+Hitachi HD64461 companion chip support
+CONFIG_HD64461
+  The Hitachi HD64461 provides an interface for
+  the SH7709 CPU, supporting a LCD controller,
+  CRT color controller, IrDA up to 4 Mbps, and a
+  PCMCIA controller supporting 2 slots.
+
+  More information is available at
+  <http://semiconductor.hitachi.com/windowsce/superh/sld013.htm>.
+
+  Say Y if you want support for the HD64461.
+  Otherwise, say N.
+
+HD64461 PCMCIA enabler
+CONFIG_HD64461_ENABLER
+  Say Y here if you want to enable PCMCIA support
+  via the HD64461 companion chip.
+  Otherwise, say N.
+
+HD64461 virtualized IRQ number
+CONFIG_HD64461_IRQ
+  The default setting of the HD64461 IRQ is 36.
+
+  Do not change this unless you know what you are doing.
+
+Hitachi HD64465 companion chip support
+CONFIG_HD64465
+  The Hitachi HD64465 provides an interface for
+  the SH7750 CPU, supporting a LCD controller,
+  CRT color controller, IrDA, USB, PCMCIA,
+  keyboard controller, and a printer interface.
+
+  More information is available at
+  <http://global.hitachi.com/New/cnews/E/1998/981019B.html>.
+
+  Say Y if you want support for the HD64465.
+  Otherwise, say N.
+
+HD64465 virtualized IRQ number
+CONFIG_HD64465_IRQ
+  The default setting of the HD64465 IRQ is 5.
+
+  Do not change this unless you know what you are doing.
+
+HD64465 start address
+CONFIG_HD64465_IOBASE
+  The default setting of the HD64465 IO base address is 0xb0000000.
+
+  Do not change this unless you know what you are doing.
+
+Early printk support
+CONFIG_SH_EARLY_PRINTK
+  Say Y here to redirect kernel messages to the serial port
+  used by the SH-IPL bootloader, starting very early in the boot
+  process and ending when the kernel's serial console is initialised.
+  This option is only useful porting the kernel to a new machine,
+  when the kernel may crash or hang before the serial console is
+  initialised.
+
+SuperH SCI (serial) support
+CONFIG_SH_SCI
+  Selecting this option will allow the Linux kernel to transfer data
+  over SCI (Serial Communication Interface) and/or SCIF (Serial
+  Communication Interface with FIFO) which are built into the Hitachi
+  SuperH processor.  The option provides 1 to 3 (depending
+  on the CPU model) standard Linux tty devices, /dev/ttySC[012]; one
+  of these is normally used as the system console.
+
+  If in doubt, press "y".
+
+Use LinuxSH standard BIOS
+CONFIG_SH_STANDARD_BIOS
+  Say Y here if your target has the gdb-sh-stub
+  package from www.m17n.org (or any conforming standard LinuxSH BIOS)
+  in FLASH or EPROM.  The kernel will use standard BIOS calls during
+  boot for various housekeeping tasks (including calls to read and
+  write characters to a system console, get a MAC address from an
+  on-board Ethernet interface, and shut down the hardware).  Note this
+  does not work with machines with an existing operating system in
+  mask ROM and no flash (WindowsCE machines fall in this category).
+  If unsure, say N.
+
+GDB Stub kernel debug
+CONFIG_DEBUG_KERNEL_WITH_GDB_STUB
+  If you say Y here, it will be possible to remotely debug the SuperH
+  kernel using gdb, if you have the gdb-sh-stub package from
+  www.m17n.org (or any conforming standard LinuxSH BIOS) in FLASH or
+  EPROM.  This enlarges your kernel image disk size by several
+  megabytes but allows you to load, run and debug the kernel image
+  remotely using gdb.  This is only useful for kernel hackers.  If
+  unsure, say N.
+
+Console output to GDB
+CONFIG_GDB_CONSOLE
+  If you are using GDB for remote debugging over a serial port and
+  would like kernel messages to be formatted into GDB $O packets so
+  that GDB prints them as program output, say 'Y'.
+
 #
 # A couple of things I keep forgetting:
-#   capitalize: AppleTalk, Ethernet, DOS, DMA, FAT, FTP, Internet, 
-#               Intel, IRQ, ISDN, Linux, MSDOS, NetWare, NetWinder, 
+#   capitalize: AppleTalk, Ethernet, DOS, DMA, FAT, FTP, Internet,
+#               Intel, IRQ, ISDN, Linux, MSDOS, NetWare, NetWinder,
 #               NFS, PCI, SCSI, SPARC
-#   two words:  file system, hard drive, hard disk, home page, 
+#   two words:  file system, hard drive, hard disk, home page,
 #               user space, web site
 #   other:      it's safe to save; daemon; use --, not - or ---;
 #               use KB for 1024 bytes, not kB or K.
@@ -19195,13 +23937,13 @@
 # LocalWords:  CONFIG coprocessor DX Pentium SX lilo loadlin HOWTO ftp metalab
 # LocalWords:  unc edu docs emu README kB BLK DEV FD Thinkpad fd MFM RLL IDE gz
 # LocalWords:  cdrom diskless netboot nfs xzvf ATAPI MB ide pavia rubini pl pd
-# LocalWords:  HD CDROMs IDECD NEC MITSUMI filesystem XT XD PCI BIOS cezar ATEN
+# LocalWords:  HD CD-ROMs IDECD NEC MITSUMI filesystem XT XD PCI BIOS cezar ATEN
 # LocalWords:  ISA EISA Microchannel VESA BIOSes IPC SYSVIPC ipc Ctrl dmesg hlt
 # LocalWords:  BINFMT Linkable http ac uk jo html GCC SPARC AVANTI CABRIOLET EB
 # LocalWords:  netscape gcc LD CC toplevel MODVERSIONS insmod rmmod modprobe IP
-# LocalWords:  genksyms INET loopback gatewaying ethernet PPP ARP Arp MEMSIZE
+# LocalWords:  genksyms INET loopback gatewaying Ethernet PPP ARP Arp MEMSIZE
 # LocalWords:  howto multicasting MULTICAST MBONE firewalling ipfw ACCT resp ip
-# LocalWords:  proc acct IPIP encapsulator decapsulator klogd PCTCP RARP EXT PS
+# LocalWords:  proc acct IPIP encapsulator decapsulator klogd RARP EXT PS
 # LocalWords:  telnetting subnetted NAGLE rlogin NOSR ttyS TGA techinfo mbone nl
 # LocalWords:  Mb SKB IPX Novell dosemu DDP ATALK vmalloc visar ehome
 # LocalWords:  SD CHR scsi thingy SG CD LUNs LUN jukebox Adaptec BusLogic EATA
@@ -19255,11 +23997,11 @@
 # LocalWords:  FC DC dc PPA IOMEGA's ppa RNFS FMV Fujitsu ARPD arpd loran layes
 # LocalWords:  FRAD indiana framerelay DLCI DCLIs Sangoma SDLA mrouted sync sec
 # LocalWords:  Starmode Metricom MosquitoNet mosquitonet kbit nfsroot Digiboard
-# LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens mtu ethernets HBAs MEX
+# LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens mtu Ethernets HBAs MEX
 # LocalWords:  Shifflett netcom js jshiffle WIC DECchip ELCP EtherPower dst RTC
 # LocalWords:  rtc SMP lp Digi Intl RightSwitch DGRS dgrs AFFS Amiga UFS SDL AP
 # LocalWords:  Solaris RISCom riscom syncPPP PCBIT pcbit sparc anu au artoo MFB
-# LocalWords:  hitchcock Crynwr cnam pktdrvr NCSA's CyDROM CyCDROM FreeBSD NeXT
+# LocalWords:  hitchcock Crynwr cnam pktdrvr NCSA's CyDROM CyCD-ROM FreeBSD NeXT
 # LocalWords:  NeXTstep disklabel disklabels SMD FFS tm AmigaOS diskfiles Un IQ
 # LocalWords:  Bernd informatik rwth aachen uae affs multihosting bytecode java
 # LocalWords:  applets applet JDK ncsa cabi SNI Alphatronix readme LANs scarab
@@ -19275,7 +24017,7 @@
 # LocalWords:  mgetty sendfax gert greenie muc lowlevel Lasermate LanManager io
 # LocalWords:  OOPSes trackball binghamton mobileip ncr IOMAPPED settags ns ser
 # LocalWords:  setsync NEGO MPARITY autotuning prefetch PIIX cdwrite utils rc
-# LocalWords:  PCWATCHDOG berkprod bitgate boldt ucsb jf kyoto jp euc Tetsuyasu 
+# LocalWords:  PCWATCHDOG berkprod bitgate boldt ucsb jf kyoto jp euc Tetsuyasu
 # LocalWords:  YAMADA tetsu cauchy nslab ntt nevod perm su doc kaf kheops wsc
 # LocalWords:  traduc Bourgin dbourgin menuconfig kfill READMEs HOWTOs Virge WA
 # LocalWords:  IDEDISK IDEFLOPPY EIDE firewalls QMAGIC ZMAGIC LocalWords opti
@@ -19338,7 +24080,7 @@
 # LocalWords:  prio Micom xIO dwmw rimi OMIRR omirr omirrd unicode ntfs cmu NIC
 # LocalWords:  Braam braam Schmidt's freiburg nls codepages codepage Romanian
 # LocalWords:  Slovak Slovenian Sorbian Nordic iso Catalan Faeroese Galician SZ
-# LocalWords:  Valencian Slovene Esperanto Estonian Latvian Byelorussian KOI mt
+# LocalWords:  Valencian Slovene Esperanto Estonian Latvian Belarusian KOI mt
 # LocalWords:  charset Inuit Greenlandic Sami Lappish koi Alexey Kuznetsov's sa
 # LocalWords:  Specialix specialix DTR RTS RTSCTS cycladesZ Exabyte ftape's inr
 # LocalWords:  Iomega's LBFM claus ZFTAPE VFS zftape zft William's lzrw DFLT kb
@@ -19404,7 +24146,7 @@
 # LocalWords:  uit dagb irda LSAP IrLMP RR's IrLAP IR alloc skb's kfree skb's
 # LocalWords:  GZIP IrLAN NetbeamIR ESI JetEye IrOBEX IrCOMM TTY's minicom dti
 # LocalWords:  ircomm ircomm pluto thiguchi IrTTY Linux's bps NetWinder MIR NSC
-# LocalWords:  ACTiSYS Dongle dongle dongles esi actisys IrMate tekram BVM MVME
+# LocalWords:  ACTiSYS dongle dongles esi actisys IrMate tekram BVM MVME
 # LocalWords:  BVME BVME WRITETHROUGH copyback writethrough fwmark syncookie tu
 # LocalWords:  alphalinux GOBIOS csn chemnitz nat ACARD AMI MegaRAID megaraid
 # LocalWords:  QNXFS ISI isicom xterms Apollos VPN RCPCI rcpci sgi visws pcmcia
@@ -19416,7 +24158,7 @@
 # LocalWords:  SKMC USB UHCI OHCI intel compaq usb ohci HCD Virt Compaq's hcd
 # LocalWords:  VROOTHUB KBD ARRs MCRs NWBUTTON nwbutton NUM WaveArtist APNE cpu
 # LocalWords:  apne blackhawke PlanB lu mlan planb NWFPE FPA nwfpe unbootable
-# LocalWords:  FPEmulator ds vmlinux initialisation discardable pgtable PGT mdw
+# LocalWords:  FPEmulator ds vmlinux initialization discardable pgtable PGT mdw
 # LocalWords:  quicklist pagetable arthur StrongARM podule podules Autodetect
 # LocalWords:  dodgy IrPORT irport Litelink litelink SuSE rtfm internet hda CY
 # LocalWords:  multmode DriveReady SeekComplete DriveStatusError miscompile AEC
@@ -19445,7 +24187,7 @@
 # LocalWords:  VWSND eg ESSSOLO CFU CFNR scribed eiconctrl eicon hylafax KFPU
 # LocalWords:  EXTRAPREC fpu mainboards KHTTPD kHTTPd khttpd Xcelerator SBNI tw
 # LocalWords:  LOGIBUSMOUSE Granch granch sbni Raylink NOHIGHMEM Athlon SIM sim
-# LocalWords:  hpl Tourrilhes DuraLAN starfile Davicom davicom dmfe auk tms tr
+# LocalWords:  hpl Tourrilhes DuraLAN starfire Davicom davicom dmfe auk tms tr
 # LocalWords:  TokenExpress Belkin Peracom eTek DVDs infradead Cxxx Adlib AV ZX
 # LocalWords:  NeoMagic CPi CPt Celeron decapsulation Undeletion BFS bfs nVidia
 # LocalWords:  OnStream Irongate Riva phonedev QuickNet LineJack PhoneJack IXJ
@@ -19465,7 +24207,7 @@
 # LocalWords:  DEVS FireWire PCILynx pcilynx LOCALRAM miro's DV RAWIO GRED Mk
 # LocalWords:  Diffserv DSMARK Ingress Qdisc TCINDEX TMSPCI tmspci Ringode JE
 # LocalWords:  MADGEMC madgemc TokenRing SMCTR TokenCard smctr Wacom Graphire
-# LocalWords:  WMFORCE mousedev ConnectTech HandSpring Xirlink IBMCAM ibmcam SN
+# LocalWords:  mousedev ConnectTech HandSpring Xirlink IBMCAM ibmcam SN
 # LocalWords:  DEVICEFS yyy Cymraeg Dwave SIMM JSFLASH JavaStation's multilink
 # LocalWords:  nsc ircc DDB Vrc CMN TB PROMs Vino rivafb DDC Matroxes MGA TVO
 # LocalWords:  MAVEN fbdev crtc maven matroxset NTSC PCA SBA AAL SKFP DAS SAS
@@ -19495,3 +24237,11 @@
 # LocalWords:  DMX Domex dmx wellington ftdi sio Accton Billington Corega FEter
 # LocalWords:  MELCO LUA PNA Linksys SNC chkdsk AWACS Webcam RAMFS Ramfs ramfs
 # LocalWords:  ramfiles MAKEDEV pty WDTPCI APA apa
+#
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# case-fold-search:nil
+# fill-prefix:"  "
+# adaptive-fill:nil
+# fill-column:70
+# End:
diff -u --recursive --new-file v2.4.14/linux/Documentation/DocBook/via-audio.tmpl linux/Documentation/DocBook/via-audio.tmpl
--- v2.4.14/linux/Documentation/DocBook/via-audio.tmpl	Wed Jul 25 17:10:16 2001
+++ linux/Documentation/DocBook/via-audio.tmpl	Fri Nov  9 13:45:35 2001
@@ -68,7 +68,7 @@
 	support are not yet available.
   </para>
   <para>
-  	This driver supports any Linux kernel version after 2.3.50.
+  	This driver supports any Linux kernel version after 2.4.10.
   </para>
   <para>
 	Please send bug reports to the mailing list <email>linux-via@gtf.org</email>.
@@ -157,14 +157,6 @@
     </para>
     </listitem></varlistentry>
 
-    <varlistentry><term>RealPlayer trouble</term>
-    <listitem>
-    <para>
-	RealPlayer output very scratchy.  Workaround:  use esd, and
-	configure RealPlayer to output to esd.
-    </para>
-    </listitem></varlistentry>
-
   </variablelist>
 	
   </para>
@@ -191,6 +183,9 @@
 	MMAP support, and several other notable fixes that resulted from
 	his hard work and testing.
   </para>
+  <para>
+  	Thomas Sailer for further bugfixes.
+  </para>
   </chapter>
   
   <chapter id="notes">
@@ -233,6 +228,31 @@
 
   <chapter id="changelog">
       <title>Driver ChangeLog</title>
+
+<sect1 id="version191"><title>
+Version 1.9.1
+</title>
+  <itemizedlist spacing=compact>
+   <listitem>
+    <para>
+    DSP read/write bugfixes from Thomas Sailer.
+    </para>
+   </listitem>
+
+   <listitem>
+    <para>
+    Add new PCI id for single-channel use of Via 8233.
+    </para>
+   </listitem>
+
+   <listitem>
+    <para>
+    Other bug fixes, tweaks, new ioctls.
+    </para>
+   </listitem>
+
+  </itemizedlist>
+</sect1>
 
 <sect1 id="version1115"><title>
 Version 1.1.15
diff -u --recursive --new-file v2.4.14/linux/Documentation/devices.txt linux/Documentation/devices.txt
--- v2.4.14/linux/Documentation/devices.txt	Mon Aug 27 12:41:37 2001
+++ linux/Documentation/devices.txt	Wed Nov  7 14:46:01 2001
@@ -971,7 +971,7 @@
 		  0 = /dev/rd/c0d0	First disk, whole disk
 		  8 = /dev/rd/c0d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c0d15	32nd disk, whole disk
+		248 = /dev/rd/c0d31	32nd disk, whole disk
 
 		For partitions add:
 		  0 = /dev/rd/c?d?	Whole disk
diff -u --recursive --new-file v2.4.14/linux/Documentation/fb/clgenfb.txt linux/Documentation/fb/clgenfb.txt
--- v2.4.14/linux/Documentation/fb/clgenfb.txt	Thu Jan  6 10:23:46 2000
+++ linux/Documentation/fb/clgenfb.txt	Mon Nov 19 15:19:42 2001
@@ -35,11 +35,18 @@
 At the moment, there are two kernel command line arguments supported:
 
 mode:640x480
+mode:800x600
 	or
 mode:1024x768
 
 Full support for startup video modes (modedb) will be integrated soon.
 
+Version 1.9.9.1
+---------------
+* Fix memory detection for 512kB case
+* 800x600 mode
+* Fixed timings
+* Hint for AXP: Use -accel false -vyres -1 when changing resolution
 
 
 Version 1.9.4.4
diff -u --recursive --new-file v2.4.14/linux/Documentation/filesystems/proc.txt linux/Documentation/filesystems/proc.txt
--- v2.4.14/linux/Documentation/filesystems/proc.txt	Fri Apr  6 10:42:48 2001
+++ linux/Documentation/filesystems/proc.txt	Wed Nov  7 14:39:36 2001
@@ -471,6 +471,11 @@
   ...] 1375103    17405    0    0    0     0       0          0 
   ...] 1703981     5535    0    0    0     3       0          0 
 
+In addition, each Channel Bond interface has it's own directory.  For
+example, the bond0 device will have a directory called /proc/net/bond0/.
+It will contain information that is specific to that bond, such as the
+current slaves of the bond, the link status of the slaves, and how
+many times the slaves link has failed.
 
 1.5 SCSI info
 -------------
diff -u --recursive --new-file v2.4.14/linux/Documentation/i386/boot.txt linux/Documentation/i386/boot.txt
--- v2.4.14/linux/Documentation/i386/boot.txt	Wed Apr 11 18:50:25 2001
+++ linux/Documentation/i386/boot.txt	Wed Nov  7 14:46:01 2001
@@ -2,7 +2,7 @@
 		     ----------------------------
 
 		    H. Peter Anvin <hpa@zytor.com>
-			Last update 2000-07-27
+			Last update 2000-10-29
 
 On the i386 platform, the Linux kernel uses a rather complicated boot
 convention.  This has evolved partially due to historical aspects, as
@@ -145,6 +145,9 @@
 most of the fields in the header.  The following fields should be
 filled out, however:
 
+  vid_mode:
+	Please see the section on SPECIAL COMMAND LINE OPTIONS.
+
   type_of_loader:
 	If your boot loader has an assigned id (see table below), enter
 	0xTV here, where T is an identifier for the boot loader and V is
@@ -319,8 +322,8 @@
 
   mem=<size>
 	<size> is an integer in C notation optionally followed by K, M
-	or G (meaning << 10, << 20 or << 30).  This specifies to the
-	kernel the memory size.  This affects the possible placement
+	or G (meaning << 10, << 20 or << 30).  This specifies the end
+	of memory to the kernel. This affects the possible placement
 	of an initrd, since an initrd should be placed near end of
 	memory.  Note that this is an option to *both* the kernel and
 	the bootloader!
@@ -392,8 +395,8 @@
 appropriate time.  The use of these hooks should probably be
 considered an absolutely last resort!
 
-IMPORTANT: All the hooks are required to preserve %ebp, %esi and %edi
-across invocation.
+IMPORTANT: All the hooks are required to preserve %esp, %ebp, %esi and
+%edi across invocation.
 
   realmode_swtch:
 	A 16-bit real mode far subroutine invoked immediately before
diff -u --recursive --new-file v2.4.14/linux/Documentation/memory.txt linux/Documentation/memory.txt
--- v2.4.14/linux/Documentation/memory.txt	Tue Dec 22 08:31:07 1998
+++ linux/Documentation/memory.txt	Fri Nov  9 13:58:02 2001
@@ -37,7 +37,7 @@
 	* Not overclocking your CPU.
 
 	* Having the memory tested in a memory tester or exchanged
-	  with the vendor.
+	  with the vendor. Consider testing it with memtest86 yourself.
 	
 	* Exchanging your CPU, cache, or motherboard for one that works.
 
diff -u --recursive --new-file v2.4.14/linux/Documentation/networking/8139too.txt linux/Documentation/networking/8139too.txt
--- v2.4.14/linux/Documentation/networking/8139too.txt	Mon Nov  5 15:55:25 2001
+++ linux/Documentation/networking/8139too.txt	Fri Nov  9 13:45:35 2001
@@ -82,7 +82,7 @@
 
 	(overwrite 8139too driver in kernel tree with different version)
 	1) cp 8139too.c $my_source_tree/drivers/net/8139too.c
-	
+
 OPTION 2: Build outside kernel tree
 
 	Use the included Makefile.
@@ -139,7 +139,7 @@
 
 Submitting Bug Reports
 ----------------------
-Obtain and compile the modified rtl8139-diag source code from the 
+Obtain and compile the modified rtl8139-diag source code from the
 8139too driver Web site, http://sourceforge.net/projects/gkernel/
 This diagnostics programs, originally from Donald Becker, has been
 modified to display all registers on your RTL8139 chip, not just the
@@ -181,6 +181,27 @@
 Change History
 --------------
 
+Version 0.9.22 - November 8, 2001
+
+* Additional retries before aborting Tx
+* Do not write other TxConfig bits when writing clear-abort bit.
+* Ack TxErr intr status after each Tx abort, too.
+
+
+Version 0.9.21 - November 1, 2001
+
+* Disable early Rx, it hurts performance and creates races.
+* Remove DPRINTK macro function tracing.
+* Better interrupt sharing behavior.
+* Acknowledge PCI errors.
+* Remove early-Rx acknowledgement, unnecessary
+* Remove code for uncommon case where Tx packets are
+  properly aligned, and do not need to be copied.
+  Tx packets are now always copied into a static DMA buffer,
+  which is allocated at interface open.
+* Fix problems with kernel thread exit.
+
+
 Version 0.9.20 - October 18, 2001
 
 * Print out notice when 8139C+ chip is detected
@@ -212,7 +233,7 @@
 Version 0.9.17 - May 7, 2001
 
 * Fix chipset wakeup bug which prevent media connection for 8139B
-* Print out "media is unconnected..." instead of 
+* Print out "media is unconnected..." instead of
   "partner ability 0000"
 
 
diff -u --recursive --new-file v2.4.14/linux/Documentation/networking/bonding.txt linux/Documentation/networking/bonding.txt
--- v2.4.14/linux/Documentation/networking/bonding.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/networking/bonding.txt	Wed Nov  7 14:39:36 2001
@@ -0,0 +1,524 @@
+
+                   Linux Ethernet Bonding Driver mini-howto
+
+Initial release : Thomas Davis <tadavis at lbl.gov>
+Corrections, HA extensions : 2000/10/03-15 :
+  - Willy Tarreau <willy at meta-x.org>
+  - Constantine Gavrilov <const-g at xpert.com>
+  - Chad N. Tindel <ctindel at ieee dot org>
+  - Janice Girouard <girouard at us dot ibm dot com>
+
+Note :
+------
+The bonding driver originally came from Donald Becker's beowulf patches for
+kernel 2.0. It has changed quite a bit since, and the original tools from
+extreme-linux and beowulf sites will not work with this version of the driver.
+
+For new versions of the driver, patches for older kernels and the updated
+userspace tools, please follow the links at the end of this file.
+
+Installation
+============
+
+1) Build kernel with the bonding driver
+---------------------------------------
+For the latest version of the bonding driver, use kernel 2.4.12 or above
+(otherwise you will need to apply a patch).
+
+Configure kernel with `make menuconfig/xconfig/config', and select
+"Bonding driver support" in the "Network device support" section. It is
+recommended to configure the driver as module since it is currently the only way
+to pass parameters to the driver and configure more than one bonding device.
+
+Build and install the new kernel and modules.
+
+2) Get and install the userspace tools
+--------------------------------------
+This version of the bonding driver requires updated ifenslave program. The
+original one from extreme-linux and beowulf will not work. Kernels 2.4.12
+and above include the updated version of ifenslave.c in Documentation/network
+directory. For older kernels, please follow the links at the end of this file.
+
+IMPORTANT!!!  If you are running on Redhat 7.1 or greater, you need
+to be careful because /usr/include/linux is no longer a symbolic link
+to /usr/src/linux/include/linux.  If you build ifenslave while this is
+true, ifenslave will appear to succeed but your bond won't work.  The purpose
+of the -I option on the ifenslave compile line is to make sure it uses
+/usr/src/linux/include/linux/if_bonding.h instead of the version from
+/usr/include/linux.
+
+To install ifenslave.c, do:
+    # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave 
+    # cp ifenslave /sbin/ifenslave
+
+3) Configure your system
+------------------------
+Also see the following section on the module parameters. You will need to add
+at least the following line to /etc/conf.modules (or /etc/modules.conf):
+
+	alias bond0 bonding
+
+Use standard distribution techniques to define bond0 network interface. For
+example, on modern RedHat distributions, create ifcfg-bond0 file in
+/etc/sysconfig/network-scripts directory that looks like this:
+
+DEVICE=bond0
+IPADDR=192.168.1.1
+NETMASK=255.255.255.0
+NETWORK=192.168.1.0
+BROADCAST=192.168.1.255
+ONBOOT=yes
+BOOTPROTO=none
+USERCTL=no
+
+(put the appropriate values for you network instead of 192.168.1).
+
+All interfaces that are part of the trunk, should have SLAVE and MASTER
+definitions. For example, in the case of RedHat, if you wish to make eth0 and
+eth1 (or other interfaces) a part of the bonding interface bond0, their config
+files (ifcfg-eth0, ifcfg-eth1, etc.) should look like this:
+
+DEVICE=eth0
+USERCTL=no
+ONBOOT=yes
+MASTER=bond0
+SLAVE=yes
+BOOTPROTO=none
+
+(use DEVICE=eth1 for eth1 and MASTER=bond1 for bond1 if you have configured
+second bonding interface). 
+
+Restart the networking subsystem or just bring up the bonding device if your
+administration tools allow it. Otherwise, reboot. (For the case of RedHat
+distros, you can do `ifup bond0' or `/etc/rc.d/init.d/network restart'.)
+
+If the administration tools of your distribution do not support master/slave
+notation in configuration of network interfaces, you will need to configure
+the bonding device with the following commands manually:
+
+    # /sbin/ifconfig bond0 192.168.1.1 up
+    # /sbin/ifenslave bond0 eth0
+    # /sbin/ifenslave bond0 eth1
+
+(substitute 192.168.1.1 with your IP address and add custom network and custom
+netmask to the arguments of ifconfig if required).
+
+You can then create a script with these commands and put it into the appropriate
+rc directory.
+
+If you specifically need that all your network drivers are loaded before the
+bonding driver, use one of modutils' powerful features : in your modules.conf,
+tell that when asked for bond0, modprobe should first load all your interfaces :
+
+probeall bond0 eth0 eth1 bonding
+
+Be careful not to reference bond0 itself at the end of the line, or modprobe will
+die in an endless recursive loop.
+
+4) Module parameters.
+---------------------
+The following module parameters can be passed:
+
+    mode=
+
+Possible values are 0 (round robin policy, default) and 1 (active backup
+policy), and 2 (XOR).  See question 9 and the HA section for additional info.
+
+    miimon=
+
+Use integer value for the frequency (in ms) of MII link monitoring. Zero value
+is default and means the link monitoring will be disabled. A good value is 100
+if you wish to use link monitoring. See HA section for additional info.
+
+    downdelay=
+
+Use integer value for delaying disabling a link by this number (in ms) after
+the link failure has been detected. Must be a multiple of miimon. Default
+value is zero. See HA section for additional info.
+
+    updelay=
+
+Use integer value for delaying enabling a link by this number (in ms) after
+the "link up" status has been detected. Must be a multiple of miimon. Default
+value is zero. See HA section for additional info.
+
+    arp_interval=
+
+Use integer value for the frequency (in ms) of arp monitoring.  Zero value 
+is default and means the arp monitoring will be disabled.  See HA section
+for additional info.   This field is value in active_backup mode only.
+
+    arp_ip_target=
+
+An ip address to use when arp_interval is > 0.  This is the target of the
+arp request sent to determine the health of the link to the target.  
+Specify this value in ddd.ddd.ddd.ddd format.
+
+If you need to configure several bonding devices, the driver must be loaded
+several times. I.e. for two bonding devices, your /etc/conf.modules must look
+like this:
+
+alias bond0 bonding
+alias bond1 bonding
+
+options bond0 miimon=100
+options bond1 -o bonding1 miimon=100
+
+5) Testing configuration
+------------------------
+You can test the configuration and transmit policy with ifconfig. For example,
+for round robin policy, you should get something like this:
+
+[root]# /sbin/ifconfig
+bond0     Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
+          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
+          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
+          RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
+          collisions:0 txqueuelen:0 
+
+eth0      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
+          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
+          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
+          RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
+          collisions:0 txqueuelen:100 
+          Interrupt:10 Base address:0x1080 
+
+eth1      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
+          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
+          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
+          RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:100 
+          Interrupt:9 Base address:0x1400 
+
+Questions :
+===========
+
+1.  Is it SMP safe?
+
+	Yes.  The old 2.0.xx channel bonding patch was not SMP safe.
+	The new driver was designed to be SMP safe from the start.
+
+2.  What type of cards will work with it?
+
+	Any Ethernet type cards (you can even mix cards - a Intel
+	EtherExpress PRO/100 and a 3com 3c905b, for example).
+	You can even bond together Gigabit Ethernet cards!
+
+3.  How many bonding devices can I have?
+
+	One for each module you load. See section on module parameters for how
+	to accomplish this.
+
+4.  How many slaves can a bonding device have?
+
+	Limited by the number of network interfaces Linux supports and the
+	number of cards you can place in your system.
+
+5.  What happens when a slave link dies?
+
+	If your ethernet cards support MII status monitoring and the MII
+	monitoring has been enabled in the driver (see description of module
+	parameters), there will be no adverse consequences. This release
+	of the bonding driver knows how to get the MII information and
+	enables or disables its slaves according to their link status.
+	See section on HA for additional information.
+
+	For ethernet cards not supporting MII status, or if you wish to 
+	verify that packets have been both send and received, you may
+	configure the arp_interval and arp_ip_target.  If packets have
+	not been sent or received during this interval, an arp request
+	is sent to the target to generate send and receive traffic.  
+	If after this interval, either the successful send and/or 
+	receive count has not incremented, the next slave in the sequence
+	will become the active slave.
+
+	If neither mii_monitor and arp_interval is configured, the bonding
+	driver will not handle this situation very well. The driver will 
+	continue to send packets but some packets will be lost. Retransmits 
+	will cause serious degradation of performance (in the case when one
+	of two slave links fails, 50% packets will be lost, which is a serious
+	problem for both TCP and UDP).
+
+6.  Can bonding be used for High Availability?
+
+	Yes, if you use MII monitoring and ALL your cards support MII link
+	status reporting. See section on HA for more information.
+
+7.  Which switches/systems does it work with?
+
+	In round-robin mode, it works with systems that support trunking:
+	
+	* Cisco 5500 series (look for EtherChannel support).
+	* SunTrunking software.
+	* Alteon AceDirector switches / WebOS (use Trunks).
+	* BayStack Switches (trunks must be explicitly configured). Stackable
+	  models (450) can define trunks between ports on different physical
+	  units.
+	* Linux bonding, of course !
+	
+	In Active-backup mode, it should work with any Layer-II switches.
+
+8.  Where does a bonding device get its MAC address from?
+
+	If not explicitly configured with ifconfig, the MAC address of the
+	bonding device is taken from its first slave device. This MAC address
+	is then passed to all following slaves and remains persistent (even if
+	the the first slave is removed) until the bonding device is brought
+	down or reconfigured.
+	
+	If you wish to change the MAC address, you can set it with ifconfig:
+
+	  # ifconfig bond0 ha ether 00:11:22:33:44:55
+
+	The MAC address can be also changed by bringing down/up the device
+	and then changing its slaves (or their order):
+	
+	  # ifconfig bond0 down ; modprobe -r bonding
+	  # ifconfig bond0 .... up
+	  # ifenslave bond0 eth...
+
+	This method will automatically take the address from the next slave
+	that will be added.
+	
+	To restore your slaves' MAC addresses, you need to detach them
+	from the bond (`ifenslave -d bond0 eth0'), set them down
+	(`ifconfig eth0 down'), unload the drivers (`rmmod 3c59x', for
+	example) and reload them to get the MAC addresses from their
+	eeproms. If the driver is shared by several devices, you need
+	to turn them all down. Another solution is to look for the MAC
+	address at boot time (dmesg or tail /var/log/messages) and to
+	reset it by hand with ifconfig :
+
+	  # ifconfig eth0 down
+	  # ifconfig eth0 hw ether 00:20:40:60:80:A0
+
+9.  Which transmit polices can be used?
+
+	Round robin, based on the order of enslaving, the output device
+	is selected base on the next available slave.  Regardless of
+	the source and/or destination of the packet.
+
+	XOR, based on (src hw addr XOR dst hw addr) % slave cnt.  This
+	selects the same slave for each destination hw address.
+
+	Active-backup policy that ensures that one and only one device will
+	transmit at any given moment. Active-backup policy is useful for
+	implementing high availability solutions using two hubs (see
+	section on HA).
+
+High availability
+=================
+
+To implement high availability using the bonding driver, you need to
+compile the driver as module because currently it is the only way to pass
+parameters to the driver. This may change in the future.
+
+High availability is achieved by using MII status reporting. You need to
+verify that all your interfaces support MII link status reporting. On Linux
+kernel 2.2.17, all the 100 Mbps capable drivers and yellowfin gigabit driver
+support it. If your system has an interface that does not support MII status
+reporting, a failure of its link will not be detected!
+
+The bonding driver can regularly check all its slaves links by checking the
+MII status registers. The check interval is specified by the module argument
+"miimon" (MII monitoring). It takes an integer that represents the
+checking time in milliseconds. It should not come to close to (1000/HZ)
+(10 ms on i386) because it may then reduce the system interactivity. 100 ms
+seems to be a good value. It means that a dead link will be detected at most
+100 ms after it goes down.
+
+Example:
+
+   # modprobe bonding miimon=100
+
+Or, put in your /etc/modules.conf :
+
+   alias bond0 bonding
+   options bond0 miimon=100
+
+There are currently two policies for high availability, depending on whether
+a) hosts are connected to a single host or switch that support trunking
+b) hosts are connected to several different switches or a single switch that
+   does not support trunking.
+
+1) HA on a single switch or host - load balancing
+-------------------------------------------------
+It is the easiest to set up and to understand. Simply configure the
+remote equipment (host or switch) to aggregate traffic over several
+ports (Trunk, EtherChannel, etc.) and configure the bonding interfaces.
+If the module has been loaded with the proper MII option, it will work
+automatically. You can then try to remove and restore different links
+and see in your logs what the driver detects. When testing, you may
+encounter problems on some buggy switches that disable the trunk for a
+long time if all ports in a trunk go down. This is not Linux, but really
+the switch (reboot it to ensure).
+
+Example 1 : host to host at double speed
+
+          +----------+                          +----------+
+          |          |eth0                  eth0|          |
+          | Host A   +--------------------------+  Host B  |
+          |          +--------------------------+          |
+          |          |eth1                  eth1|          |
+          +----------+                          +----------+
+
+  On each host :
+     # modprobe bonding miimon=100
+     # ifconfig bond0 addr
+     # ifenslave bond0 eth0 eth1
+
+Example 2 : host to switch at double speed
+
+          +----------+                          +----------+
+          |          |eth0                 port1|          |
+          | Host A   +--------------------------+  switch  |
+          |          +--------------------------+          |
+          |          |eth1                 port2|          |
+          +----------+                          +----------+
+
+  On host A :                             On the switch :
+     # modprobe bonding miimon=100           # set up a trunk on port1
+     # ifconfig bond0 addr                     and port2
+     # ifenslave bond0 eth0 eth1
+
+2) HA on two or more switches (or a single switch without trunking support)
+---------------------------------------------------------------------------
+This mode is more problematic because it relies on the fact that there
+are multiple ports and the host's MAC address should be visible on one
+port only to avoid confusing the switches.
+
+If you need to know which interface is the active one, and which ones are
+backup, use ifconfig. All backup interfaces have the NOARP flag set.
+
+To use this mode, pass "mode=1" to the module at load time :
+
+    # modprobe bonding miimon=100 mode=1
+
+Or, put in your /etc/modules.conf :
+
+    alias bond0 bonding
+    options bond0 miimon=100 mode=1
+
+Example 1: Using multiple host and multiple switches to build a "no single
+point of failure" solution.
+
+
+                |                                     |
+                |port3                           port3|
+          +-----+----+                          +-----+----+
+          |          |port7       ISL      port7|          |
+          | switch A +--------------------------+ switch B |
+          |          +--------------------------+          |
+          |          |port8                port8|          |
+          +----++----+                          +-----++---+
+          port2||port1                           port1||port2
+               ||             +-------+               ||
+               |+-------------+ host1 +---------------+|
+               |         eth0 +-------+ eth1           |
+               |                                       |
+               |              +-------+                |
+               +--------------+ host2 +----------------+
+                         eth0 +-------+ eth1
+
+In this configuration, there are an ISL - Inter Switch Link (could be a trunk),
+several servers (host1, host2 ...) attached to both switches each, and one or
+more ports to the outside world (port3...). One an only one slave on each host
+is active at a time, while all links are still monitored (the system can
+detect a failure of active and backup links).
+
+Each time a host changes its active interface, it sticks to the new one until
+it goes down. In this example, the hosts are not too much affected by the
+expiration time of the switches' forwarding tables.
+
+If host1 and host2 have the same functionality and are used in load balancing
+by another external mechanism, it is good to have host1's active interface
+connected to one switch and host2's to the other. Such system will survive
+a failure of a single host, cable, or switch. The worst thing that may happen
+in the case of a switch failure is that half of the hosts will be temporarily
+unreachable until the other switch expires its tables. 
+
+Example 2: Using multiple ethernet cards connected to a switch to configure
+           NIC failover (switch is not required to support trunking). 
+
+
+          +----------+                          +----------+
+          |          |eth0                 port1|          |
+          | Host A   +--------------------------+  switch  |
+          |          +--------------------------+          |
+          |          |eth1                 port2|          |
+          +----------+                          +----------+
+
+  On host A :                                 On the switch :
+     # modprobe bonding miimon=100 mode=1     # (optional) minimize the time
+     # ifconfig bond0 addr                    # for table expiration
+     # ifenslave bond0 eth0 eth1
+
+Each time the host changes its active interface, it sticks to the new one until
+it goes down. In this example, the host is strongly affected by the expiration
+time of the switch forwarding table.
+
+3) Adapting to your switches' timing
+------------------------------------
+If your switches take a long time to go into backup mode, it may be
+desirable not to activate a backup interface immediately after a link goes
+down. It is possible to delay the moment at which a link will be
+completely disabled by passing the module parameter "downdelay" (in
+milliseconds, must be a multiple of miimon).
+
+When a switch reboots, it is possible that its ports report "link up" status
+before they become usable. This could fool a bond device by causing it to
+use some ports that are not ready yet. It is possible to delay the moment at
+which an active link will be reused by passing the module parameter "updelay"
+(in milliseconds, must be a multiple of miimon).
+
+A similar situation can occur when a host re-negotiates a lost link with the
+switch (a case of cable replacement).
+
+A special case is when a bonding interface has lost all slave links. Then the
+driver will immediately reuse the first link that goes up, even if updelay
+parameter was specified. (If there are slave interfaces in the "updelay" state,
+the interface that first went into that state will be immediately reused.) This
+allows to reduce down-time if the value of updelay has been overestimated.
+
+Examples :
+
+    # modprobe bonding miimon=100 mode=1 downdelay=2000 updelay=5000
+    # modprobe bonding miimon=100 mode=0 downdelay=0 updelay=5000
+
+4) Limitations
+--------------
+The main limitations are :
+  - only the link status is monitored. If the switch on the other side is
+    partially down (e.g. doesn't forward anymore, but the link is OK), the link
+    won't be disabled. Another way to check for a dead link could be to count
+    incoming frames on a heavily loaded host. This is not applicable to small
+    servers, but may be useful when the front switches send multicast
+    information on their links (e.g. VRRP), or even health-check the servers.
+    Use the arp_interval/arp_ip_target parameters to count incoming/outgoing
+    frames.  
+
+Resources and links
+===================
+
+Current developement on this driver is posted to:
+ - http://www.sourceforge.net/projects/bonding/
+
+Donald Becker's Ethernet Drivers and diag programs may be found at :
+ - http://www.scyld.com/network/
+
+You will also find a lot of information regarding Ethernet, NWay, MII, etc. at
+www.scyld.com.
+
+For new versions of the driver, patches for older kernels and the updated
+userspace tools, take a look at Willy Tarreau's site :
+ - http://wtarreau.free.fr/pub/bonding/
+ - http://www-miaif.lip6.fr/willy/pub/bonding/
+
+To get latest informations about Linux Kernel development, please consult
+the Linux Kernel Mailing List Archives at :
+   http://boudicca.tux.org/hypermail/linux-kernel/latest/
+
+-- END --
diff -u --recursive --new-file v2.4.14/linux/Documentation/networking/dl2k.txt linux/Documentation/networking/dl2k.txt
--- v2.4.14/linux/Documentation/networking/dl2k.txt	Sun Sep 23 11:40:54 2001
+++ linux/Documentation/networking/dl2k.txt	Mon Nov 19 15:19:42 2001
@@ -1,7 +1,7 @@
 
     D-Link DL2000-based Gigabit Ethernet Adapter Installation
     for Linux
-    July 5, 2001
+    Nov 12, 2001
 
 Contents
 ========
@@ -14,20 +14,22 @@
  - Troubleshooting
 
 
-Compatiblity List
+Compatibility List
 =================
 Adapter Support:
 
 D-Link DGE-550T Gigabit Ethernet Adapter.
+D-Link DGE-550SX Gigabit Ethernet Adapter.
 D-Link DL2000-based Gigabit Ethernet Adapter.
 
 
-The driver support Linux kernal 2.4.x later. We had tested it
+The driver support Linux kernel 2.4.7 later. We had tested it
 on the environments below.
 
- . Red Hat v6.2 (update to kernel 2.4.4)
- . Red Hat v7.0 (update to kernel 2.4.4)
- . Red Hat v7.1 (kernel 2.4.2-2)
+ . Red Hat v6.2 (update kernel to 2.4.7)
+ . Red Hat v7.0 (update kernel to 2.4.7)
+ . Red Hat v7.1 (kernel 2.4.7)
+ . Red Hat v7.2 (kernel 2.4.7-10)
 
 
 Quick Install
@@ -35,16 +37,16 @@
 Install linux driver as following command:
 
 1. make all
-2. insmod dl2x.o
+2. insmod dl2k.o
 3. ifconfig eth0 up 10.xxx.xxx.xxx netmask 255.0.0.0
 		    ^^^^^^^^^^^^^^^\	    ^^^^^^^^\
 				    IP		     NETMASK
-Now eth0 bring up, you can test it by "ping" or get more information by
-"ifconfig". If test ok, then continue next step.
+Now eth0 should active, you can test it by "ping" or get more information by
+"ifconfig". If tested ok, continue the next step.
 
-4. cp dl2x.o /lib/modules/`uname -r`/kernel/drivers/net
+4. cp dl2k.o /lib/modules/`uname -r`/kernel/drivers/net
 5. Add the following lines to /etc/modules.conf:
-	alias eth0 dl2x
+	alias eth0 dl2k
 6. Run "netconfig" or "netconf" to create configuration script ifcfg-eth0
    located at /etc/sysconfig/network-scripts or create it manually.
    [see - Configuration Script Sample]
@@ -61,10 +63,10 @@
 better reliability since a precompiled driver might depend on libraries or
 kernel features that are not present in a given Linux installation.
 
-The 3 files necessary to build Linux device driver are dl2x.c, dl2x.h and
+The 3 files necessary to build Linux device driver are dl2k.c, dl2k.h and
 Makefile. To compile, the Linux installation must include the gcc compiler,
 the kernel source, and the kernel headers. The Linux driver supports Linux
-Kernels 2.4.x. Copy the files to a directory and enter the following command
+Kernels 2.4.7. Copy the files to a directory and enter the following command
 to compile and link the driver:
 
 CD-ROM drive
@@ -73,21 +75,21 @@
 [root@XXX /] mkdir cdrom
 [root@XXX /] mount -r -t iso9660 -o conv=auto /dev/cdrom /cdrom
 [root@XXX /] cd root
-[root@XXX /root] mkdir dl2x
-[root@XXX /root] cd dl2x
-[root@XXX dl2x] cp /cdrom/linux/dl2x.tgz /root/dl2x
-[root@XXX dl2x] tar xfvz dl2x.tgz
-[root@XXX dl2x] make all
+[root@XXX /root] mkdir dl2k
+[root@XXX /root] cd dl2k
+[root@XXX dl2k] cp /cdrom/linux/dl2k.tgz /root/dl2k
+[root@XXX dl2k] tar xfvz dl2k.tgz
+[root@XXX dl2k] make all
 
 Floppy disc drive
 -----------------
 
 [root@XXX /] cd root
-[root@XXX /root] mkdir dl2x
-[root@XXX /root] cd dl2x
-[root@XXX dl2x] mcopy a:/linux/dl2x.tgz /root/dl2x
-[root@XXX dl2x] tar xfvz dl2x.tgz
-[root@XXX dl2x] make all
+[root@XXX /root] mkdir dl2k
+[root@XXX /root] cd dl2k
+[root@XXX dl2k] mcopy a:/linux/dl2k.tgz /root/dl2k
+[root@XXX dl2k] tar xfvz dl2k.tgz
+[root@XXX dl2k] make all
 
 Installing the Driver
 =====================
@@ -98,17 +100,16 @@
   to a protocol stack in order to establish network connectivity. To load a
   module enter the command:
 
-  insmod dl2x.o
-
+  insmod dl2k.o
 
   or
 
-  insmod dl2x.o <optional parameter>	; add parameter
+  insmod dl2k.o <optional parameter>	; add parameter
 
   ===============================================================
-   example: insmod dl2x.o media=100mbps_hd
-   or	    insmod dl2x.o media=3
-   or	    insmod dl2x.o media=3 2	; for 2 cards
+   example: insmod dl2k.o media=100mbps_hd
+   or	    insmod dl2k.o media=3
+   or	    insmod dl2k.o media=3,2	; for 2 cards
   ===============================================================
 
   Please reference the list of the command line parameters supported by
@@ -133,7 +134,7 @@
 
   ifdown eth0
   ifconfig eth0 down
-  rmmod dl2x.o
+  rmmod dl2k.o
 
   The following are the commands to list the currently loaded modules and
   to see the current network configuration.
@@ -151,13 +152,13 @@
 
   Red Hat v6.x/v7.x
   -----------------
-  1. Copy dl2x.o to the network modules directory, typically
+  1. Copy dl2k.o to the network modules directory, typically
      /lib/modules/2.x.x-xx/net or /lib/modules/2.x.x/kernel/drivers/net.
   2. Locate the boot module configuration file, most commonly modules.conf
      or conf.modules in the /etc directory. Add the following lines:
 
-     alias ethx dl2x
-     options dl2x <optional parameters>
+     alias ethx dl2k
+     options dl2k <optional parameters>
 
      where ethx will be eth0 if the NIC is the only ethernet adapter, eth1 if
      one other ethernet adapter is installed, etc. Refer to the table in the
@@ -187,12 +188,19 @@
 				  10mbps_fd	10Mbps full duplex.
 				  100mbps_hd	100Mbps half duplex.
 				  100mbps_fd	100Mbps full duplex.
+				  1000mbps_fd	1000Mbps full duplex.
+				  1000mbps_hd	1000Mbps half duplex.
 				  0		Autosensing active media.
 				  1		10Mbps half duplex.
 				  2		10Mbps full duplex.
 				  3		100Mbps half duplex.
 				  4		100Mbps full duplex.
+				  5          	1000Mbps full duplex.
+				  6          	1000Mbps half duplex.
+
 				  By default, the NIC operates at autosense.
+				  Note that only 1000mbps_fd and 1000mbps_hd
+				  types are available for fiber adapter.
 
 vlan=x				- Specifies the VLAN ID. If vlan=0, the
 				  Virtual Local Area Network (VLAN) function is
@@ -208,9 +216,8 @@
 int_timeout			- Rx DMA wait time for an interrupt. Proper 
 				  values of int_count and int_timeout bring 
 				  a conspicuous performance in the fast machine. 
-				  For P4 1.5GHz systems, a setting of 
-				  int_count=5 and int_timeout=750 is
-				  recommendable.
+				  Ex. int_count=5 and int_timeout=750 
+
 Configuration Script Sample
 ===========================
 Here is a sample of a simple configuration script:
diff -u --recursive --new-file v2.4.14/linux/Documentation/networking/ifenslave.c linux/Documentation/networking/ifenslave.c
--- v2.4.14/linux/Documentation/networking/ifenslave.c	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/networking/ifenslave.c	Wed Nov  7 14:39:36 2001
@@ -0,0 +1,562 @@
+/* Mode: C;
+ * ifenslave.c: Configure network interfaces for parallel routing.
+ *
+ *	This program controls the Linux implementation of running multiple
+ *	network interfaces in parallel.
+ *
+ * Usage:	ifenslave [-v] master-interface < slave-interface [metric <N>] > ...
+ *
+ * Author:	Donald Becker <becker@cesdis.gsfc.nasa.gov>
+ *		Copyright 1994-1996 Donald Becker
+ *
+ *		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.
+ *
+ *	The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
+ *	Center of Excellence in Space Data and Information Sciences
+ *	   Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
+ *
+ *  Changes :
+ *    - 2000/10/02 Willy Tarreau <willy at meta-x.org> :
+ *       - few fixes. Master's MAC address is now correctly taken from
+ *         the first device when not previously set ;
+ *       - detach support : call BOND_RELEASE to detach an enslaved interface.
+ *       - give a mini-howto from command-line help : # ifenslave -h
+ *
+ *    - 2001/02/16 Chad N. Tindel <ctindel at ieee dot org> :
+ *       - Master is now brought down before setting the MAC address.  In
+ *         the 2.4 kernel you can't change the MAC address while the device is
+ *         up because you get EBUSY.  
+ *
+ *    - 2001/09/13 Takao Indoh <indou dot takao at jp dot fujitsu dot com>
+ *       - Added the ability to change the active interface on a mode 1 bond
+ *         at runtime.
+ *
+ *    - 2001/10/23 Chad N. Tindel <ctindel at ieee dot org> :
+ *       - No longer set the MAC address of the master.  The bond device will
+ *         take care of this itself
+ *       - Try the SIOC*** versions of the bonding ioctls before using the
+ *         old versions
+ */
+
+static char *version =
+"ifenslave.c:v0.07 9/9/97  Donald Becker (becker@cesdis.gsfc.nasa.gov).\n"
+"detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).\n"
+"2.4 kernel support added on 2001/02/16 by Chad N. Tindel (ctindel at ieee dot org.\n";
+
+static const char *usage_msg =
+"Usage: ifenslave [-adfrvVh] <master-interface> < <slave-if> [metric <N>] > ...\n"
+"       ifenslave -c master-interface slave-if\n";
+
+static const char *howto_msg =
+"Usage: ifenslave [-adfrvVh] <master-interface> < <slave-if> [metric <N>] > ...\n"
+"       ifenslave -c master-interface slave-if\n"
+"\n"
+"       To create a bond device, simply follow these three steps :\n"
+"       - ensure that the required drivers are properly loaded :\n"
+"         # modprobe bonding ; modprobe <3c59x|eepro100|pcnet32|tulip|...>\n"
+"       - assign an IP address to the bond device :\n"
+"         # ifconfig bond0 <addr> netmask <mask> broadcast <bcast>\n"
+"       - attach all the interfaces you need to the bond device :\n"
+"         # ifenslave bond0 eth0 eth1 eth2\n"
+"         If bond0 didn't have a MAC address, it will take eth0's. Then, all\n"
+"         interfaces attached AFTER this assignment will get the same MAC addr.\n"
+"\n"
+"       To detach a dead interface without setting the bond device down :\n"
+"         # ifenslave -d bond0 eth1\n"
+"\n"
+"       To set the bond device down and automatically release all the slaves :\n"
+"         # ifconfig bond0 down\n"
+"\n"
+"       To change active slave :\n"
+"         # ifenslave -c bond0 eth0\n"
+"\n";
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <linux/if.h>
+#include <linux/if_arp.h>
+#include <linux/if_ether.h>
+#include <linux/if_bonding.h>
+#include <linux/sockios.h>
+
+struct option longopts[] = {
+ /* { name  has_arg  *flag  val } */
+    {"all-interfaces", 0, 0, 'a'},	/* Show all interfaces. */
+    {"force",       0, 0, 'f'},		/* Force the operation. */
+    {"help", 		0, 0, '?'},		/* Give help */
+	{"howto",       0, 0, 'h'},     /* Give some more help */
+    {"receive-slave", 0, 0, 'r'},	/* Make a receive-only slave.  */
+    {"verbose", 	0, 0, 'v'},		/* Report each action taken.  */
+    {"version", 	0, 0, 'V'},		/* Emit version information.  */
+    {"detach",       0, 0, 'd'},	/* Detach a slave interface. */
+    {"change-active", 0, 0, 'c'},	/* Change the active slave.  */
+    { 0, 0, 0, 0 }
+};
+
+/* Command-line flags. */
+unsigned int
+opt_a = 0,					/* Show-all-interfaces flag. */
+opt_f = 0,					/* Force the operation. */
+opt_r = 0,					/* Set up a Rx-only slave. */
+opt_d = 0,					/* detach a slave interface. */
+opt_c = 0,					/* change-active-slave flag. */
+verbose = 0,					/* Verbose flag. */
+opt_version = 0,
+opt_howto = 0;
+int skfd = -1;					/* AF_INET socket for ioctl() calls.	*/
+
+static void if_print(char *ifname);
+
+int
+main(int argc, char **argv)
+{
+	struct ifreq  ifr2, if_hwaddr, if_ipaddr, if_metric, if_mtu, if_dstaddr;
+	struct ifreq  if_netmask, if_brdaddr, if_flags;
+	int goterr = 0;
+	int c, errflag = 0;
+	sa_family_t master_family;
+	char **spp, *master_ifname, *slave_ifname;
+	int hwaddr_notset;
+
+	while ((c = getopt_long(argc, argv, "acdfrvV?h", longopts, 0)) != EOF)
+		switch (c) {
+		case 'a': opt_a++; break;
+		case 'f': opt_f++; break;
+		case 'r': opt_r++; break;
+		case 'd': opt_d++; break;
+		case 'c': opt_c++; break;
+		case 'v': verbose++;		break;
+		case 'V': opt_version++;	break;
+		case 'h': opt_howto++;	break;
+		case '?': errflag++;
+		}
+
+	/* option check */
+	if (opt_c)
+		if(opt_a || opt_f || opt_r || opt_d || verbose || opt_version ||
+		   opt_howto || errflag ) {
+			fprintf(stderr, usage_msg);
+			return 2;
+		}
+
+	if (errflag) {
+		fprintf(stderr, usage_msg);
+		return 2;
+	}
+
+	if (opt_howto) {
+		fprintf(stderr, howto_msg);
+		return 0;
+	}
+
+	if (verbose || opt_version) {
+		printf(version);
+		if (opt_version)
+			exit(0);
+	}
+
+	/* Open a basic socket. */
+	if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) {
+		perror("socket");
+		exit(-1);
+	}
+
+	if (verbose)
+		fprintf(stderr, "DEBUG: argc=%d, optind=%d and argv[optind] is %s.\n",
+				argc, optind, argv[optind]);
+
+	/* No remaining args means show all interfaces. */
+	if (optind == argc) {
+		if_print((char *)NULL);
+		(void) close(skfd);
+		exit(0);
+	}
+
+	/* Copy the interface name. */
+	spp = argv + optind;
+	master_ifname = *spp++;
+	slave_ifname = *spp++;
+
+	/* Check command line. */
+	if (opt_c) {
+		char **tempp = spp;
+		if ((master_ifname == NULL)||(slave_ifname == NULL)||(*tempp++ != NULL)) {
+			fprintf(stderr, usage_msg);
+			return 2;
+		}
+	}
+
+	/* A single args means show the configuration for this interface. */
+	if (slave_ifname == NULL) {
+		if_print(master_ifname);
+		(void) close(skfd);
+		exit(0);
+	}
+
+	/* Get the vitals from the master interface. */
+	{
+		struct ifreq *ifra[7] = { &if_ipaddr, &if_mtu, &if_dstaddr,
+								  &if_brdaddr, &if_netmask, &if_flags,
+								  &if_hwaddr };
+		const char *req_name[7] = {
+			"IP address", "MTU", "destination address",
+			"broadcast address", "netmask", "status flags",
+			"hardware address" };
+		const int ioctl_req_type[7] = {
+			SIOCGIFADDR, SIOCGIFMTU, SIOCGIFDSTADDR,
+			SIOCGIFBRDADDR, SIOCGIFNETMASK, SIOCGIFFLAGS,
+			SIOCGIFHWADDR };
+		int i;
+
+		for (i = 0; i < 7; i++) {
+			strncpy(ifra[i]->ifr_name, master_ifname, IFNAMSIZ);
+			if (ioctl(skfd, ioctl_req_type[i], ifra[i]) < 0) {
+				fprintf(stderr,
+						"Something broke getting the master's %s: %s.\n",
+						req_name[i], strerror(errno));
+			}
+		}
+
+		hwaddr_notset = 1; /* assume master's address not set yet */
+		for (i = 0; hwaddr_notset && (i < 6); i++) {
+			hwaddr_notset &= ((unsigned char *)if_hwaddr.ifr_hwaddr.sa_data)[i] == 0;
+		}
+
+		/* The family '1' is ARPHRD_ETHER for ethernet. */
+		if (if_hwaddr.ifr_hwaddr.sa_family != 1 && !opt_f) {
+			fprintf(stderr, "The specified master interface '%s' is not"
+					" ethernet-like.\n  This program is designed to work"
+					" with ethernet-like network interfaces.\n"
+					" Use the '-f' option to force the operation.\n",
+					master_ifname);
+
+			exit (1);
+		}
+		master_family = if_hwaddr.ifr_hwaddr.sa_family;
+		if (verbose) {
+			unsigned char *hwaddr = (unsigned char *)if_hwaddr.ifr_hwaddr.sa_data;
+			printf("The current hardware address (SIOCGIFHWADDR) of %s is type %d  "
+				   "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", master_ifname,
+				   if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
+				   hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
+		}
+	}
+
+
+	/* do this when enslaving interfaces */
+	do {
+		if (opt_d) {  /* detach a slave interface from the master */
+			strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
+			strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
+			if ((ioctl(skfd, SIOCBONDRELEASE, &if_flags) < 0) &&
+				(ioctl(skfd, BOND_RELEASE_OLD, &if_flags) < 0)) {
+					fprintf(stderr,	"SIOCBONDRELEASE: cannot detach %s from %s. errno=%s.\n",
+							slave_ifname, master_ifname, strerror(errno));
+			}
+			else {  /* we'll set the interface down to avoid any conflicts due to
+					   same IP/MAC */
+				strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);
+				if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {
+					int saved_errno = errno;
+					fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname,
+							strerror(saved_errno));
+				}
+				else {
+					ifr2.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
+					if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
+						int saved_errno = errno;
+						fprintf(stderr, "Shutting down interface %s failed: %s\n",
+								slave_ifname, strerror(saved_errno));
+					}
+				}
+			}
+		}
+		else {  /* attach a slave interface to the master */
+			/* two possibilities :
+			   - if hwaddr_notset, do nothing.  The bond will assign the
+			     hwaddr from it's first slave.
+			   - if !hwaddr_notset, assign the master's hwaddr to each slave
+			*/
+	
+			if (hwaddr_notset) { /* we do nothing */
+
+			}
+			else {  /* we'll assign master's hwaddr to this slave */
+				strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);
+				if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {
+					int saved_errno = errno;
+					fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname,
+							strerror(saved_errno));
+					return 1;
+				}
+	
+				if (ifr2.ifr_flags & IFF_UP) {
+					ifr2.ifr_flags &= ~IFF_UP;
+					if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
+						int saved_errno = errno;
+						fprintf(stderr, "Shutting down interface %s failed: %s\n",
+								slave_ifname, strerror(saved_errno));
+					}
+				}
+	
+				strncpy(if_hwaddr.ifr_name, slave_ifname, IFNAMSIZ);
+				if (ioctl(skfd, SIOCSIFHWADDR, &if_hwaddr) < 0) {
+					int saved_errno = errno;
+					fprintf(stderr, "SIOCSIFHWADDR on %s failed: %s\n", if_hwaddr.ifr_name,
+							strerror(saved_errno));
+					if (saved_errno == EBUSY)
+						fprintf(stderr, "  The slave device %s is busy: it must be"
+								" idle before running this command.\n", slave_ifname);
+					else if (saved_errno == EOPNOTSUPP)
+						fprintf(stderr, "  The slave device you specified does not support"
+								" setting the MAC address.\n  Your kernel likely does not"
+								" support slave devices.\n");
+					else if (saved_errno == EINVAL)
+						fprintf(stderr, "  The slave device's address type does not match"
+								" the master's address type.\n");
+				} else {
+					if (verbose) {
+						unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
+						printf("Slave's (%s) hardware address set to "
+							   "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", slave_ifname,
+							   hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
+					}
+				}
+			}
+	
+			if (*spp  &&  !strcmp(*spp, "metric")) {
+				if (*++spp == NULL) {
+					fprintf(stderr, usage_msg);
+					exit(2);
+				}
+				if_metric.ifr_metric = atoi(*spp);
+				strncpy(if_metric.ifr_name, slave_ifname, IFNAMSIZ);
+				if (ioctl(skfd, SIOCSIFMETRIC, &if_metric) < 0) {
+					fprintf(stderr, "SIOCSIFMETRIC on %s: %s\n", slave_ifname,
+							strerror(errno));
+					goterr = 1;
+				}
+				spp++;
+			}
+	
+			if (strncpy(if_ipaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
+				|| ioctl(skfd, SIOCSIFADDR, &if_ipaddr) < 0) {
+				fprintf(stderr,
+						"Something broke setting the slave's address: %s.\n",
+						strerror(errno));
+			} else {
+				if (verbose) {
+					unsigned char *ipaddr = if_ipaddr.ifr_addr.sa_data;
+					printf("Set the slave's (%s) IP address to %d.%d.%d.%d.\n",
+						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
+				}
+			}
+	
+			if (strncpy(if_mtu.ifr_name, slave_ifname, IFNAMSIZ) <= 0
+				|| ioctl(skfd, SIOCSIFMTU, &if_mtu) < 0) { 
+				fprintf(stderr, "Something broke setting the slave MTU: %s.\n",
+						strerror(errno));
+			} else {
+				if (verbose)
+					printf("Set the slave's (%s) MTU to %d.\n", slave_ifname, if_mtu.ifr_mtu);
+			}
+	
+			if (strncpy(if_dstaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
+				|| ioctl(skfd, SIOCSIFDSTADDR, &if_dstaddr) < 0) {
+				fprintf(stderr, "Error setting the slave (%s) with SIOCSIFDSTADDR: %s.\n",
+						slave_ifname, strerror(errno));
+			} else {
+				if (verbose) {
+					unsigned char *ipaddr = if_dstaddr.ifr_dstaddr.sa_data;
+					printf("Set the slave's (%s) destination address to %d.%d.%d.%d.\n",
+						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
+				}
+			}
+	
+			if (strncpy(if_brdaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
+				|| ioctl(skfd, SIOCSIFBRDADDR, &if_brdaddr) < 0) {
+				fprintf(stderr,
+						"Something broke setting the slave (%s) broadcast address: %s.\n",
+						slave_ifname, strerror(errno));
+			} else {
+				if (verbose) {
+					unsigned char *ipaddr = if_brdaddr.ifr_broadaddr.sa_data;
+					printf("Set the slave's (%s) broadcast address to %d.%d.%d.%d.\n",
+						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
+				}
+			}
+			
+			if (strncpy(if_netmask.ifr_name, slave_ifname, IFNAMSIZ) <= 0
+				|| ioctl(skfd, SIOCSIFNETMASK, &if_netmask) < 0) {
+				fprintf(stderr,
+						"Something broke setting the slave (%s) netmask: %s.\n",
+						slave_ifname, strerror(errno));
+			} else {
+				if (verbose) {
+					unsigned char *ipaddr = if_netmask.ifr_netmask.sa_data;
+					printf("Set the slave's (%s) netmask to %d.%d.%d.%d.\n",
+						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
+				}
+			}
+			
+			ifr2.ifr_flags |= IFF_UP; /* the interface will need to be up to be bonded */
+			if ((ifr2.ifr_flags &= ~(IFF_SLAVE | IFF_MASTER)) == 0
+				|| strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ) <= 0
+				|| ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
+				fprintf(stderr,
+						"Something broke setting the slave (%s) flags: %s.\n",
+						slave_ifname, strerror(errno));
+			} else {
+				if (verbose)
+					printf("Set the slave's (%s) flags %4.4x.\n", slave_ifname, if_flags.ifr_flags);
+			}
+	
+			/* Do the real thing */
+			if ( ! opt_r) {
+				strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
+				strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
+				if (!opt_c) {
+					if ((ioctl(skfd, SIOCBONDENSLAVE, &if_flags) < 0) &&
+					    (ioctl(skfd, BOND_ENSLAVE_OLD, &if_flags) < 0)) {
+						fprintf(stderr,	"SIOCBONDENSLAVE: %s.\n", strerror(errno));
+					}
+				}
+				else {
+					if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &if_flags) < 0) &&
+					    (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &if_flags) < 0)) {
+						fprintf(stderr,	"SIOCBONDCHANGEACTIVE: %s.\n", strerror(errno));
+					}
+				}
+			}
+		}
+	} while ( (slave_ifname = *spp++) != NULL);
+
+	/* Close the socket. */
+	(void) close(skfd);
+
+	return(goterr);
+}
+
+static short mif_flags;
+
+/* Get the inteface configuration from the kernel. */
+static int if_getconfig(char *ifname)
+{
+	struct ifreq ifr;
+	int metric, mtu;			/* Parameters of the master interface. */
+	struct sockaddr dstaddr, broadaddr, netmask;
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
+		return -1;
+	mif_flags = ifr.ifr_flags;
+	printf("The result of SIOCGIFFLAGS on %s is %x.\n",
+		   ifname, ifr.ifr_flags);
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0)
+		return -1;
+	printf("The result of SIOCGIFADDR is %2.2x.%2.2x.%2.2x.%2.2x.\n",
+		   ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1],
+		   ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]);
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
+		return -1;
+
+	{
+		/* Gotta convert from 'char' to unsigned for printf().  */
+		unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data;
+		printf("The result of SIOCGIFHWADDR is type %d  "
+			   "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n",
+			   ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
+			   hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
+	}
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {
+		metric = 0;
+	} else
+		metric = ifr.ifr_metric;
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0)
+		mtu = 0;
+	else
+		mtu = ifr.ifr_mtu;
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFDSTADDR, &ifr) < 0) {
+		memset(&dstaddr, 0, sizeof(struct sockaddr));
+	} else
+		dstaddr = ifr.ifr_dstaddr;
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFBRDADDR, &ifr) < 0) {
+		memset(&broadaddr, 0, sizeof(struct sockaddr));
+	} else
+		broadaddr = ifr.ifr_broadaddr;
+
+	strcpy(ifr.ifr_name, ifname);
+	if (ioctl(skfd, SIOCGIFNETMASK, &ifr) < 0) {
+		memset(&netmask, 0, sizeof(struct sockaddr));
+	} else
+		netmask = ifr.ifr_netmask;
+
+	return(0);
+}
+
+static void if_print(char *ifname)
+{
+	char buff[1024];
+	struct ifconf ifc;
+	struct ifreq *ifr;
+	int i;
+
+	if (ifname == (char *)NULL) {
+		ifc.ifc_len = sizeof(buff);
+		ifc.ifc_buf = buff;
+		if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
+			fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));
+			return;
+		}
+
+		ifr = ifc.ifc_req;
+		for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
+			if (if_getconfig(ifr->ifr_name) < 0) {
+				fprintf(stderr, "%s: unknown interface.\n",
+						ifr->ifr_name);
+				continue;
+			}
+
+			if (((mif_flags & IFF_UP) == 0) && !opt_a) continue;
+			/*ife_print(&ife);*/
+		}
+	} else {
+		if (if_getconfig(ifname) < 0)
+			fprintf(stderr, "%s: unknown interface.\n", ifname);
+	}
+}
+
+
+/*
+ * Local variables:
+ *  version-control: t
+ *  kept-new-versions: 5
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  tab-width: 4
+ *  compile-command: "gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave"
+ * End:
+ */
diff -u --recursive --new-file v2.4.14/linux/Documentation/networking/multicast.txt linux/Documentation/networking/multicast.txt
--- v2.4.14/linux/Documentation/networking/multicast.txt	Wed Jul 25 17:10:17 2001
+++ linux/Documentation/networking/multicast.txt	Wed Nov  7 14:46:01 2001
@@ -31,6 +31,7 @@
 de600		NO		NO		NO		N/A
 de620		PROMISC		PROMISC		YES		Software
 depca		YES		PROMISC		YES		Hardware
+dmfe		YES		YES		YES		Software(*)
 e2100		YES		YES		YES		Hardware
 eepro		YES		PROMISC		YES		Hardware
 eexpress	NO		NO		NO		N/A
@@ -52,9 +53,12 @@
 tulip		YES		YES		YES		Hardware
 wavelan		YES		PROMISC		YES		Hardware
 wd		YES		YES		YES		Hardware
+xirc2ps_cs	YES		YES		YES		Hardware
 znet		YES		YES		YES		Software
 
 
 PROMISC = This multicast mode is in fact promiscuous mode. Avoid using
 cards who go PROMISC on any multicast in a multicast kernel.
+
 (#) = Hardware multicast support is not used yet.
+(*) = Hardware support for Davicom 9132 chipset only.
diff -u --recursive --new-file v2.4.14/linux/Documentation/parport.txt linux/Documentation/parport.txt
--- v2.4.14/linux/Documentation/parport.txt	Sat May 19 17:54:14 2001
+++ linux/Documentation/parport.txt	Fri Nov  9 14:30:55 2001
@@ -162,6 +162,10 @@
 				is available and will be used.
 		DMA		DMA is available and will be used.
 
+		Note that the current implementation will only take
+		advantage of COMPAT and ECP modes if it has an IRQ
+		line to use.
+
 autoprobe	Any IEEE-1284 device ID information that has been
 		acquired from the (non-IEEE 1284.3) device.
 
diff -u --recursive --new-file v2.4.14/linux/Documentation/s390/Debugging390.txt linux/Documentation/s390/Debugging390.txt
--- v2.4.14/linux/Documentation/s390/Debugging390.txt	Sun Aug 12 13:27:58 2001
+++ linux/Documentation/s390/Debugging390.txt	Wed Nov  7 14:46:01 2001
@@ -1287,10 +1287,14 @@
 circumstances as the process may change when doing a 
 TR I R <address range>.
 Thankfully after reading VM's online help I figured out how to debug
-I particular process.
+particular processes in 31 bit mode, however, according to the current 
+VM online help documentation the method described below uses 
+TR STO or STD which don't currently work on  z/Series while in 
+64-bit mode.
 
 Your first problem is to find the STD ( segment table designation )
 of the program you wish to debug.
+
 There are several ways you can do this here are a few
 1) objdump --syms <program to be debugged> | grep main
 To get the address of main in the program.
diff -u --recursive --new-file v2.4.14/linux/Documentation/s390/chandev.8 linux/Documentation/s390/chandev.8
--- v2.4.14/linux/Documentation/s390/chandev.8	Tue Oct 23 22:48:49 2001
+++ linux/Documentation/s390/chandev.8	Wed Nov  7 14:46:01 2001
@@ -56,7 +56,7 @@
 .El
 .Bl -item
 .It
-Multiple options can be passed separated by semicolons but no spaces are allowed between parameters. To be consistent with other hotpluggable architectures the script pointed to /proc/sys/kernel/hotplug (normally /sbin/hotplug) will be called automatically on startup or a machine check of a device as follows.
+Multiple options can be passed separated by semicolons, no spaces or newlines are allowed between parameters on the kernel parameter line as it complicates parsing, spaces are allowed in /proc/chandev & chandev.conf, newlines are allowed in chandev.conf only. To be consistent with other hotpluggable architectures the script pointed to /proc/sys/kernel/hotplug (normally /sbin/hotplug) will be called automatically on startup or a machine check of a device as follows.
 /sbin/hotplug chandev <start starting_devnames> <machine_check (devname last/pre_recovery_status) (current/post_recovery_status)>.
 The chandev layer doesn't open stdin stdout or stderr so it is advisable that you add the following lines to the start of your script, here is a sample script which starts devices as they become available.
 .It
@@ -132,7 +132,7 @@
 .It
 Tells the channel layer to force ctc0 if detected to use cuu's 7c00 & 7c01 port,port_no is the relative adapter no on lcs, on ctc/escon this field is the ctc/escon protocol number ( default 0 ), don't do checksumming on received ip packets & as ctc doesn't have hardware stats so it ignores this parameter. This can be used for instance to force a device if it presents bad sense data to the IO layer & thus autodetection fails.
 .It
-lcs,0x7c00,0x7d00,-1,4096
+lcs,0x7c00,0x7d00,4096,-1
 All devices between 0x7c00 & 7d00 should be detected as lcs, let the driver use 4096k for each instance, don't care what port relative adapter number is chosen, don't checksum received ip packets & use hw stats .
 .It
 qeth1,0x7c00,0x7c01,0x7c02
diff -u --recursive --new-file v2.4.14/linux/Documentation/usb/usb-serial.txt linux/Documentation/usb/usb-serial.txt
--- v2.4.14/linux/Documentation/usb/usb-serial.txt	Tue Jul  3 17:08:18 2001
+++ linux/Documentation/usb/usb-serial.txt	Mon Nov 12 09:50:39 2001
@@ -44,28 +44,33 @@
   device, including providing a unit to test with. This driver will end up
   being fully supported.
 
-Current status:
-  The device's firmware is downloaded on connection, the new firmware 
-  runs properly and all four ports are successfully recognized and connected.
-  Data can be sent and received through the device on all ports.
-  Hardware flow control needs to be implemented.
+  Current status:
+    The device's firmware is downloaded on connection, the new firmware 
+    runs properly and all four ports are successfully recognized and connected.
+    Data can be sent and received through the device on all ports.
+    Hardware flow control needs to be implemented.
 
+  For any questions or problems with this driver, please contact Greg
+  Kroah-Hartman at greg@kroah.com
 
-HandSpring Visor USB docking station
-
-Current status:
-  Only when the Visor tries to connect to the host, does the docking
-  station show up as a valid USB device. When this happens, the device is
+
+HandSpring Visor, Palm USB, and Clié USB driver
+
+  This driver works with all HandSpring USB, Palm USB, and Sony Clié USB
+  devices.
+
+  Only when the device tries to connect to the host, will the device show
+  up to the host as a valid USB device. When this happens, the device is
   properly enumerated, assigned a port, and then communication _should_ be
   possible. The driver cleans up properly when the device is removed, or
-  the connection is canceled on the Visor.
+  the connection is canceled on the device.
 
   NOTE:
-    This means that in order to talk to the Visor, the sync button must be
-    pressed BEFORE trying to get any program to communicate to the Visor.
+    This means that in order to talk to the device, the sync button must be
+    pressed BEFORE trying to get any program to communicate to the device.
     This goes against the current documentation for pilot-xfer and other
     packages, but is the only way that it will work due to the hardware
-    in the Visor.
+    in the device.
   
   When the device is connected, try talking to it on the second port
   (this is usually /dev/ttyUSB1 if you do not have any other usb-serial
@@ -73,37 +78,49 @@
   the port to use for the HotSync transfer. The "Generic" port can be used
   for other device communication, such as a PPP link.
 
+  For some Sony Clié devices, /dev/ttyUSB0 must be used to talk to the
+  device.  This is true for all OS version 3.5 devices, and most devices
+  that have had a flash upgrade to a newer version of the OS.  See the
+  kernel system log for information on which is the correct port to use.
+
   If after pressing the sync button, nothing shows up in the system log,
-  try resetting the Visor, first a hot reset, and then a cold reset if
-  necessary.  Some Visors need this before they can talk to the USB port
+  try resetting the device, first a hot reset, and then a cold reset if
+  necessary.  Some devices need this before they can talk to the USB port
   properly.
   
-  There is a webpage and mailing lists for this portion of the driver at: 
+  There is a webpage and mailing lists for this portion of the driver at:
   http://usbvisor.sourceforge.net/
 
+  For any questions or problems with this driver, please contact Greg
+  Kroah-Hartman at greg@kroah.com
+
 
 Keyspan PDA Serial Adapter
 
   Single port DB-9 serial adapter, pushed as a PDA adapter for iMacs (mostly
   sold in Macintosh catalogs, comes in a translucent white/green dongle).
   Fairly simple device. Firmware is homebrew.
+  This driver also works for the Xircom/Entrgra single port serial adapter.
 
-Current status:
- Things that work:
-   basic input/output (tested with 'cu')
-   blocking write when serial line can't keep up
-   changing baud rates (up to 115200)
-   getting/setting modem control pins (TIOCM{GET,SET,BIS,BIC})
-   sending break (although duration looks suspect)
- Things that don't:
-   device strings (as logged by kernel) have trailing binary garbage
-   device ID isn't right, might collide with other Keyspan products
-   changing baud rates ought to flush tx/rx to avoid mangled half characters
- Big Things on the todo list:
-   parity, 7 vs 8 bits per char, 1 or 2 stop bits
-   HW flow control
-   not all of the standard USB descriptors are handled: Get_Status, Set_Feature
-   O_NONBLOCK, select()
+  Current status:
+   Things that work:
+     basic input/output (tested with 'cu')
+     blocking write when serial line can't keep up
+     changing baud rates (up to 115200)
+     getting/setting modem control pins (TIOCM{GET,SET,BIS,BIC})
+     sending break (although duration looks suspect)
+   Things that don't:
+     device strings (as logged by kernel) have trailing binary garbage
+     device ID isn't right, might collide with other Keyspan products
+     changing baud rates ought to flush tx/rx to avoid mangled half characters
+   Big Things on the todo list:
+     parity, 7 vs 8 bits per char, 1 or 2 stop bits
+     HW flow control
+     not all of the standard USB descriptors are handled: Get_Status, Set_Feature
+     O_NONBLOCK, select()
+
+  For any questions or problems with this driver, please contact Brian
+  Warner at warner@lothar.com 
 
 
 Keyspan USA-series Serial Adapters
@@ -111,19 +128,22 @@
   Single, Dual and Quad port adapters - driver uses Keyspan supplied 
   firmware and is being developed with their support.
   
-Current status:
-  The USA-18X, USA-28X, USA-19, USA-19W and USA-49W are supported and
-  have been pretty throughly tested at various baud rates with 8-N-1
-  character settings.  Other character lengths and parity setups are
-  presently untested.
-
-  The USA-28 isn't yet supported though doing so should be pretty
-  straightforward.  Contact the maintainer if you require this
-  functionality.
+  Current status:
+    The USA-18X, USA-28X, USA-19, USA-19W and USA-49W are supported and
+    have been pretty throughly tested at various baud rates with 8-N-1
+    character settings.  Other character lengths and parity setups are
+    presently untested.
+
+    The USA-28 isn't yet supported though doing so should be pretty
+    straightforward.  Contact the maintainer if you require this
+    functionality.
   
   More information is available at:
-        http://www.linuxcare.com.au/hugh/keyspan.html
+        http://misc.nu/hugh/keyspan.html
    
+  For any questions or problems with this driver, please contact Hugh
+  Blemings at hugh@misc.nu
+
 
 FTDI Single Port Serial Driver
 
@@ -131,6 +151,9 @@
   device and the Linux driver can be found at:
 	http://reality.sgi.com/bryder_wellington/ftdi_sio/
 
+  For any questions or problems with this driver, please contact Bill Ryder
+  at bryder@sgi.com
+
 
 ZyXEL omni.net lcd plus ISDN TA
 
@@ -162,65 +185,71 @@
 Belkin USB Serial Adapter F5U103
 
   Single port DB-9/PS-2 serial adapter from Belkin with firmware by eTEK Labs.
-  The Peracom single port serial adapter also works with this driver.
+  The Peracom single port serial adapter also works with this driver, as
+  well as the GoHubs adapter.
+
+  Current status:
+    The following have been tested and work:
+      Baud rate    300-230400               
+      Data bits    5-8
+      Stop bits    1-2
+      Parity       N,E,O,M,S
+      Handshake    None, Software (XON/XOFF), Hardware (CTSRTS,CTSDTR)*
+      Break        Set and clear
+      Line contrl  Input/Output query and control **
+
+      *  Hardware input flow control is only enabled for firmware
+         levels above 2.06.  Read source code comments describing Belkin
+         firmware errata.  Hardware output flow control is working for all
+         firmware versions.
+      ** Queries of inputs (CTS,DSR,CD,RI) show the last
+         reported state.  Queries of outputs (DTR,RTS) show the last
+         requested state and may not reflect current state as set by
+         automatic hardware flow control.
+
+  TO DO List:
+    -- Add true modem contol line query capability.  Currently tracks the
+       states reported by the interrupt and the states requested.
+    -- Add error reporting back to application for UART error conditions.
+    -- Add support for flush ioctls.
+    -- Add everything else that is missing :)
 
-Current status:
-  The following have been tested and work:
-    Baud rate    300-230400               
-    Data bits    5-8
-    Stop bits    1-2
-    Parity       N,E,O,M,S
-    Handshake    None, Software (XON/XOFF), Hardware (CTSRTS,CTSDTR)*
-    Break        Set and clear
-    Line contrl  Input/Output query and control **
-
-    *  Hardware input flow control is only enabled for firmware
-       levels above 2.06.  Read source code comments describing Belkin
-       firmware errata.  Hardware output flow control is working for all
-       firmware versions.
-    ** Queries of inputs (CTS,DSR,CD,RI) show the last
-       reported state.  Queries of outputs (DTR,RTS) show the last
-       requested state and may not reflect current state as set by
-       automatic hardware flow control.
-
-TO DO List:
-  -- Add true modem contol line query capability.  Currently tracks the
-     states reported by the interrupt and the states requested.
-  -- Add error reporting back to application for UART error conditions.
-  -- Add support for flush ioctls.
-  -- Add everything else that is missing :)
+  For any questions or problems with this driver, please contact William
+  Greathouse at wgreathouse@smva.com
 
 
-Empeg empeg-car Mark I/II Driver (empeg.c)
+Empeg empeg-car Mark I/II Driver
 
   This is an experimental driver to provide connectivity support for the
   client synchronization tools for an Empeg empeg-car mp3 player.
 
   Tips:
-
     * Don't forget to create the device nodes for ttyUSB{0,1,2,...}
     * modprobe empeg (modprobe is your friend)
     * emptool --usb /dev/ttyUSB0 (or whatever you named your device node)
 
-  The driver is still pretty new, so some testing 'in the wild' would be
-  helpful. :)
+  For any questions or problems with this driver, please contact Gary
+  Brubaker at xavyer@ix.netcom.com
 
 
 MCT USB Single Port Serial Adapter U232
 
- This driver is for the MCT USB-RS232 Converter (25 pin, Model No.
- U232-P25) from Magic Control Technology Corp. (there is also a 9 pin
- Model No. U232-P9). More information about this device can be found
- at the manufacture's web-site: http://www.mct.com.tw.
-
- The driver is generally working, though it still needs some more
- testing. It is derived from the Belkin USB Serial Adapter F5U103
- driver and its TODO list is valid for this driver as well.
-
- This driver has also been found to work for other products, which have 
- the same Vendor ID but different Product IDs. Sitecom's U232-P25 
- serial converter uses Product ID 0x230 and Vendor ID 0x711 and works with 
- this driver. Also, D-Link's DU-H3SP USB BAY also works with this driver.
+  This driver is for the MCT USB-RS232 Converter (25 pin, Model No.
+  U232-P25) from Magic Control Technology Corp. (there is also a 9 pin
+  Model No. U232-P9). More information about this device can be found at
+  the manufacture's web-site: http://www.mct.com.tw.
+
+  The driver is generally working, though it still needs some more testing.
+  It is derived from the Belkin USB Serial Adapter F5U103 driver and its
+  TODO list is valid for this driver as well.
+
+  This driver has also been found to work for other products, which have
+  the same Vendor ID but different Product IDs. Sitecom's U232-P25 serial
+  converter uses Product ID 0x230 and Vendor ID 0x711 and works with this
+  driver. Also, D-Link's DU-H3SP USB BAY also works with this driver.
+
+  For any questions or problems with this driver, please contact Wolfgang
+  Grandegger at wolfgang@ces.ch
 
 
 Inside Out Networks Edgeport Driver
@@ -244,17 +273,34 @@
        Edgeport/4 DIN
        Edgeport/16 Dual
 
+  For any questions or problems with this driver, please contact Greg
+  Kroah-Hartman at greg@kroah.com
+
 
 REINER SCT cyberJack pinpad/e-com USB chipcard reader
    
   Interface to ISO 7816 compatible contactbased chipcards, e.g. GSM SIMs.
   
-Current status:
-  This is the kernel part of the driver for this USB card reader.
-  There is also a user part for a CT-API driver available. A site
-  for downloading is TBA. For now, you can request it from the
-  maintainer (linux-usb@sii.li).
+  Current status:
+    This is the kernel part of the driver for this USB card reader.
+    There is also a user part for a CT-API driver available. A site
+    for downloading is TBA. For now, you can request it from the
+    maintainer (linux-usb@sii.li).
+
+  For any questions or problems with this driver, please contact
+  linux-usb@sii.li
+
 
+Prolific PL2303 Driver
+
+  This driver support any device that has the PL2303 chip from Prolific
+  in it.  This includes a number of single port USB to serial
+  converters and USB GPS devices.  Devices from Aten (the UC-232) and
+  IO-Data work with this driver.
+
+  For any questions or problems with this driver, please contact Greg
+  Kroah-Hartman at greg@kroah.com
+  
 
 Generic Serial driver
 
@@ -275,13 +321,17 @@
   development board, providing a way to develop USB firmware without
   having to write a custom driver.
 
+  For any questions or problems with this driver, please contact Greg
+  Kroah-Hartman at greg@kroah.com
+
 
 CONTACT:
 
-  If anyone has any problems using this driver, with any of the above
-  specified products, please contact me, or join the Linux-USB mailing
-  list (information on joining the mailing list, as well as a link to its
-  searchable archive is at http://www.linux-usb.org/ )
+  If anyone has any problems using these drivers, with any of the above
+  specified products, please contact the specific driver's author listed
+  above, or join the Linux-USB mailing list (information on joining the
+  mailing list, as well as a link to its searchable archive is at
+  http://www.linux-usb.org/ )
 
 
 Greg Kroah-Hartman
diff -u --recursive --new-file v2.4.14/linux/MAINTAINERS linux/MAINTAINERS
--- v2.4.14/linux/MAINTAINERS	Mon Nov  5 15:55:25 2001
+++ linux/MAINTAINERS	Fri Nov 16 10:03:24 2001
@@ -201,6 +201,12 @@
 M:	linux@treblig.org
 S:	Maintained
 
+ARM/SHARK MACHINE SUPPORT
+P:	Alexander Schulz
+M:	alex@shark-linux.de
+W:	http://www.shark-linux.de/shark.html
+S:	Maintained
+
 ARM/STRONGARM110 PORT
 P:	Russell King
 M:	rmk@arm.linux.org.uk
@@ -529,6 +535,12 @@
 L:	linux-kernel@vger.kernel.org
 S:	Maintained
 
+EXT3 FILE SYSTEM
+P:	Remy Card, Stephen Tweedie
+M:	sct@redhat.com, akpm@zip.com.au, adilger@turbolinux.com
+L:	ext3-users@redhat.com
+S:	Maintained
+
 FARSYNC SYNCHRONOUS DRIVER
 P:	Bob Dunlop
 M:	rjd@xyzzy.clara.co.uk
@@ -758,6 +770,13 @@
 M:	tigran@veritas.com
 S:	Maintained
 
+INTERMEZZO FILE SYSTEM
+P:	Peter J. Braam
+M:      braam@clusterfs.com
+W:      http://www.inter-mezzo.org/
+L:      intermezzo-discuss@lists.sourceforge.net
+S:      Maintained
+
 IP MASQUERADING:
 P:	Juanjo Ciarlante
 M:	jjciarla@raiz.uncu.edu.ar
@@ -1025,7 +1044,7 @@
 
 NETWORK DEVICE DRIVERS
 P:	Andrew Morton
-M:	andrewm@uow.edu.au
+M:	akpm@zip.com.au
 P:	Jeff Garzik
 M:	jgarzik@mandrakesoft.com
 L:	linux-net@vger.kernel.org
@@ -1155,6 +1174,17 @@
 L:	linux-kernel@vger.kernel.org
 S:	Odd Fixes
 
+PCI HOTPLUG CORE
+P:	Greg Kroah-Hartman
+M:	greg@kroah.com
+M:	gregkh@us.ibm.com
+S:	Supported
+
+PCI HOTPLUG COMPAQ DRIVER
+P:	Greg Kroah-Hartman
+M:	greg@kroah.com
+S:	Maintained
+
 PCMCIA SUBSYSTEM
 P:	David Hinds
 M:	dhinds@zen.stanford.edu
@@ -1182,6 +1212,11 @@
 L:	linux-ppp@vger.kernel.org
 S:	Maintained
 
+PPP OVER ATM (RFC 2364)
+P:	Mitchell Blank Jr
+M:	mitch@sfgoth.com
+S:	Maintained
+
 PPP OVER ETHERNET
 P:	Michal Ostrowski
 M:	mostrows@styx.uwaterloo.ca
@@ -1406,8 +1441,8 @@
 S:	Maintained
 
 SYSV FILESYSTEM
-P:	Krzysztof G. Baranowski
-M:	kgb@manjak.knm.org.pl
+P:	Christoph Hellwig
+M:	hch@caldera.de
 S:	Maintained
 
 TLAN NETWORK DRIVER
diff -u --recursive --new-file v2.4.14/linux/Makefile linux/Makefile
--- v2.4.14/linux/Makefile	Mon Nov  5 15:55:25 2001
+++ linux/Makefile	Sat Nov 17 19:06:57 2001
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 4
-SUBLEVEL = 14
-EXTRAVERSION =
+SUBLEVEL = 15
+EXTRAVERSION =-pre7
 
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
@@ -183,6 +183,7 @@
 DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o
 DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o
 DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o
+DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o
 
 DRIVERS := $(DRIVERS-y)
 
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/config.in linux/arch/alpha/config.in
--- v2.4.14/linux/arch/alpha/config.in	Mon Nov  5 15:55:25 2001
+++ linux/arch/alpha/config.in	Mon Nov 19 15:19:42 2001
@@ -296,6 +296,10 @@
 fi
 endmenu
 
+if [ "$CONFIG_PCI" = "y" ]; then
+  source drivers/message/fusion/Config.in
+fi
+
 if [ "$CONFIG_NET" = "y" ]; then
   mainmenu_option next_comment
   comment 'Network device support'
@@ -374,14 +378,15 @@
 mainmenu_option next_comment
 comment 'Kernel hacking'
 
-if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Kernel FP software completion' CONFIG_MATHEMU
+bool 'Legacy kernel start address' CONFIG_ALPHA_LEGACY_START_ADDRESS
+
+bool 'Kernel debugging' CONFIG_DEBUG_KERNEL
+if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
+   tristate '  Kernel FP software completion' CONFIG_MATHEMU
+   bool '  Debug memory allocations' CONFIG_DEBUG_SLAB
+   bool '  Magic SysRq key' CONFIG_MAGIC_SYSRQ
 else
-  define_tristate CONFIG_MATHEMU y
+   define_tristate CONFIG_MATHEMU y
 fi
-
-bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
-
-bool 'Legacy kernel start address' CONFIG_ALPHA_LEGACY_START_ADDRESS
 
 endmenu
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/defconfig linux/arch/alpha/defconfig
--- v2.4.14/linux/arch/alpha/defconfig	Mon Aug 27 12:41:37 2001
+++ linux/arch/alpha/defconfig	Mon Nov 19 15:19:42 2001
@@ -1,7 +1,10 @@
 #
 # Automatically generated make config: don't edit
 #
+CONFIG_ALPHA=y
 # CONFIG_UID16 is not set
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 
 #
 # Code maturity level options
@@ -49,10 +52,13 @@
 # CONFIG_ALPHA_TITAN is not set
 # CONFIG_ALPHA_WILDFIRE is not set
 CONFIG_ISA=y
+CONFIG_EISA=y
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_PCI=y
 CONFIG_ALPHA_BROKEN_IRQ_MASK=y
 # CONFIG_SMP is not set
+# CONFIG_DISCONTIGMEM is not set
 # CONFIG_ALPHA_LARGE_VMALLOC is not set
 CONFIG_PCI_NAMES=y
 # CONFIG_HOTPLUG is not set
@@ -107,8 +113,8 @@
 # CONFIG_MD_RAID0 is not set
 # CONFIG_MD_RAID1 is not set
 # CONFIG_MD_RAID5 is not set
+# CONFIG_MD_MULTIPATH is not set
 # CONFIG_BLK_DEV_LVM is not set
-# CONFIG_LVM_PROC_FS is not set
 
 #
 # Networking options
@@ -135,12 +141,16 @@
 #
 CONFIG_IP_NF_CONNTRACK=m
 CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_IPTABLES=m
 # CONFIG_IP_NF_MATCH_LIMIT is not set
 # CONFIG_IP_NF_MATCH_MAC is not set
 # CONFIG_IP_NF_MATCH_MARK is not set
 # CONFIG_IP_NF_MATCH_MULTIPORT is not set
 # CONFIG_IP_NF_MATCH_TOS is not set
+# CONFIG_IP_NF_MATCH_LENGTH is not set
+# CONFIG_IP_NF_MATCH_TTL is not set
+# CONFIG_IP_NF_MATCH_TCPMSS is not set
 # CONFIG_IP_NF_MATCH_STATE is not set
 # CONFIG_IP_NF_MATCH_UNCLEAN is not set
 # CONFIG_IP_NF_MATCH_OWNER is not set
@@ -151,13 +161,18 @@
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
 # CONFIG_IP_NF_TARGET_REDIRECT is not set
+# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
 # CONFIG_IP_NF_MANGLE is not set
 # CONFIG_IP_NF_TARGET_LOG is not set
+# CONFIG_IP_NF_TARGET_TCPMSS is not set
 CONFIG_IP_NF_COMPAT_IPCHAINS=y
 CONFIG_IP_NF_NAT_NEEDED=y
 # CONFIG_IPV6 is not set
 # CONFIG_KHTTPD is not set
 # CONFIG_ATM is not set
+CONFIG_VLAN_8021Q=m
 
 #
 #  
@@ -222,6 +237,7 @@
 CONFIG_BLK_DEV_IDEPCI=y
 # CONFIG_IDEPCI_SHARE_IRQ is not set
 CONFIG_BLK_DEV_IDEDMA_PCI=y
+CONFIG_BLK_DEV_ADMA=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
 CONFIG_IDEDMA_PCI_AUTO=y
 CONFIG_BLK_DEV_IDEDMA=y
@@ -231,8 +247,8 @@
 # CONFIG_AEC62XX_TUNING is not set
 CONFIG_BLK_DEV_ALI15X3=y
 # CONFIG_WDC_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD7409 is not set
-# CONFIG_AMD7409_OVERRIDE is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_AMD74XX_OVERRIDE is not set
 CONFIG_BLK_DEV_CMD64X=y
 CONFIG_BLK_DEV_CY82C693=y
 # CONFIG_BLK_DEV_CS5530 is not set
@@ -243,7 +259,10 @@
 # CONFIG_BLK_DEV_OPTI621 is not set
 # CONFIG_BLK_DEV_PDC202XX is not set
 # CONFIG_PDC202XX_BURST is not set
+# CONFIG_PDC202XX_FORCE is not set
+# CONFIG_BLK_DEV_SVWKS is not set
 # CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
 # CONFIG_IDE_CHIPSETS is not set
@@ -251,6 +270,9 @@
 # CONFIG_IDEDMA_IVB is not set
 # CONFIG_DMA_NONPCI is not set
 CONFIG_BLK_DEV_IDE_MODES=y
+# CONFIG_BLK_DEV_ATARAID is not set
+# CONFIG_BLK_DEV_ATARAID_PDC is not set
+# CONFIG_BLK_DEV_ATARAID_HPT is not set
 
 #
 # SCSI support
@@ -263,6 +285,7 @@
 CONFIG_BLK_DEV_SD=y
 CONFIG_SD_EXTRA_DEVS=40
 # CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
 CONFIG_BLK_DEV_SR=y
 CONFIG_BLK_DEV_SR_VENDOR=y
 CONFIG_SR_EXTRA_DEVS=2
@@ -288,6 +311,8 @@
 CONFIG_SCSI_AIC7XXX=y
 CONFIG_AIC7XXX_CMDS_PER_DEVICE=253
 CONFIG_AIC7XXX_RESET_DELAY_MS=5000
+# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
+# CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
@@ -349,6 +374,12 @@
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
+# CONFIG_SUNLANCE is not set
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNBMAC is not set
+# CONFIG_SUNQE is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNGEM is not set
 CONFIG_NET_VENDOR_3COM=y
 # CONFIG_EL1 is not set
 # CONFIG_EL2 is not set
@@ -356,12 +387,15 @@
 # CONFIG_EL16 is not set
 # CONFIG_EL3 is not set
 # CONFIG_3C515 is not set
+# CONFIG_ELMC is not set
+# CONFIG_ELMC_II is not set
 CONFIG_VORTEX=y
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC 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=y
 # CONFIG_PCNET32 is not set
@@ -393,11 +427,15 @@
 # Ethernet (1000 Mbit)
 #
 # CONFIG_ACENIC is not set
+CONFIG_DL2K=m
+# CONFIG_MYRI_SBUS is not set
+CONFIG_NS83820=m
 # CONFIG_HAMACHI is not set
 CONFIG_YELLOWFIN=y
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
 
@@ -463,7 +501,11 @@
 #
 # Joysticks
 #
-# CONFIG_JOYSTICK is not set
+# CONFIG_INPUT_GAMEPORT is not set
+
+#
+# Input core support is needed for gameports
+#
 
 #
 # Input core support is needed for joysticks
@@ -499,6 +541,8 @@
 # CONFIG_QUOTA is not set
 CONFIG_AUTOFS_FS=m
 # CONFIG_AUTOFS4_FS is not set
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -510,11 +554,15 @@
 CONFIG_VFAT_FS=y
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
+CONFIG_TMPFS=y
 # CONFIG_RAMFS is not set
 CONFIG_ISO9660_FS=y
 # CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -528,7 +576,6 @@
 # CONFIG_ROMFS_FS is not set
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
-# CONFIG_SYSV_FS_WRITE is not set
 # CONFIG_UDF_FS is not set
 # CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
@@ -554,10 +601,10 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
+# CONFIG_ZISOFS_FS is not set
+# CONFIG_ZLIB_FS_INFLATE is not set
 
 #
 # Partition Types
@@ -565,6 +612,7 @@
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_OSF_PARTITION=y
 CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
 CONFIG_NLS=y
 
 #
@@ -586,11 +634,13 @@
 # CONFIG_NLS_CODEPAGE_865 is not set
 # CONFIG_NLS_CODEPAGE_866 is not set
 # CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
 # CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 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_1251 is not set
 # CONFIG_NLS_ISO8859_1 is not set
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
@@ -598,11 +648,12 @@
 # CONFIG_NLS_ISO8859_5 is not set
 # CONFIG_NLS_ISO8859_6 is not set
 # CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 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
 
 #
@@ -626,13 +677,121 @@
 # CONFIG_USB is not set
 
 #
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+# CONFIG_USB_OHCI is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_STORAGE_DEBUG 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_SDDR09 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+
+#
+#   Input core support is needed for USB HID
+#
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+
+#
+#   Video4Linux support is needed for USB Multimedia device support
+#
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_CDCETHER is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_SERIAL_GENERIC is not set
+# CONFIG_USB_SERIAL_BELKIN is not set
+# CONFIG_USB_SERIAL_WHITEHEAT is not set
+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+# CONFIG_USB_SERIAL_EMPEG is not set
+# CONFIG_USB_SERIAL_FTDI_SIO is not set
+# CONFIG_USB_SERIAL_VISOR is not set
+# CONFIG_USB_SERIAL_IR is not set
+# CONFIG_USB_SERIAL_EDGEPORT is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
+# CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_PL2303 is not set
+# CONFIG_USB_SERIAL_CYBERJACK is not set
+# CONFIG_USB_SERIAL_XIRCOM is not set
+# CONFIG_USB_SERIAL_OMNINET is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
 # Input core support
 #
 # CONFIG_INPUT is not set
+# CONFIG_INPUT_KEYBDEV is not set
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
 
 #
 # Kernel hacking
 #
+CONFIG_ALPHA_LEGACY_START_ADDRESS=y
+CONFIG_DEBUG_KERNEL=y
 CONFIG_MATHEMU=y
+# CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
-CONFIG_ALPHA_LEGACY_START_ADDRESS=y
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S
--- v2.4.14/linux/arch/alpha/kernel/entry.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/alpha/kernel/entry.S	Fri Nov  9 13:45:35 2001
@@ -1145,3 +1145,6 @@
 	.quad sys_mincore			/* 375 */
 	.quad sys_pciconfig_iobase
 	.quad sys_getdents64
+	.quad sys_gettid
+	.quad sys_readahead
+	.quad sys_ni_syscall			/* 380, sys_security */
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/proto.h linux/arch/alpha/kernel/proto.h
--- v2.4.14/linux/arch/alpha/kernel/proto.h	Fri Mar  2 11:12:07 2001
+++ linux/arch/alpha/kernel/proto.h	Wed Nov 14 08:18:06 2001
@@ -91,7 +91,6 @@
 
 /* smp.c */
 extern void setup_smp(void);
-extern int smp_info(char *buffer);
 extern void handle_ipi(struct pt_regs *);
 extern void smp_percpu_timer_interrupt(struct pt_regs *);
 
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c
--- v2.4.14/linux/arch/alpha/kernel/setup.c	Mon Nov  5 15:55:25 2001
+++ linux/arch/alpha/kernel/setup.c	Fri Nov 16 18:38:39 2001
@@ -30,6 +30,7 @@
 #include <linux/ioport.h>
 #include <linux/bootmem.h>
 #include <linux/pci.h>
+#include <linux/seq_file.h>
 
 #ifdef CONFIG_BLK_DEV_INITRD
 #include <linux/blk.h>
@@ -1043,10 +1044,8 @@
 }
 
 
-/*
- * BUFFER is PAGE_SIZE bytes long.
- */
-int get_cpuinfo(char *buffer)
+static int
+show_cpuinfo(struct seq_file *f, void *slot)
 {
 	extern struct unaligned_stat {
 		unsigned long count, va, pc;
@@ -1058,14 +1057,13 @@
 		"EV68CX", "EV7", "EV79", "EV69"
 	};
 
-	struct percpu_struct *cpu;
+	struct percpu_struct *cpu = slot;
 	unsigned int cpu_index;
 	char *cpu_name;
 	char *systype_name;
 	char *sysvariation_name;
-	int len, nr_processors;
+	int nr_processors;
 
-	cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset);
 	cpu_index = (unsigned) (cpu->type - 1);
 	cpu_name = "Unknown";
 	if (cpu_index < N(cpu_names))
@@ -1076,8 +1074,7 @@
 
 	nr_processors = get_nr_processors(cpu, hwrpb->nr_processors);
 
-	len = sprintf(buffer,
-		      "cpu\t\t\t: Alpha\n"
+	seq_printf(f, "cpu\t\t\t: Alpha\n"
 		      "cpu model\t\t: %s\n"
 		      "cpu variation\t\t: %ld\n"
 		      "cpu revision\t\t: %ld\n"
@@ -1114,11 +1111,41 @@
 		       platform_string(), nr_processors);
 
 #ifdef CONFIG_SMP
-	len += smp_info(buffer+len);
+	seq_printf(f, "cpus active\t\t: %d\n"
+		      "cpu active mask\t\t: %016lx\n",
+		       smp_num_cpus, cpu_present_mask);
 #endif
 
-	return len;
+	return 0;
+}
+
+/*
+ * We show only CPU #0 info.
+ */
+static void *
+c_start(struct seq_file *f, loff_t *pos)
+{
+	return *pos ? NULL : (char *)hwrpb + hwrpb->processor_offset;
+}
+
+static void *
+c_next(struct seq_file *f, void *v, loff_t *pos)
+{
+	return NULL;
 }
+
+static void
+c_stop(struct seq_file *f, void *v)
+{
+}
+
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
+
 
 static int alpha_panic_event(struct notifier_block *this,
 			     unsigned long event,
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/signal.c linux/arch/alpha/kernel/signal.c
--- v2.4.14/linux/arch/alpha/kernel/signal.c	Wed Jan 24 15:16:23 2001
+++ linux/arch/alpha/kernel/signal.c	Fri Nov  9 13:45:35 2001
@@ -17,6 +17,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/stddef.h>
+#include <linux/tty.h>
 
 #include <asm/bitops.h>
 #include <asm/uaccess.h>
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c
--- v2.4.14/linux/arch/alpha/kernel/smp.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/alpha/kernel/smp.c	Wed Nov 14 08:18:06 2001
@@ -1091,15 +1091,6 @@
 	}
 }
 
-int
-smp_info(char *buffer)
-{
-	return sprintf(buffer,
-		       "cpus active\t\t: %d\n"
-		       "cpu active mask\t\t: %016lx\n",
-		       smp_num_cpus, cpu_present_mask);
-}
-
 #if DEBUG_SPINLOCK
 void
 spin_unlock(spinlock_t * lock)
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/sys_miata.c linux/arch/alpha/kernel/sys_miata.c
--- v2.4.14/linux/arch/alpha/kernel/sys_miata.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/alpha/kernel/sys_miata.c	Fri Nov  9 13:58:02 2001
@@ -176,6 +176,19 @@
 		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 31,  PCI-PCI */
         };
 	const long min_idsel = 3, max_idsel = 20, irqs_per_slot = 5;
+	
+	/* the USB function of the 82c693 has it's interrupt connected to 
+           the 2nd 8259 controller. So we have to check for it first. */
+
+	if((slot == 7) && (PCI_FUNC(dev->devfn) == 3)) {
+		u8 irq=0;
+
+		if(pci_read_config_byte(pci_find_slot(dev->bus->number, dev->devfn & ~(7)), 0x40,&irq)!=PCIBIOS_SUCCESSFUL)
+			return -1;
+		else	
+			return irq;
+	}
+
 	return COMMON_TABLE_LOOKUP;
 }
 
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/kernel/time.c linux/arch/alpha/kernel/time.c
--- v2.4.14/linux/arch/alpha/kernel/time.c	Mon Nov  5 15:55:25 2001
+++ linux/arch/alpha/kernel/time.c	Sat Nov 17 11:47:44 2001
@@ -186,8 +186,8 @@
 		[EV4_CPU]    = {  150000000,  300000000 },
 		[LCA4_CPU]   = {  150000000,  300000000 },	/* guess */
 		[EV45_CPU]   = {  200000000,  300000000 },
-		[EV5_CPU]    = {  266000000,  333333333 },
-		[EV56_CPU]   = {  366000000,  667000000 },
+		[EV5_CPU]    = {  250000000,  433000000 },
+		[EV56_CPU]   = {  333000000,  667000000 },
 		[PCA56_CPU]  = {  400000000,  600000000 },	/* guess */
 		[PCA57_CPU]  = {  500000000,  600000000 },	/* guess */
 		[EV6_CPU]    = {  466000000,  600000000 },
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/lib/dec_and_lock.c linux/arch/alpha/lib/dec_and_lock.c
--- v2.4.14/linux/arch/alpha/lib/dec_and_lock.c	Mon Nov  5 15:55:25 2001
+++ linux/arch/alpha/lib/dec_and_lock.c	Fri Nov  9 13:39:57 2001
@@ -18,15 +18,16 @@
 	subl	$1, 1, $1			\n\
 	beq	$1, 2f				\n\
 	stl_c	$1, 0($16)			\n\
-	beq	$1, 3f				\n\
+	beq	$1, 4f				\n\
 	mb					\n\
 	clr	$0				\n\
 	ret					\n\
-3:	br	1b				\n\
-2:	lda	$27, atomic_dec_and_lock_1	\n\
+2:	br	$29, 3f				\n\
+3:	ldgp	$29, 0($29)			\n\
+	br	$atomic_dec_and_lock_1..ng	\n\
+	.subsection 2				\n\
+4:	br	1b				\n\
 	.end atomic_dec_and_lock");
-
-	/* FALLTHRU */
 
 static int __attribute__((unused))
 atomic_dec_and_lock_1(atomic_t *atomic, spinlock_t *lock)
diff -u --recursive --new-file v2.4.14/linux/arch/alpha/lib/io.c linux/arch/alpha/lib/io.c
--- v2.4.14/linux/arch/alpha/lib/io.c	Sat Nov 27 15:27:48 1999
+++ linux/arch/alpha/lib/io.c	Fri Nov  9 13:45:35 2001
@@ -9,124 +9,124 @@
 
 #include <asm/io.h>
 
-unsigned int _inb(unsigned long addr)
+u8 _inb(unsigned long addr)
 {
 	return __inb(addr);
 }
 
-unsigned int _inw(unsigned long addr)
+u16 _inw(unsigned long addr)
 {
 	return __inw(addr);
 }
 
-unsigned int _inl(unsigned long addr)
+u32 _inl(unsigned long addr)
 {
 	return __inl(addr);
 }
 
 
-void _outb(unsigned char b, unsigned long addr)
+void _outb(u8 b, unsigned long addr)
 {
 	__outb(b, addr);
 }
 
-void _outw(unsigned short b, unsigned long addr)
+void _outw(u16 b, unsigned long addr)
 {
 	__outw(b, addr);
 }
 
-void _outl(unsigned int b, unsigned long addr)
+void _outl(u32 b, unsigned long addr)
 {
 	__outl(b, addr);
 }
 
-unsigned long ___raw_readb(unsigned long addr)
+u8 ___raw_readb(unsigned long addr)
 {
 	return __readb(addr);
 }
 
-unsigned long ___raw_readw(unsigned long addr)
+u16 ___raw_readw(unsigned long addr)
 {
 	return __readw(addr);
 }
 
-unsigned long ___raw_readl(unsigned long addr)
+u32 ___raw_readl(unsigned long addr)
 {
 	return __readl(addr);
 }
 
-unsigned long ___raw_readq(unsigned long addr)
+u64 ___raw_readq(unsigned long addr)
 {
 	return __readq(addr);
 }
 
-unsigned long _readb(unsigned long addr)
+u8 _readb(unsigned long addr)
 {
 	unsigned long r = __readb(addr);
 	mb();
 	return r;
 }
 
-unsigned long _readw(unsigned long addr)
+u16 _readw(unsigned long addr)
 {
 	unsigned long r = __readw(addr);
 	mb();
 	return r;
 }
 
-unsigned long _readl(unsigned long addr)
+u32 _readl(unsigned long addr)
 {
 	unsigned long r = __readl(addr);
 	mb();
 	return r;
 }
 
-unsigned long _readq(unsigned long addr)
+u64 _readq(unsigned long addr)
 {
 	unsigned long r = __readq(addr);
 	mb();
 	return r;
 }
 
-void ___raw_writeb(unsigned char b, unsigned long addr)
+void ___raw_writeb(u8 b, unsigned long addr)
 {
 	__writeb(b, addr);
 }
 
-void ___raw_writew(unsigned short b, unsigned long addr)
+void ___raw_writew(u16 b, unsigned long addr)
 {
 	__writew(b, addr);
 }
 
-void ___raw_writel(unsigned int b, unsigned long addr)
+void ___raw_writel(u32 b, unsigned long addr)
 {
 	__writel(b, addr);
 }
 
-void ___raw_writeq(unsigned long b, unsigned long addr)
+void ___raw_writeq(u64 b, unsigned long addr)
 {
 	__writeq(b, addr);
 }
 
-void _writeb(unsigned char b, unsigned long addr)
+void _writeb(u8 b, unsigned long addr)
 {
 	__writeb(b, addr);
 	mb();
 }
 
-void _writew(unsigned short b, unsigned long addr)
+void _writew(u16 b, unsigned long addr)
 {
 	__writew(b, addr);
 	mb();
 }
 
-void _writel(unsigned int b, unsigned long addr)
+void _writel(u32 b, unsigned long addr)
 {
 	__writel(b, addr);
 	mb();
 }
 
-void _writeq(unsigned long b, unsigned long addr)
+void _writeq(u64 b, unsigned long addr)
 {
 	__writeq(b, addr);
 	mb();
diff -u --recursive --new-file v2.4.14/linux/arch/arm/Makefile linux/arch/arm/Makefile
--- v2.4.14/linux/arch/arm/Makefile	Tue Oct 23 22:48:49 2001
+++ linux/arch/arm/Makefile	Fri Nov  9 13:58:02 2001
@@ -39,11 +39,12 @@
 tune-$(CONFIG_CPU_ARM710)	:=-mtune=arm710
 tune-$(CONFIG_CPU_ARM720T)	:=-mtune=arm7tdmi
 tune-$(CONFIG_CPU_ARM920T)	:=-mtune=arm9tdmi
+tune-$(CONFIG_CPU_ARM926T)	:=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_SA110)	:=-mtune=strongarm110
 tune-$(CONFIG_CPU_SA1100)	:=-mtune=strongarm1100
 
 CFLAGS		+=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
-AFLAGS		+=$(apcs-y) $(arch-y) -mno-fpu
+AFLAGS		+=$(apcs-y) $(arch-y) -mno-fpu -msoft-float
 
 ifeq ($(CONFIG_CPU_26),y)
 PROCESSOR	 = armo
@@ -120,6 +121,10 @@
 MACHINE		 = integrator
 endif
 
+ifeq ($(CONFIG_ARCH_CAMELOT),y)
+MACHINE          = epxa10db
+endif
+
 ifeq ($(CONFIG_ARCH_CLPS711X),y)
 TEXTADDR	 = 0xc0028000
 MACHINE		 = clps711x
@@ -150,17 +155,22 @@
 
 HEAD		:= arch/arm/kernel/head-$(PROCESSOR).o \
 		   arch/arm/kernel/init_task.o
-SUBDIRS		+= arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe \
-		   arch/arm/fastfpe
+SUBDIRS		+= arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe
 CORE_FILES	:= arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)
 LIBS		:= arch/arm/lib/lib.a $(LIBS)
 
 ifeq ($(CONFIG_FPE_NWFPE),y)
 LIBS		:= arch/arm/nwfpe/math-emu.o $(LIBS)
 endif
+
+# Only include fastfpe if it is part of the kernel tree.
+FASTFPE		:= arch/arm/fastfpe
+ifeq ($(FASTFPE),$(wildcard $(FASTFPE)))
+SUBDIRS		+= $(FASTFPE)
 ifeq ($(CONFIG_FPE_FASTFPE),y)
 LIBS		:= arch/arm/fastfpe/fast-math-emu.o $(LIBS)
 endif
+endif
 
 ifeq ($(findstring y,$(CONFIG_ARCH_CLPS7500) $(CONFIG_ARCH_L7200)),y)
 SUBDIRS		+= drivers/acorn/char
@@ -213,7 +223,8 @@
 	@$(MAKETOOLS) dep
 	@$(MAKEBOOT) dep
 
-maketools: checkbin
+# we need version.h
+maketools: checkbin include/linux/version.h
 	@$(MAKETOOLS) all
 
 # Ensure this is ld "2.9.4" or later
diff -u --recursive --new-file v2.4.14/linux/arch/arm/config.in linux/arch/arm/config.in
--- v2.4.14/linux/arch/arm/config.in	Mon Nov  5 15:55:25 2001
+++ linux/arch/arm/config.in	Fri Nov  9 13:58:02 2001
@@ -12,7 +12,7 @@
 define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
 define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
 define_bool CONFIG_GENERIC_BUST_SPINLOCK n
-
+define_bool CONFIG_GENERIC_ISA_DMA n
 
 mainmenu_option next_comment
 comment 'Code maturity level options'
@@ -261,19 +261,42 @@
    fi
 fi
 
+# ARM926T
+if [ "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then
+   bool 'Support ARM926T processor' CONFIG_CPU_ARM926T
+else
+   define_bool CONFIG_CPU_ARM926T n
+fi
+if [ "$CONFIG_CPU_ARM926T" = "y" ]; then
+   bool '  ARM926T CPU idle' CONFIG_CPU_ARM926_CPU_IDLE
+   bool '  ARM926T I-Cache on' CONFIG_CPU_ARM926_I_CACHE_ON
+   bool '  ARM926T D-Cache on' CONFIG_CPU_ARM926_D_CACHE_ON
+   if [ "$CONFIG_CPU_ARM926_D_CACHE_ON" = "y" ] ; then
+      bool '  Force write through caches on ARM926T' CONFIG_CPU_ARM926_WRITETHROUGH
+   fi
+   if [ "$CONFIG_CPU_ARM926_I_CACHE_ON" = "y" -o \
+        "$CONFIG_CPU_ARM926_D_CACHE_ON" = "y" ]; then
+      bool '  Round robin I and D cache replacement algorithm' CONFIG_CPU_ARM926_ROUND_ROBIN
+   fi
+fi
+
 # ARM1020
-#if [ "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then
-#   bool 'Support ARM1020 processor' CONFIG_CPU_ARM1020
-#else
+if [ "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then
+   bool 'Support ARM1020 processor' CONFIG_CPU_ARM1020
+else
     define_bool CONFIG_CPU_ARM1020 n
-#fi
-#if [ "$CONFIG_CPU_ARM1020" = "y" ]; then
-#   bool '  ARM10 I-Cache on' CONFIG_CPU_ARM10_I_CACHE_ON
-#   bool '  ARM10 D-Cache on' CONFIG_CPU_ARM10_D_CACHE_ON
-#   if [ "$CONFIG_CPU_ARM10_D_CACHE_ON" = "y" ] ; then
-#      bool '  Force write through caches on ARM10' CONFIG_CPU_ARM10_FORCE_WRITE_THROUGH
-#   fi
-#fi
+fi
+if [ "$CONFIG_CPU_ARM1020" = "y" ]; then
+   bool '  ARM1020 I-Cache on' CONFIG_CPU_ARM1020_I_CACHE_ON
+   bool '  ARM10 D-Cache on' CONFIG_CPU_ARM1020_D_CACHE_ON
+   if [ "$CONFIG_CPU_ARM1020_D_CACHE_ON" = "y" ] ; then
+      bool '  Force write through caches on ARM1020' CONFIG_CPU_ARM1020_FORCE_WRITE_THROUGH
+   fi
+   if [ "$CONFIG_CPU_ARM1020_I_CACHE_ON" = "y" -o \
+        "$CONFIG_CPU_ARM1020_D_CACHE_ON" = "y" ]; then
+      bool '  Round robin I and D cache replacement algorithm' CONFIG_CPU_ARM1020_ROUND_ROBIN
+   fi
+fi
 
 # SA110
 if [ "$CONFIG_ARCH_EBSA110"  = "y" -o "$CONFIG_FOOTBRIDGE" = "y" -o \
diff -u --recursive --new-file v2.4.14/linux/arch/arm/kernel/setup.c linux/arch/arm/kernel/setup.c
--- v2.4.14/linux/arch/arm/kernel/setup.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/arm/kernel/setup.c	Fri Nov 16 10:07:47 2001
@@ -1,7 +1,7 @@
 /*
  *  linux/arch/arm/kernel/setup.c
  *
- *  Copyright (C) 1995-2000 Russell King
+ *  Copyright (C) 1995-2001 Russell King
  *
  * 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
@@ -16,6 +16,7 @@
 #include <linux/blk.h>
 #include <linux/console.h>
 #include <linux/bootmem.h>
+#include <linux/seq_file.h>
 #include <linux/init.h>
 
 #include <asm/elf.h>
@@ -532,58 +533,53 @@
 	NULL
 };
 
-/*
- * get_cpuinfo - Get information on one CPU for use by the procfs.
- *
- *	Prints info on the next CPU into buffer.  Beware, doesn't check for
- *	buffer overflow.  Current implementation of procfs assumes that the
- *	resulting data is <= 1K.
- *
- * Args:
- *	buffer	-- you guessed it, the data buffer
- *	cpu_np	-- Input: next cpu to get (start at 0).  Output: Updated.
- *
- *	Returns number of bytes written to buffer.
- */
-
-int get_cpuinfo(char *buffer, unsigned *cpu_np)
+static int c_show(struct seq_file *m, void *v)
 {
-	char *p = buffer;
-	unsigned n;
 	int i;
 
- 	/* No SMP at the moment, so just toggle 0/1 */
-	n = *cpu_np;
-	*cpu_np = 1;
-	if (n != 0) {
-		return (0);
-	}
-
-	p += sprintf(p, "Processor\t: %s %s rev %d (%s)\n",
-		     proc_info.manufacturer, proc_info.cpu_name,
-		     (int)processor_id & 15, elf_platform);
-
-	p += sprintf(p, "BogoMIPS\t: %lu.%02lu\n",
-		     loops_per_jiffy / (500000/HZ),
-		     (loops_per_jiffy / (5000/HZ)) % 100);
+	seq_printf(m, "Processor\t: %s %s rev %d (%s)\n",
+		   proc_info.manufacturer, proc_info.cpu_name,
+		   (int)processor_id & 15, elf_platform);
+
+	seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
+		   loops_per_jiffy / (500000/HZ),
+		   (loops_per_jiffy / (5000/HZ)) % 100);
 
 	/* dump out the processor features */
-	p += sprintf(p, "Features\t: ");
+	seq_puts(m, "Features\t: ");
 
 	for (i = 0; hwcap_str[i]; i++)
 		if (elf_hwcap & (1 << i))
-			p += sprintf(p, "%s ", hwcap_str[i]);
+			seq_printf(m, "%s ", hwcap_str[i]);
+
+	seq_puts(m, "\n\n");
 
-	p += sprintf(p, "\n\n");
+	seq_printf(m, "Hardware\t: %s\n", machine_name);
+	seq_printf(m, "Revision\t: %04x\n", system_rev);
+	seq_printf(m, "Serial\t\t: %08x%08x\n",
+		   system_serial_high, system_serial_low);
 
-	p += sprintf(p, "Hardware\t: %s\n", machine_name);
+	return 0;
+}
 
-	p += sprintf(p, "Revision\t: %04x\n",
-		     system_rev);
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	return *pos < 1 ? (void *)1 : NULL;
+}
 
-	p += sprintf(p, "Serial\t\t: %08x%08x\n",
-		     system_serial_high,
-		     system_serial_low);
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return NULL;
+}
 
-	return p - buffer;
+static void c_stop(struct seq_file *m, void *v)
+{
 }
+
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	c_show
+};
diff -u --recursive --new-file v2.4.14/linux/arch/arm/lib/gcclib.h linux/arch/arm/lib/gcclib.h
--- v2.4.14/linux/arch/arm/lib/gcclib.h	Tue Oct 23 22:48:49 2001
+++ linux/arch/arm/lib/gcclib.h	Fri Nov  9 13:58:02 2001
@@ -11,7 +11,7 @@
 typedef          int word_type 	__attribute__ ((mode (__word__)));
 typedef unsigned int UDItype    __attribute__ ((mode (DI)));
 
-#if 0 /* FIXME: endian test here!!! */
+#ifdef __ARMEB__
   struct DIstruct {SItype high, low;};
 #else
   struct DIstruct {SItype low, high;};
diff -u --recursive --new-file v2.4.14/linux/arch/arm/mm/Makefile linux/arch/arm/mm/Makefile
--- v2.4.14/linux/arch/arm/mm/Makefile	Mon Aug 27 12:41:38 2001
+++ linux/arch/arm/mm/Makefile	Fri Nov  9 13:58:02 2001
@@ -34,6 +34,7 @@
 p-$(CONFIG_CPU_ARM710)	+= proc-arm6,7.o
 p-$(CONFIG_CPU_ARM720T)	+= proc-arm720.o
 p-$(CONFIG_CPU_ARM920T)	+= proc-arm920.o
+p-$(CONFIG_CPU_ARM926T)	+= proc-arm926.o
 p-$(CONFIG_CPU_ARM1020)	+= proc-arm1020.o
 p-$(CONFIG_CPU_SA110)	+= proc-sa110.o
 p-$(CONFIG_CPU_SA1100)	+= proc-sa110.o
diff -u --recursive --new-file v2.4.14/linux/arch/arm/mm/proc-arm1020.S linux/arch/arm/mm/proc-arm1020.S
--- v2.4.14/linux/arch/arm/mm/proc-arm1020.S	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mm/proc-arm1020.S	Fri Nov  9 13:58:02 2001
@@ -0,0 +1,762 @@
+/*
+ *  linux/arch/arm/mm/arm1020.S: MMU functions for ARM1020
+ *
+ *  Copyright (C) 2000 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ * These are the low level assembler for performing cache and TLB
+ * functions on the arm1020.
+ */
+#include <linux/linkage.h>
+#include <linux/config.h>
+#include <asm/assembler.h>
+#include <asm/constants.h>
+#include <asm/procinfo.h>
+#include <asm/hardware.h>
+
+/*
+ * This is the maximum size of an area which will be invalidated
+ * using the single invalidate entry instructions.  Anything larger
+ * than this, and we go for the whole cache.
+ *
+ * This value should be chosen such that we choose the cheapest
+ * alternative.
+ */
+#define MAX_AREA_SIZE	32768
+
+/*
+ * the cache line size of the I and D cache
+ */
+#define DCACHELINESIZE	32
+#define ICACHELINESIZE	32
+
+/*
+ * and the page size
+ */
+#define PAGESIZE	4096
+
+	.text
+
+/*
+ * cpu_arm1020_data_abort()
+ *
+ * obtain information about current aborted instruction
+ *
+ * r0 = address of aborted instruction
+ *
+ * Returns:
+ *  r0 = address of abort
+ *  r1 != 0 if writing
+ *  r3 = FSR
+ */
+	.align	5
+ENTRY(cpu_arm1020_data_abort)
+	ldr	r1, [r0]			@ read aborted instruction
+	mrc	p15, 0, r0, c6, c0, 0		@ get FAR
+	tst	r1, r1, lsr #21 		@ C = bit 20
+	mrc	p15, 0, r3, c5, c0, 0		@ get FSR
+	sbc	r1, r1, r1			@ r1 = C - 1
+	and	r3, r3, #255
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_check_bugs()
+ */
+ENTRY(cpu_arm1020_check_bugs)
+	mrs	ip, cpsr
+	bic	ip, ip, #F_BIT
+	msr	cpsr, ip
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_proc_init()
+ */
+ENTRY(cpu_arm1020_proc_init)
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_proc_fin()
+ */
+ENTRY(cpu_arm1020_proc_fin)
+	stmfd	sp!, {lr}
+	mov	ip, #F_BIT | I_BIT | SVC_MODE
+	msr	cpsr_c, ip
+	bl	cpu_arm1020_cache_clean_invalidate_all
+	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
+	bic	r0, r0, #0x1000 		@ ...i............
+	bic	r0, r0, #0x000e 		@ ............wca.
+	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
+	ldmfd	sp!, {pc}
+
+/*
+ * cpu_arm1020_reset(loc)
+ *
+ * Perform a soft reset of the system.	Put the CPU into the
+ * same state as it would be if it had been reset, and branch
+ * to what would be the reset vector.
+ *
+ * loc: location to jump to for soft reset
+ */
+	.align	5
+ENTRY(cpu_arm1020_reset)
+	mov	ip, #0
+	mcr	p15, 0, ip, c7, c7, 0		@ invalidate I,D caches
+	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
+	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
+	mrc	p15, 0, ip, c1, c0, 0		@ ctrl register
+	bic	ip, ip, #0x000f 		@ ............wcam
+	bic	ip, ip, #0x1100 		@ ...i...s........
+	mcr	p15, 0, ip, c1, c0, 0		@ ctrl register
+	mov	pc, r0
+
+/*
+ * cpu_arm1020_do_idle()
+ */
+	.align	5
+ENTRY(cpu_arm1020_do_idle)
+	mcr	p15, 0, r0, c7, c0, 4		@ Wait for interrupt
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/* ================================= CACHE ================================ */
+
+
+/*
+ * cpu_arm1020_cache_clean_invalidate_all()
+ *
+ * clean and invalidate all cache lines
+ *
+ * Note:
+ *  1. we should preserve r0 at all times
+ */
+	.align	5
+ENTRY(cpu_arm1020_cache_clean_invalidate_all)
+	mov	r2, #1
+cpu_arm1020_cache_clean_invalidate_all_r2:
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mcr	p15, 0, ip, c7, c10, 4
+
+	mov	r1, #0xf			@ 16 segments
+1:	mov	r3, #0x3F			@ 64 entries
+2:	mov	ip, r3, LSL #26 		@ shift up entry
+	orr	ip, ip, r1, LSL #5		@ shift in/up index
+	mcr	p15, 0, ip, c7, c14, 2		@ Clean & Inval DCache entry
+	mcr	p15, 0, ip, c7, c10, 4		@ drain WB 
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	ip, ip
+#endif
+	subs	r3, r3, #1
+	cmp	r3, #0
+	bge	2b				@ entries 3F to 0
+	subs	r1, r1, #1
+	cmp	r1, #0
+	bge	1b				@ segments 7 to 0
+#endif
+        
+#ifdef CONFIG_CPU_ARM1020_I_CACHE_ON
+	teq	r2, #0
+	mcrne	p15, 0, ip, c7, c5, 0		@ invalidate I cache
+#endif
+	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	ip, ip
+	mov	ip, ip
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_cache_clean_invalidate_range(start, end, flags)
+ *
+ * clean and invalidate all cache lines associated with this area of memory
+ *
+ * start: Area start address
+ * end:   Area end address
+ * flags: nonzero for I cache as well
+ */
+	.align	5
+ENTRY(cpu_arm1020_cache_clean_invalidate_range)
+	bic	r0, r0, #DCACHELINESIZE - 1
+	sub	r3, r1, r0
+	cmp	r3, #MAX_AREA_SIZE
+	bgt	cpu_arm1020_cache_clean_invalidate_all_r2
+	mcr	p15, 0, r3, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+1:	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	add	r0, r0, #DCACHELINESIZE
+	cmp	r0, r1
+	blt	1b
+#endif
+
+#ifdef CONFIG_CPU_ARM1020_I_CACHE_ON
+	teq	r2, #0
+	movne	r0, #0
+	mcrne	p15, 0, r0, c7, c5, 0		@ invalidate I cache
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_flush_ram_page(page)
+ *
+ * clean and invalidate all cache lines associated with this area of memory
+ *
+ * page: page to clean and invalidate
+ */
+	.align	5
+ENTRY(cpu_arm1020_flush_ram_page)
+	mcr	p15, 0, r1, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mov	r1, #PAGESIZE
+1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	subs	r1, r1, #2 * DCACHELINESIZE
+	bne	1b
+	mov	r0, #0
+
+#endif
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/* ================================ D-CACHE =============================== */
+
+/*
+ * cpu_arm1020_dcache_invalidate_range(start, end)
+ *
+ * throw away all D-cached data in specified region without an obligation
+ * to write them back.	Note however that we must clean the D-cached entries
+ * around the boundaries if the start and/or end address are not cache
+ * aligned.
+ *
+ * start: virtual start address
+ * end:   virtual end address
+ */
+	.align	5
+ENTRY(cpu_arm1020_dcache_invalidate_range)
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	/* D cache are on */
+	tst	r0, #DCACHELINESIZE - 1
+	bic	r0, r0, #DCACHELINESIZE - 1
+	mcrne	p15, 0, r0, c7, c10, 4
+	mcrne	p15, 0, r0, c7, c10, 1		@ clean D entry at start
+	mcrne	p15, 0, r0, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	tst	r1, #DCACHELINESIZE - 1
+	mcrne	p15, 0, r1, c7, c10, 4
+	mcrne	p15, 0, r1, c7, c10, 1		@ clean D entry at end
+	mcrne	p15, 0, r1, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r1, r1
+	mov	r1, r1
+	mov	r1, r1
+#endif
+        
+1:	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	add	r0, r0, #DCACHELINESIZE
+	cmp	r0, r1
+	blt	1b
+#else
+	/* D cache off, but still drain the write buffer */
+	mcr	p15, 0, r0, c7, c10, 4		@ Drain write buffer
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_dcache_clean_range(start, end)
+ *
+ * For the specified virtual address range, ensure that all caches contain
+ * clean data, such that peripheral accesses to the physical RAM fetch
+ * correct data.
+ *
+ * start: virtual start address
+ * end:   virtual end address
+ */
+	.align	5
+ENTRY(cpu_arm1020_dcache_clean_range)
+	bic	r0, r0, #DCACHELINESIZE - 1
+	sub	r3, r1, r0
+	cmp	r3, #MAX_AREA_SIZE
+	bgt	cpu_arm1020_cache_clean_invalidate_all_r2
+	mcr	p15, 0, r3, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+1:	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	add	r0, r0, #DCACHELINESIZE
+	cmp	r0, r1
+	blt	1b
+#endif
+
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_dcache_clean_page(page)
+ *
+ * Cleans a single page of dcache so that if we have any future aliased
+ * mappings, they will be consistent at the time that they are created.
+ *
+ * page: virtual address of page to clean from dcache
+ *
+ * Note:
+ *  1. we don't need to flush the write buffer in this case.
+ *  2. we don't invalidate the entries since when we write the page
+ *     out to disk, the entries may get reloaded into the cache.
+ */
+	.align	5
+ENTRY(cpu_arm1020_dcache_clean_page)
+	mov	r1, #PAGESIZE
+	mcr	p15, 0, r0, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry  (drain is done by TLB fns)
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	add	r0, r0, #DCACHELINESIZE
+	subs	r1, r1, #2 * DCACHELINESIZE
+	bhi	1b
+#endif
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_dcache_clean_entry(addr)
+ *
+ * Clean the specified entry of any caches such that the MMU
+ * translation fetches will obtain correct data.
+ *
+ * addr: cache-unaligned virtual address
+ */
+	.align	5
+ENTRY(cpu_arm1020_dcache_clean_entry)
+	mov	r1, #0
+	mcr	p15, 0, r1, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mcr	p15, 0, r0, c7, c10, 1		@ clean single D entry
+	mcr	p15, 0, r1, c7, c10, 4		@ drain WB
+#endif
+#ifdef CONFIG_CPU_ARM1020_I_CACHE_ON
+	mcr	p15, 0, r1, c7, c5, 1		@ invalidate I entry
+#endif
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r1, r1
+	mov	r1, r1
+#endif
+	mov	pc, lr
+
+/* ================================ I-CACHE =============================== */
+
+/*
+ * cpu_arm1020_icache_invalidate_range(start, end)
+ *
+ * invalidate a range of virtual addresses from the Icache
+ *
+ * start: virtual start address
+ * end:   virtual end address
+ */
+	.align	5
+ENTRY(cpu_arm1020_icache_invalidate_range)
+1:	mcr	p15, 0, r0, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mcr	p15, 0, r0, c7, c10, 1		@ Clean D entry
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c10, 1		@ Clean D entry
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+#endif
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	add	r0, r0, #DCACHELINESIZE
+	cmp	r0, r1
+	blo	1b
+ENTRY(cpu_arm1020_icache_invalidate_page)
+	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/* ================================== TLB ================================= */
+
+/*
+ * cpu_arm1020_tlb_invalidate_all()
+ *
+ * Invalidate all TLB entries
+ */
+	.align	5
+ENTRY(cpu_arm1020_tlb_invalidate_all)
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	mcr	p15, 0, r0, c8, c7, 0		@ invalidate I & D tlbs
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_tlb_invalidate_range(start, end)
+ *
+ * invalidate TLB entries covering the specified range
+ *
+ * start: range start address
+ * end:   range end address
+ */
+	.align	5
+ENTRY(cpu_arm1020_tlb_invalidate_range)
+	mov	r3, #0
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+1:	mcr	p15, 0, r0, c8, c6, 1		@ invalidate D TLB entry
+	mcr	p15, 0, r0, c8, c5, 1		@ invalidate I TLB entry
+	add	r0, r0, #PAGESIZE
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+#endif
+	cmp	r0, r1
+	blt	1b
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_tlb_invalidate_page(page, flags)
+ *
+ * invalidate the TLB entries for the specified page.
+ *
+ * page:  page to invalidate
+ * flags: non-zero if we include the I TLB
+ */
+	.align	5
+ENTRY(cpu_arm1020_tlb_invalidate_page)
+	mov	r3, #0
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	teq	r1, #0
+	mcr	p15, 0, r0, c8, c6, 1		@ invalidate D TLB entry
+	mcrne	p15, 0, r0, c8, c5, 1		@ invalidate I TLB entry
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/* =============================== PageTable ============================== */
+
+/*
+ * cpu_arm1020_set_pgd(pgd)
+ *
+ * Set the translation base pointer to be as described by pgd.
+ *
+ * pgd: new page tables
+ */
+	.align	5
+ENTRY(cpu_arm1020_set_pgd)
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mcr	p15, 0, r3, c7, c10, 4
+	mov	r1, #0xF			@ 16 segments
+1:	mov	r3, #0x3F			@ 64 entries
+2:	mov	ip, r3, LSL #26 		@ shift up entry
+	orr	ip, ip, r1, LSL #5		@ shift in/up index
+	mcr	p15, 0, ip, c7, c14, 2		@ Clean & Inval DCache entry
+	mov	ip, #0
+	mcr	p15, 0, ip, c7, c10, 4
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	ip, ip
+#endif
+	subs	r3, r3, #1
+	cmp	r3, #0
+	bge	2b				@ entries 3F to 0
+	subs	r1, r1, #1
+	cmp	r1, #0
+	bge	1b				@ segments 15 to 0
+
+#endif
+	mov	r1, #0
+#ifdef CONFIG_CPU_ARM1020_I_CACHE_ON
+	mcr	p15, 0, r1, c7, c5, 0		@ invalidate I cache
+#endif
+	mcr	p15, 0, r1, c7, c10, 4		@ drain WB
+	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
+	mcr	p15, 0, r1, c8, c7, 0		@ invalidate I & D TLBs
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	ip, ip
+	mov	ip, ip
+#endif
+	mov	pc, lr
+        
+/*
+ * cpu_arm1020_set_pmd(pmdp, pmd)
+ *
+ * Set a level 1 translation table entry, and clean it out of
+ * any caches such that the MMUs can load it correctly.
+ *
+ * pmdp: pointer to PMD entry
+ * pmd:  PMD value to store
+ */
+	.align	5
+ENTRY(cpu_arm1020_set_pmd)
+#ifdef CONFIG_CPU_ARM1020_FORCE_WRITE_THROUGH
+	eor	r2, r1, #0x0a			@ C & Section
+	tst	r2, #0x0b
+	biceq	r1, r1, #4			@ clear bufferable bit
+#endif
+	str	r1, [r0]
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mcr	p15, 0, r0, c7, c10, 4
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry  (drain is done by TLB fns)
+#endif
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm1020_set_pte(ptep, pte)
+ *
+ * Set a PTE and flush it out
+ */
+	.align	5
+ENTRY(cpu_arm1020_set_pte)
+	str	r1, [r0], #-1024		@ linux version
+
+	eor	r1, r1, #LPTE_PRESENT | LPTE_YOUNG | LPTE_WRITE | LPTE_DIRTY
+
+	bic	r2, r1, #0xff0
+	bic	r2, r2, #3
+	orr	r2, r2, #HPTE_TYPE_SMALL
+
+	tst	r1, #LPTE_USER | LPTE_EXEC	@ User or Exec?
+	orrne	r2, r2, #HPTE_AP_READ
+
+	tst	r1, #LPTE_WRITE | LPTE_DIRTY	@ Write and Dirty?
+	orreq	r2, r2, #HPTE_AP_WRITE
+
+	tst	r1, #LPTE_PRESENT | LPTE_YOUNG	@ Present and Young?
+	movne	r2, #0
+
+#ifdef CONFIG_CPU_ARM1020_FORCE_WRITE_THROUGH
+	eor	r3, r1, #0x0a			@ C & small page?
+	tst	r3, #0x0b
+	biceq	r2, r2, #4
+#endif
+	str	r2, [r0]			@ hardware version
+	mov	r0, r0
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	mcr	p15, 0, r0, c7, c10, 4
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+#endif
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	mov	r0, r0
+	mov	r0, r0
+#endif
+	mov	pc, lr
+
+
+cpu_manu_name:
+	.asciz	"ARM/VLSI"
+ENTRY(cpu_arm1020_name)
+	.ascii	"Arm1020"
+#if defined(CONFIG_CPU_ARM1020_CPU_IDLE)
+	.ascii	"s"
+#endif
+#if defined(CONFIG_CPU_ARM1020_I_CACHE_ON)
+	.ascii	"i"
+#endif
+#if defined(CONFIG_CPU_ARM1020_D_CACHE_ON)
+	.ascii	"d"
+#if defined(CONFIG_CPU_ARM1020_FORCE_WRITE_THROUGH)
+	.ascii	"(wt)"
+#else
+	.ascii	"(wb)"
+#endif
+#endif
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	.ascii	"B"
+#endif
+#ifdef CONFIG_CPU_ARM1020_ROUND_ROBIN
+	.ascii	"RR"
+#endif
+	.ascii	"\0"
+	.align
+
+	.section ".text.init", #alloc, #execinstr
+
+__arm1020_setup:
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c7		@ invalidate I,D caches on v4
+	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer on v4
+	mcr	p15, 0, r0, c8, c7		@ invalidate I,D TLBs on v4
+	mcr	p15, 0, r4, c2, c0		@ load page table pointer
+	mov	r0, #0x1f			@ Domains 0, 1 = client
+	mcr	p15, 0, r0, c3, c0		@ load domain access register
+	mrc	p15, 0, r0, c1, c0		@ get control register v4
+/*
+ * Clear out 'unwanted' bits (then put them in if we need them)
+ */
+	bic	r0, r0, #0x0e00 		@ ....??r.........
+	bic	r0, r0, #0x0002 		@ ..............a.
+	bic	r0, r0, #0x000c 		@ W,D
+	bic	r0, r0, #0x1000 		@ I
+/*
+ * Turn on what we want
+ */
+	orr	r0, r0, #0x0031 		@ ..........DP...M
+	orr	r0, r0, #0x0100 		@ .......S........
+
+#ifdef CONFIG_CPU_ARM1020_ROUND_ROBIN
+	orr	r0, r0, #0x4000 		@ .R..............
+#endif
+#ifdef CONFIG_CPU_ARM1020_BRANCH_PREDICTION
+	orr	r0, r0, #0x0800 		@ ....Z...........
+#endif
+#ifdef CONFIG_CPU_ARM1020_D_CACHE_ON
+	orr	r0, r0, #0x0004 		@ Enable D cache
+#endif
+#ifdef CONFIG_CPU_ARM1020_I_CACHE_ON
+	orr	r0, r0, #0x1000 		@ I Cache on
+#endif
+	mov	pc, lr
+
+	.text
+
+/*
+ * Purpose : Function pointers used to access above functions - all calls
+ *	     come through these
+ */
+	.type	arm1020_processor_functions, #object
+arm1020_processor_functions:
+	.word	cpu_arm1020_data_abort
+	.word	cpu_arm1020_check_bugs
+	.word	cpu_arm1020_proc_init
+	.word	cpu_arm1020_proc_fin
+	.word	cpu_arm1020_reset
+	.word	cpu_arm1020_do_idle
+
+	/* cache */
+	.word	cpu_arm1020_cache_clean_invalidate_all
+	.word	cpu_arm1020_cache_clean_invalidate_range
+	.word	cpu_arm1020_flush_ram_page
+
+	/* dcache */
+	.word	cpu_arm1020_dcache_invalidate_range
+	.word	cpu_arm1020_dcache_clean_range
+	.word	cpu_arm1020_dcache_clean_page
+	.word	cpu_arm1020_dcache_clean_entry
+
+	/* icache */
+	.word	cpu_arm1020_icache_invalidate_range
+	.word	cpu_arm1020_icache_invalidate_page
+
+	/* tlb */
+	.word	cpu_arm1020_tlb_invalidate_all
+	.word	cpu_arm1020_tlb_invalidate_range
+	.word	cpu_arm1020_tlb_invalidate_page
+
+	/* pgtable */
+	.word	cpu_arm1020_set_pgd
+	.word	cpu_arm1020_set_pmd
+	.word	cpu_arm1020_set_pte
+	.size	arm1020_processor_functions, . - arm1020_processor_functions
+
+	.type	cpu_arm1020_info, #object
+cpu_arm1020_info:
+	.long	cpu_manu_name
+	.long	cpu_arm1020_name
+	.size	cpu_arm1020_info, . - cpu_arm1020_info
+
+	.type	cpu_arch_name, #object
+cpu_arch_name:
+	.asciz	"armv4"
+	.size	cpu_arch_name, . - cpu_arch_name
+
+	.type	cpu_elf_name, #object
+cpu_elf_name:
+	.asciz	"v4"
+	.size	cpu_elf_name, . - cpu_elf_name
+	.align
+
+	.section ".proc.info", #alloc, #execinstr
+
+	.type	__arm1020_proc_info,#object
+__arm1020_proc_info:
+	.long	0x4100a200
+	.long	0xff00fff0
+	.long	0x00000c02			@ mmuflags
+	b	__arm1020_setup
+	.long	cpu_arch_name
+	.long	cpu_elf_name
+	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT
+	.long	cpu_arm1020_info
+	.long	arm1020_processor_functions
+	.size	__arm1020_proc_info, . - __arm1020_proc_info
diff -u --recursive --new-file v2.4.14/linux/arch/arm/mm/proc-arm926.S linux/arch/arm/mm/proc-arm926.S
--- v2.4.14/linux/arch/arm/mm/proc-arm926.S	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mm/proc-arm926.S	Fri Nov  9 13:58:02 2001
@@ -0,0 +1,667 @@
+/*
+ *  linux/arch/arm/mm/arm926.S: MMU functions for ARM926EJ-S
+ *
+ *  Copyright (C) 1999-2001 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ * These are the low level assembler for performing cache and TLB
+ * functions on the arm926.
+ */
+#include <linux/linkage.h>
+#include <linux/config.h>
+#include <asm/assembler.h>
+#include <asm/constants.h>
+#include <asm/procinfo.h>
+#include <asm/hardware.h>
+
+/*
+ * This is the maximum size of an area which will be invalidated
+ * using the single invalidate entry instructions.  Anything larger
+ * than this, and we go for the whole cache.
+ *
+ * This value should be chosen such that we choose the cheapest
+ * alternative.
+ */
+#define MAX_AREA_SIZE	16384
+
+/*
+ * the cache line size of the I and D cache
+ */
+#define DCACHELINESIZE	32
+#define ICACHELINESIZE	32
+
+/*
+ * and the page size
+ */
+#define PAGESIZE	4096
+
+	.text
+
+/*
+ * cpu_arm926_data_abort()
+ *
+ * obtain information about current aborted instruction
+ *
+ * Inputs:
+ *  r0 = address of abort 
+ *  r1 = cpsr of abort 
+ *
+ * Returns:
+ *  r0 = address of abort
+ *  r1 != 0 if writing
+ *  r3 = FSR
+ */
+	.align	5
+ENTRY(cpu_arm926_data_abort)
+	tst	r1, #1<<24			@ Check for Jbit (NE -> found)
+	movne	r1, #-1 			@ Mark as writing
+	bne	2f
+
+	tst	r1, #1<<5			@ Check for Thumb-bit (NE -> found)
+	ldrneh	r1, [r0]			@ Read aborted Thumb instruction        
+	tstne	r1, r1, lsr #12 		@ C = bit 11
+
+	ldreq	r1, [r0]			@ Read aborted ARM instruction
+	tsteq	r1, r1, lsr #21 		@ C = bit 20
+
+	sbc	r1, r1, r1			@ r1 = C - 1
+2:
+	mrc	p15, 0, r3, c5, c0, 0		@ get FSR
+	and	r3, r3, #255
+	mrc	p15, 0, r0, c6, c0, 0		@ get FAR
+
+	mov	pc, lr
+
+/*
+ * cpu_arm926_check_bugs()
+ */
+ENTRY(cpu_arm926_check_bugs)
+	mrs	ip, cpsr
+	bic	ip, ip, #F_BIT
+	msr	cpsr, ip
+	mov	pc, lr
+
+/*
+ * cpu_arm926_proc_init()
+ */
+ENTRY(cpu_arm926_proc_init)
+	mov	pc, lr
+
+/*
+ * cpu_arm926_proc_fin()
+ */
+ENTRY(cpu_arm926_proc_fin)
+	stmfd	sp!, {lr}
+	mov	ip, #F_BIT | I_BIT | SVC_MODE
+	msr	cpsr_c, ip
+	bl	cpu_arm926_cache_clean_invalidate_all
+	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
+	bic	r0, r0, #0x1000 		@ ...i............
+	bic	r0, r0, #0x000e 		@ ............wca.
+	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
+	ldmfd	sp!, {pc}
+
+/*
+ * cpu_arm926_reset(loc)
+ *
+ * Perform a soft reset of the system.	Put the CPU into the
+ * same state as it would be if it had been reset, and branch
+ * to what would be the reset vector.
+ *
+ * loc: location to jump to for soft reset
+ */
+	.align	5
+ENTRY(cpu_arm926_reset)
+	mov	ip, #0
+	mcr	p15, 0, ip, c7, c7, 0		@ invalidate I,D caches
+	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
+	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
+	mrc	p15, 0, ip, c1, c0, 0		@ ctrl register
+	bic	ip, ip, #0x000f 		@ ............wcam
+	bic	ip, ip, #0x1100 		@ ...i...s........
+	mcr	p15, 0, ip, c1, c0, 0		@ ctrl register
+	mov	pc, r0
+
+/*
+ * cpu_arm926_do_idle()
+ */
+	.align	5
+ENTRY(cpu_arm926_do_idle)
+#if defined(CONFIG_CPU_ARM926_CPU_IDLE)
+	mcr	p15, 0, r0, c7, c0, 4		@ Wait for interrupt
+#endif
+	mov	pc, lr
+
+/* ================================= CACHE ================================ */
+
+
+/*
+ * cpu_arm926_cache_clean_invalidate_all()
+ *
+ * clean and invalidate all cache lines
+ *
+ * Note:
+ *  1. we should preserve r0 at all times
+ */
+	.align	5
+ENTRY(cpu_arm926_cache_clean_invalidate_all)
+	mov	r2, #1
+cpu_arm926_cache_clean_invalidate_all_r2:
+	mov	ip, #0
+#ifdef CONFIG_CPU_ARM926_WRITETHROUGH
+	mcr	p15, 0, ip, c7, c6, 0		@ invalidate D cache
+#else
+1:	mrc	p15, 0, r15, c7, c14, 3 	@ test,clean,invalidate
+	bne	1b
+#endif
+	teq	r2, #0
+	mcrne	p15, 0, ip, c7, c5, 0		@ invalidate I cache
+	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+/*
+ * cpu_arm926_cache_clean_invalidate_range(start, end, flags)
+ *
+ * clean and invalidate all cache lines associated with this area of memory
+ *
+ * This is a little misleading, it is not intended to clean out
+ * the i-cache but to make sure that any data written to the
+ * range is made consistant.  This means that when we execute code
+ * in that region, everything works as we expect.
+ *
+ * This generally means writing back data in the Dcache and
+ * write buffer and flushing the Icache over that region
+ * start: Area start address
+ * end:   Area end address
+ * flags: nonzero for I cache as well
+ */
+	.align	5
+ENTRY(cpu_arm926_cache_clean_invalidate_range)
+	bic	r0, r0, #DCACHELINESIZE - 1	@ && added by PGM
+	bic	r1, r1, #DCACHELINESIZE - 1	@ && added by DHM
+	sub	r3, r1, r0
+	cmp	r3, #MAX_AREA_SIZE
+	bgt	cpu_arm926_cache_clean_invalidate_all_r2
+
+1:	teq	r2, #0
+#ifdef CONFIG_CPU_ARM926_WRITETHROUGH
+	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
+	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
+	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
+	add	r0, r0, #DCACHELINESIZE
+#else
+	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
+	add	r0, r0, #DCACHELINESIZE
+#endif
+        
+	cmp	r0, r1
+	blt	1b
+
+	mcr	p15, 0, r1, c7, c10, 4		@ drain WB
+
+	mov	pc, lr
+
+/*
+ * cpu_arm926_flush_ram_page(page)
+ *
+ * clean and invalidate all cache lines associated with this area of memory
+ *
+ * page: page to clean and invalidate
+ */
+	.align	5
+ENTRY(cpu_arm926_flush_ram_page)
+	mov	r1, #PAGESIZE
+#ifdef CONFIG_CPU_ARM926_WRITETHROUGH
+1:	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
+	add	r0, r0, #DCACHELINESIZE
+#else
+1:	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
+	add	r0, r0, #DCACHELINESIZE
+#endif
+	subs	r1, r1, #2 * DCACHELINESIZE
+	bne	1b
+	mcr	p15, 0, r1, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+/* ================================ D-CACHE =============================== */
+
+/*
+ * cpu_arm926_dcache_invalidate_range(start, end)
+ *
+ * throw away all D-cached data in specified region without an obligation
+ * to write them back.	Note however that we must clean the D-cached entries
+ * around the boundaries if the start and/or end address are not cache
+ * aligned.
+ *
+ * start: virtual start address
+ * end:   virtual end address
+ */
+	.align	5
+ENTRY(cpu_arm926_dcache_invalidate_range)
+#ifndef CONFIG_CPU_ARM926_WRITETHROUGH
+	tst	r0, #DCACHELINESIZE - 1
+	mcrne	p15, 0, r0, c7, c10, 1		@ clean D entry
+	tst	r1, #DCACHELINESIZE - 1
+	mcrne	p15, 0, r1, c7, c10, 1
+#endif		@ clean D entry
+	bic	r0, r0, #DCACHELINESIZE - 1
+	bic	r1, r1, #DCACHELINESIZE - 1
+1:	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
+	add	r0, r0, #DCACHELINESIZE
+	cmp	r0, r1
+	blt	1b
+	mov	pc, lr
+
+/*
+ * cpu_arm926_dcache_clean_range(start, end)
+ *
+ * For the specified virtual address range, ensure that all caches contain
+ * clean data, such that peripheral accesses to the physical RAM fetch
+ * correct data.
+ *
+ * start: virtual start address
+ * end:   virtual end address
+ */
+	.align	5
+ENTRY(cpu_arm926_dcache_clean_range)
+#ifndef CONFIG_CPU_ARM926_WRITETHROUGH
+	bic	r0, r0, #DCACHELINESIZE - 1
+	sub	r1, r1, r0
+	cmp	r1, #MAX_AREA_SIZE
+	mov	r2, #0
+	bgt	cpu_arm926_cache_clean_invalidate_all_r2
+
+	bic	r1, r1, #DCACHELINESIZE -1
+	add	r1, r1, #DCACHELINESIZE
+
+1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+	add	r0, r0, #DCACHELINESIZE
+	subs	r1, r1, #DCACHELINESIZE
+	bpl	1b
+#endif
+	mcr	p15, 0, r2, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+/*
+ * cpu_arm926_dcache_clean_page(page)
+ *
+ * Cleans a single page of dcache so that if we have any future aliased
+ * mappings, they will be consistent at the time that they are created.
+ *
+ * page: virtual address of page to clean from dcache
+ *
+ * Note:
+ *  1. we don't need to flush the write buffer in this case.
+ *  2. we don't invalidate the entries since when we write the page
+ *     out to disk, the entries may get reloaded into the cache.
+ */
+	.align	5
+ENTRY(cpu_arm926_dcache_clean_page)
+#ifndef CONFIG_CPU_ARM926_WRITETHROUGH
+	mov	r1, #PAGESIZE
+1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+	add	r0, r0, #DCACHELINESIZE
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+	add	r0, r0, #DCACHELINESIZE
+	subs	r1, r1, #2 * DCACHELINESIZE
+	bne	1b
+#endif
+	mov	pc, lr
+
+/*
+ * cpu_arm926_dcache_clean_entry(addr)
+ *
+ * Clean the specified entry of any caches such that the MMU
+ * translation fetches will obtain correct data.
+ *
+ * addr: cache-unaligned virtual address
+ */
+	.align	5
+ENTRY(cpu_arm926_dcache_clean_entry)
+#ifndef CONFIG_CPU_ARM926_WRITETHROUGH
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+#endif
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+/* ================================ I-CACHE =============================== */
+
+/*
+ * cpu_arm926_icache_invalidate_range(start, end)
+ *
+ * invalidate a range of virtual addresses from the Icache
+ *
+ * start: virtual start address
+ * end:   virtual end address
+ */
+	.align	5
+ENTRY(cpu_arm926_icache_invalidate_range)
+	bic	r0, r0, #DCACHELINESIZE - 1	@ Safety check
+	sub	r1, r1, r0
+	cmp	r1, #MAX_AREA_SIZE
+	bgt	cpu_arm926_cache_clean_invalidate_all_r2
+
+	bic	r1, r1, #DCACHELINESIZE - 1
+	add	r1, r1, #DCACHELINESIZE
+
+1:	mcr	p15, 0, r0, c7, c5, 1		@ clean I entries
+	add	r0, r0, #DCACHELINESIZE
+	subs	r1, r1, #DCACHELINESIZE
+	bne	1b
+
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+ENTRY(cpu_arm926_icache_invalidate_page)
+	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
+	mov	pc, lr
+
+
+/* ================================== TLB ================================= */
+
+/*
+ * cpu_arm926_tlb_invalidate_all()
+ *
+ * Invalidate all TLB entries
+ */
+	.align	5
+ENTRY(cpu_arm926_tlb_invalidate_all)
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	mcr	p15, 0, r0, c8, c7, 0		@ invalidate I & D TLBs
+	mov	pc, lr
+
+/*
+ * cpu_arm926_tlb_invalidate_range(start, end)
+ *
+ * invalidate TLB entries covering the specified range
+ *
+ * start: range start address
+ * end:   range end address
+ */
+	.align	5
+ENTRY(cpu_arm926_tlb_invalidate_range)
+	mov	r3, #0
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+
+	mov	r3, #PAGESIZE
+	sub	r3, r3, #1
+	bic	r0, r0, r3
+	bic	r1, r1, r3
+
+1:	mcr	p15, 0, r0, c8, c6, 1		@ invalidate D TLB entry
+	mcr	p15, 0, r0, c8, c5, 1		@ invalidate I TLB entry
+	add	r0, r0, #PAGESIZE
+	cmp	r0, r1
+	blt	1b
+	mov	pc, lr
+
+/*
+ * cpu_arm926_tlb_invalidate_page(page, flags)
+ *
+ * invalidate the TLB entries for the specified page.
+ *
+ * page:  page to invalidate
+ * flags: non-zero if we include the I TLB
+ */
+	.align	5
+ENTRY(cpu_arm926_tlb_invalidate_page)
+	mov	r3, #0
+	mcr	p15, 0, r3, c7, c10, 4		@ drain WB
+	teq	r1, #0
+	mcr	p15, 0, r0, c8, c6, 1		@ invalidate D TLB entry
+	mcrne	p15, 0, r0, c8, c5, 1		@ invalidate I TLB entry
+	mov	pc, lr
+
+/* =============================== PageTable ============================== */
+
+/*
+ * cpu_arm926_set_pgd(pgd)
+ *
+ * Set the translation base pointer to be as described by pgd.
+ *
+ * pgd: new page tables
+ */
+	.align	5
+ENTRY(cpu_arm926_set_pgd)
+	mov	ip, #0
+#ifdef CONFIG_CPU_ARM926_WRITETHROUGH
+	/* Any reason why we don't use mcr p15, 0, r0, c7, c7, 0 here? --rmk */
+	mcr	p15, 0, ip, c7, c6, 0		@ invalidate D cache
+#else
+@ && 'Clean & Invalidate whole DCache'
+1:	mrc	p15, 0, r15, c7, c14, 3 	@ test,clean,invalidate
+	bne	1b
+#endif
+	mcr	p15, 0, ip, c7, c5, 0		@ invalidate I cache
+	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
+	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
+	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
+	mov	pc, lr
+
+/*
+ * cpu_arm926_set_pmd(pmdp, pmd)
+ *
+ * Set a level 1 translation table entry, and clean it out of
+ * any caches such that the MMUs can load it correctly.
+ *
+ * pmdp: pointer to PMD entry
+ * pmd:  PMD value to store
+ */
+	.align	5
+ENTRY(cpu_arm926_set_pmd)
+#ifdef CONFIG_CPU_ARM926_WRITETHROUGH
+	eor	r2, r1, #0x0a			@ C & Section
+	tst	r2, #0x0b
+	biceq	r1, r1, #4			@ clear bufferable bit
+#endif
+	str	r1, [r0]
+#ifndef CONFIG_CPU_ARM926_WRITETHROUGH
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+#endif
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+/*
+ * cpu_arm926_set_pte(ptep, pte)
+ *
+ * Set a PTE and flush it out
+ */
+	.align	5
+ENTRY(cpu_arm926_set_pte)
+	str	r1, [r0], #-1024		@ linux version
+
+	eor	r1, r1, #LPTE_PRESENT | LPTE_YOUNG | LPTE_WRITE | LPTE_DIRTY
+
+	bic	r2, r1, #0xff0
+	bic	r2, r2, #3
+	orr	r2, r2, #HPTE_TYPE_SMALL
+
+	tst	r1, #LPTE_USER | LPTE_EXEC	@ User or Exec?
+	orrne	r2, r2, #HPTE_AP_READ
+
+	tst	r1, #LPTE_WRITE | LPTE_DIRTY	@ Write and Dirty?
+	orreq	r2, r2, #HPTE_AP_WRITE
+
+	tst	r1, #LPTE_PRESENT | LPTE_YOUNG	@ Present and Young?
+	movne	r2, #0
+
+#ifdef CONFIG_CPU_ARM926_WRITETHROUGH
+	eor	r3, r2, #0x0a			@ C & small page?
+	tst	r3, #0x0b
+	biceq	r2, r2, #4
+#endif
+	str	r2, [r0]			@ hardware version
+	mov	r0, r0
+#ifndef CONFIG_CPU_ARM926_WRITETHROUGH
+	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
+#endif
+	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
+	mov	pc, lr
+
+
+cpu_manu_name:
+	.asciz	"ARM"
+ENTRY(cpu_arm926_name)
+	.ascii	"ARM926EJ-S"
+#if defined(CONFIG_CPU_ARM926_CPU_IDLE)
+	.ascii	"s"
+#endif
+#if defined(CONFIG_CPU_ARM926_I_CACHE_ON)
+	.ascii	"i"
+#endif
+#if defined(CONFIG_CPU_ARM926_D_CACHE_ON)
+	.ascii	"d"
+#if defined(CONFIG_CPU_ARM926_WRITETHROUGH)
+	.ascii	"(wt)"
+#else
+	.ascii	"(wb)"
+#endif
+#ifdef CONFIG_CPU_ARM926_ROUND_ROBIN
+	.ascii	"RR"
+#endif
+#endif
+	.ascii	"\0"
+	.align
+
+	.section ".text.init", #alloc, #execinstr
+
+__arm926_setup:
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c7		@ invalidate I,D caches on v4
+	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer on v4
+	mcr	p15, 0, r0, c8, c7		@ invalidate I,D TLBs on v4
+	mcr	p15, 0, r4, c2, c0		@ load page table pointer
+
+
+#if defined(CONFIG_CPU_ARM926_WRITETHROUGH) 
+	mov	r0, #4				@ disable write-back on caches explicitly
+	mcr	p15, 7, r0, c15, c0, 0
+#endif 
+
+	mov	r0, #0x1f			@ Domains 0, 1 = client
+	mcr	p15, 0, r0, c3, c0		@ load domain access register
+	mrc	p15, 0, r0, c1, c0		@ get control register v4
+/*
+ * Clear out 'unwanted' bits (then put them in if we need them)
+ */
+						@   VI ZFRS BLDP WCAM
+	bic	r0, r0, #0x0e00
+	bic	r0, r0, #0x0002
+	bic	r0, r0, #0x000c
+	bic	r0, r0, #0x1000 		@ ...0 000. .... 000.
+/*
+ * Turn on what we want
+ */
+	orr	r0, r0, #0x0031
+	orr	r0, r0, #0x2100 		@ ..1. ...1 ..11 ...1
+
+#ifdef CONFIG_CPU_ARM926_ROUND_ROBIN
+	orr	r0, r0, #0x4000 		@ .1.. .... .... ....
+#endif
+#ifdef CONFIG_CPU_ARM926_D_CACHE_ON
+	orr	r0, r0, #0x0004 		@ .... .... .... .1..
+#endif
+#ifdef CONFIG_CPU_ARM926_I_CACHE_ON
+	orr	r0, r0, #0x1000 		@ ...1 .... .... ....
+#endif
+	mov	pc, lr
+
+	.text
+
+/*
+ * Purpose : Function pointers used to access above functions - all calls
+ *	     come through these
+ */
+	.type	arm926_processor_functions, #object
+arm926_processor_functions:
+	.word	cpu_arm926_data_abort
+	.word	cpu_arm926_check_bugs
+	.word	cpu_arm926_proc_init
+	.word	cpu_arm926_proc_fin
+	.word	cpu_arm926_reset
+	.word	cpu_arm926_do_idle
+
+	/* cache */
+	.word	cpu_arm926_cache_clean_invalidate_all
+	.word	cpu_arm926_cache_clean_invalidate_range
+	.word	cpu_arm926_flush_ram_page
+
+	/* dcache */
+	.word	cpu_arm926_dcache_invalidate_range
+	.word	cpu_arm926_dcache_clean_range
+	.word	cpu_arm926_dcache_clean_page
+	.word	cpu_arm926_dcache_clean_entry
+
+	/* icache */
+	.word	cpu_arm926_icache_invalidate_range
+	.word	cpu_arm926_icache_invalidate_page
+
+	/* tlb */
+	.word	cpu_arm926_tlb_invalidate_all
+	.word	cpu_arm926_tlb_invalidate_range
+	.word	cpu_arm926_tlb_invalidate_page
+
+	/* pgtable */
+	.word	cpu_arm926_set_pgd
+	.word	cpu_arm926_set_pmd
+	.word	cpu_arm926_set_pte
+	.size	arm926_processor_functions, . - arm926_processor_functions
+
+	.type	cpu_arm926_info, #object
+cpu_arm926_info:
+	.long	cpu_manu_name
+	.long	cpu_arm926_name
+	.size	cpu_arm926_info, . - cpu_arm926_info
+
+	.type	cpu_arch_name, #object
+cpu_arch_name:
+	.asciz	"armv5EJ"
+	.size	cpu_arch_name, . - cpu_arch_name
+
+	.type	cpu_elf_name, #object
+cpu_elf_name:
+	.asciz	"v5EJ"
+	.size	cpu_elf_name, . - cpu_elf_name
+	.align
+
+	.section ".proc.info", #alloc, #execinstr
+
+	.type	__arm926_proc_info,#object
+__arm926_proc_info:
+	.long	0x41009260
+	.long	0xff00fff0
+	.long	0x00000c1e			@ mmuflags
+	b	__arm926_setup
+	.long	cpu_arch_name
+	.long	cpu_elf_name
+	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT
+	.long	cpu_arm926_info
+	.long	arm926_processor_functions
+	.size	__arm926_proc_info, . - __arm926_proc_info
diff -u --recursive --new-file v2.4.14/linux/arch/arm/tools/mach-types linux/arch/arm/tools/mach-types
--- v2.4.14/linux/arch/arm/tools/mach-types	Mon Nov  5 15:55:26 2001
+++ linux/arch/arm/tools/mach-types	Fri Nov  9 13:58:02 2001
@@ -6,7 +6,7 @@
 # To add an entry into this database, please see Documentation/arm/README,
 # or contact rmk@arm.linux.org.uk
 #
-# Last update: Mon Oct 22 09:49:06 2001
+# Last update: Fri Oct 26 17:37:13 2001
 #
 # machine_is_xxx	CONFIG_xxxx		MACH_TYPE_xxx		number
 #
@@ -134,3 +134,6 @@
 epsilon1		SA1100_EPSILON1		EPSILON1		123
 balloon			SA1100_BALLOON		BALLOON			124
 puppy			ARCH_PUPPY		PUPPY			125
+elroy			SA1100_ELROY		ELROY			126
+gms720			ARCH_GMS720		GMS720			127
+s24x			ARCH_S24X		S24X			128
diff -u --recursive --new-file v2.4.14/linux/arch/cris/defconfig linux/arch/cris/defconfig
--- v2.4.14/linux/arch/cris/defconfig	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/defconfig	Fri Nov  9 13:58:02 2001
@@ -82,8 +82,9 @@
 CONFIG_NET_ETHERNET=y
 # CONFIG_ETRAX_NETWORK_LED_ON_WHEN_LINK is not set
 CONFIG_ETRAX_NETWORK_LED_ON_WHEN_ACTIVITY=y
-C# CONFIG_ETRAX_ETHERNET_LPSLAVE is not set
-ONFIG_ETRAX_SERIAL=y
+# CONFIG_ETRAX_ETHERNET_LPSLAVE is not set
+CONFIG_ETRAX_SERIAL=y
+CONFIG_ETRAX_SERIAL_PORT0=y
 # CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB is not set
 CONFIG_ETRAX_SERIAL_PORT1=y
 # CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_ON_PB is not set
diff -u --recursive --new-file v2.4.14/linux/arch/cris/drivers/Config.in linux/arch/cris/drivers/Config.in
--- v2.4.14/linux/arch/cris/drivers/Config.in	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/drivers/Config.in	Fri Nov  9 13:58:02 2001
@@ -23,6 +23,14 @@
 
 bool 'Serial-port support' CONFIG_ETRAX_SERIAL
 if [ "$CONFIG_ETRAX_SERIAL" = "y" ]; then
+#  bool '  Use fast timers for DMA flush and RS-485 timing' CONFIG_ETRAX_SERIAL_FAST_TIMER n
+  define_bool CONFIG_ETRAX_SERIAL_FAST_TIMER n
+  if [ "$CONFIG_ETRAX_SERIAL_FAST_TIMER" = "n" ]; then
+    bool '  Fast serial port DMA flush' CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
+    if [ "$CONFIG_ETRAX100_SERIAL_FLUSH_DMA_FAST" = "n" ]; then
+      int '  Receive flush timeout (ticks) ' CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS 5
+    fi
+  fi
   bool '  Serial port 0 enabled' CONFIG_ETRAX_SERIAL_PORT0
   if [ "$CONFIG_ETRAX_SERIAL_PORT0" = "y" ]; then
     bool '  Ser0 DTR, RI, DSR, CD on PB' CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB
diff -u --recursive --new-file v2.4.14/linux/arch/cris/drivers/axisflashmap.c linux/arch/cris/drivers/axisflashmap.c
--- v2.4.14/linux/arch/cris/drivers/axisflashmap.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/drivers/axisflashmap.c	Fri Nov  9 13:58:02 2001
@@ -11,6 +11,9 @@
  * partition split defined below.
  *
  * $Log: axisflashmap.c,v $
+ * Revision 1.15  2001/10/19 12:41:04  jonashg
+ * Name of probe has changed in MTD.
+ *
  * Revision 1.14  2001/09/21 07:14:10  jonashg
  * Made root filesystem (cramfs) use mtdblock driver when booting from flash.
  *
@@ -237,7 +240,9 @@
 	printk(KERN_NOTICE "Axis flash mapping: %x at %x\n",
 	       WINDOW_SIZE, FLASH_CACHED_ADDR);
 
-	mymtd = (struct mtd_info *)do_map_probe("cfi", &axis_map);
+#ifdef CONFIG_MTD_CFI
+	mymtd = (struct mtd_info *)do_map_probe("cfi_probe", &axis_map);
+#endif
 
 #ifdef CONFIG_MTD_AMDSTD
 	if (!mymtd) {
diff -u --recursive --new-file v2.4.14/linux/arch/cris/drivers/gpio.c linux/arch/cris/drivers/gpio.c
--- v2.4.14/linux/arch/cris/drivers/gpio.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/cris/drivers/gpio.c	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-/* $Id: gpio.c,v 1.9 2001/05/04 14:16:07 matsfg Exp $
+/* $Id: gpio.c,v 1.11 2001/10/30 14:39:12 johana Exp $
  *
  * Etrax general port I/O device
  *
@@ -6,9 +6,18 @@
  *
  * Authors:    Bjorn Wesen      (initial version)
  *             Ola Knutsson     (LED handling)
- *             Johan Adolfsson  (read/set directions)
+ *             Johan Adolfsson  (read/set directions, write)
  *
  * $Log: gpio.c,v $
+ * Revision 1.11  2001/10/30 14:39:12  johana
+ * Added D() around gpio_write printk.
+ *
+ * Revision 1.10  2001/10/25 10:24:42  johana
+ * Added IO_CFG_WRITE_MODE ioctl and write method that can do fast
+ * bittoggling in the kernel. (This speeds up programming an FPGA with 450kB
+ * from ~60 seconds to 4 seconds).
+ * Added save_flags/cli/restore_flags in ioctl.
+ *
  * Revision 1.9  2001/05/04 14:16:07  matsfg
  * Corrected spelling error
  *
@@ -69,6 +78,8 @@
 
 static int gpio_ioctl(struct inode *inode, struct file *file,
 		      unsigned int cmd, unsigned long arg);
+static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
+                          loff_t *off);
 static int gpio_open(struct inode *inode, struct file *filp);
 static int gpio_release(struct inode *inode, struct file *filp);
 static unsigned int gpio_poll(struct file *filp, struct poll_table_struct *wait);
@@ -82,6 +93,9 @@
 	unsigned char changeable_dir;
 	unsigned char changeable_bits;
 	unsigned char highalarm, lowalarm;
+	unsigned char clk_mask;
+	unsigned char data_mask;
+	unsigned char write_msb;
 	wait_queue_head_t alarm_wq;
 	int minor;
 };
@@ -139,6 +153,59 @@
 	return 1;
 }
 
+static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
+                          loff_t *off)
+{
+	struct gpio_private *priv = (struct gpio_private *)file->private_data;
+	unsigned char data, clk_mask, data_mask, write_msb;
+	unsigned long flags;
+	ssize_t retval = count;
+	if (verify_area(VERIFY_READ, buf, count))
+	{
+		return -EFAULT;
+	}
+	clk_mask = priv->clk_mask;
+	data_mask = priv->data_mask;
+	/* It must have been configured using the IO_CFG_WRITE_MODE */
+	/* Perhaps a better error code? */
+	if (clk_mask == 0 || data_mask == 0) 
+	{
+		return -EPERM;
+	}
+	write_msb = priv->write_msb;
+	D(printk("gpio_write: %lu to data 0x%02X clk 0x%02X msb: %i\n",count, data_mask, clk_mask, write_msb));
+	while (count--) {
+		int i;
+		data = *buf++;
+		if (priv->write_msb) {
+			for (i = 7; i>=0;i--) {
+				save_flags(flags); cli();
+				*priv->port = *priv->shadow &= ~clk_mask;
+				if (data & 1<<i)
+					*priv->port = *priv->shadow |= data_mask;
+				else
+					*priv->port = *priv->shadow &= ~data_mask;
+			/* For FPGA: min 5.0ns (DCC) before CCLK high */
+				*priv->port = *priv->shadow |= clk_mask;
+				restore_flags(flags);
+			}
+		} else {
+			for (i = 0; i<=7;i++) {
+				save_flags(flags); cli();
+				*priv->port = *priv->shadow &= ~clk_mask;
+				if (data & 1<<i)
+					*priv->port = *priv->shadow |= data_mask;
+				else
+					*priv->port = *priv->shadow &= ~data_mask;
+			/* For FPGA: min 5.0ns (DCC) before CCLK high */
+				*priv->port = *priv->shadow |= clk_mask;
+				restore_flags(flags);
+			}
+		}
+	}
+	return retval;
+}
+
 static int
 gpio_open(struct inode *inode, struct file *filp)
 {
@@ -170,6 +237,8 @@
 
 	priv->highalarm = 0;
 	priv->lowalarm = 0;
+	priv->clk_mask = 0;
+	priv->data_mask = 0;
 	init_waitqueue_head(&priv->alarm_wq);
 
 	filp->private_data = (void *)priv;
@@ -209,8 +278,8 @@
 gpio_ioctl(struct inode *inode, struct file *file,
 	   unsigned int cmd, unsigned long arg)
 {
+	unsigned long flags;
 	struct gpio_private *priv = (struct gpio_private *)file->private_data;
-
 	if(_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) {
 		return -EINVAL;
 	}
@@ -220,14 +289,18 @@
 			// read the port
 			return *priv->port;
 		case IO_SETBITS:
+			save_flags(flags); cli();
 			// set changeable bits with a 1 in arg
 			*priv->port = *priv->shadow |= 
 			  ((unsigned char)arg & priv->changeable_bits);
+			restore_flags(flags);
 			break;
 		case IO_CLRBITS:
+			save_flags(flags); cli();
 			// clear changeable bits with a 1 in arg
 			*priv->port = *priv->shadow &= 
 			  ~((unsigned char)arg & priv->changeable_bits);
+			restore_flags(flags);
 			break;
 		case IO_HIGHALARM:
 			// set alarm when bits with 1 in arg go high
@@ -246,14 +319,18 @@
 			/* Read direction 0=input 1=output */
 			return *priv->dir_shadow;
 		case IO_SETINPUT:
+			save_flags(flags); cli();
 			/* Set direction 0=unchanged 1=input */
 			*priv->dir = *priv->dir_shadow &= 
 			~((unsigned char)arg & priv->changeable_dir);
+			restore_flags(flags);
 			return *priv->dir_shadow;
 		case IO_SETOUTPUT:
+			save_flags(flags); cli();
 			/* Set direction 0=unchanged 1=output */
 			*priv->dir = *priv->dir_shadow |= 
 			  ((unsigned char)arg & priv->changeable_dir);
+			restore_flags(flags);
 			return *priv->dir_shadow;
                 case IO_SHUTDOWN:
                        SOFT_SHUTDOWN();
@@ -265,6 +342,24 @@
 #else
                        return 0;
 #endif
+			break;
+		case IO_CFG_WRITE_MODE:
+			priv->clk_mask = arg & 0xFF;
+			priv->data_mask = (arg >> 8) & 0xFF;
+			priv->write_msb = (arg >> 16) & 0x01;
+			/* Check if we're allowed to change the bits and
+			 * the direction is correct
+			 */
+			if (!((priv->clk_mask & priv->changeable_bits) &&
+			      (priv->data_mask & priv->changeable_bits) &&
+			      (priv->clk_mask & *priv->dir_shadow) &&
+			      (priv->data_mask & *priv->dir_shadow)) )
+			{
+				priv->clk_mask = 0;
+				priv->data_mask = 0;
+				return -EPERM;
+			}
+			break;
 		default:
 			if(priv->minor == LEDS)
 				return gpio_leds_ioctl(cmd, arg);
@@ -301,6 +396,7 @@
 	owner:       THIS_MODULE,
 	poll:        gpio_poll,
 	ioctl:       gpio_ioctl,
+	write:       gpio_write,
 	open:        gpio_open,
 	release:     gpio_release,
 };
@@ -338,7 +434,7 @@
 
 #endif
 	
-	printk("ETRAX 100LX GPIO driver v2.1, (c) 2001 Axis Communications AB\n");
+	printk("ETRAX 100LX GPIO driver v2.2, (c) 2001 Axis Communications AB\n");
 
 	return res;
 }
diff -u --recursive --new-file v2.4.14/linux/arch/cris/drivers/serial.c linux/arch/cris/drivers/serial.c
--- v2.4.14/linux/arch/cris/drivers/serial.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/drivers/serial.c	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-/* $Id: serial.c,v 1.18 2001/09/24 09:27:22 pkj Exp $
+/* $Id: serial.c,v 1.23 2001/10/30 17:53:26 pkj Exp $
  *
  * Serial port driver for the ETRAX 100LX chip
  *
@@ -7,6 +7,27 @@
  *      Many, many authors. Based once upon a time on serial.c for 16x50.
  *
  * $Log: serial.c,v $
+ * Revision 1.23  2001/10/30 17:53:26  pkj
+ * * Set info->uses_dma to 0 when a port is closed.
+ * * Mark the timer1 interrupt as a fast one (SA_INTERRUPT).
+ * * Call start_flush_timer() in start_receive() if
+ *   CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST is defined.
+ *
+ * Revision 1.22  2001/10/30 17:44:03  pkj
+ * Use %lu for received and transmitted counters in line_info().
+ *
+ * Revision 1.21  2001/10/30 17:40:34  pkj
+ * Clean-up. The only change to functionality is that
+ * CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS(=5) is used instead of
+ * MAX_FLUSH_TIME(=8).
+ *
+ * Revision 1.20  2001/10/30 15:24:49  johana
+ * Added char_time stuff from 2.0 driver.
+ *
+ * Revision 1.19  2001/10/30 15:23:03  johana
+ * Merged with 1.13.2 branch + fixed indentation
+ * and changed CONFIG_ETRAX100_XYS to CONFIG_ETRAX_XYZ
+ *
  * Revision 1.18  2001/09/24 09:27:22  pkj
  * Completed ext_baud_table[] in cflag_to_baud() and cflag_to_etrax_baud().
  *
@@ -26,11 +47,19 @@
  * Revision 1.14  2001/08/15 07:31:23  bjarne
  * Introduced two new members to the e100_serial struct.
  * configured - Will be set to 1 if the port has been configured in .config
- * uses_dma   - Should be set to 1 if the port uses DMA. Currently it is set to 1
+ * uses_dma   - Should be set to 1 if the port uses DMA. Currently it is set 
+ *              to 1
  *              when a port is opened. This is used to limit the DMA interrupt
  *              routines to only manipulate DMA channels actually used by the
  *              serial driver.
  *
+ * Revision 1.13.2.2  2001/10/17 13:57:13  starvik
+ * Receiver was broken by the break fixes
+ *
+ * Revision 1.13.2.1  2001/07/20 13:57:39  ronny
+ * Merge with new stuff from etrax100ser.c. Works but haven't checked stuff
+ * like break handling.
+ *
  * Revision 1.13  2001/05/09 12:40:31  johana
  * Use DMA_NBR and IRQ_NBR defines from dma.h and irq.h
  *
@@ -226,7 +255,7 @@
  *
  */
 
-static char *serial_version = "$Revision: 1.18 $";
+static char *serial_version = "$Revision: 1.23 $";
 
 #include <linux/config.h>
 #include <linux/version.h>
@@ -284,6 +313,11 @@
 #define SERIAL_TYPE_CALLOUT	2
 #endif
 
+#define DEBUG_LOG(line, string, value)
+
+/* Add an x here to log a lot of timer stuff */
+#define TIMERD(x)
+
 /* number of characters left in xmit buffer before we ask for more */
 #define WAKEUP_CHARS 256
 
@@ -299,8 +333,9 @@
    expect the first received event on the serial port to
    be an error, break or similar. Used to be able to flash IRMA
    from eLinux */
-//#define SERIAL_HANDLE_EARLY_ERRORS
+#define SERIAL_HANDLE_EARLY_ERRORS
 
+#define TTY_THROTTLE_LIMIT (TTY_FLIPBUF_SIZE/10)
 
 #ifndef CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS
 /* Default number of timer ticks before flushing rx fifo 
@@ -310,8 +345,6 @@
 #define CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS 5 
 #endif
 
-#define MAX_FLUSH_TIME 8
-
 #define _INLINE_ inline
 
 static void change_speed(struct e100_serial *info);
@@ -320,7 +353,7 @@
                     const unsigned char *buf, int count);
 
 #define DEF_BAUD 0x99   /* 115.2 kbit/s */
-#define STD_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST )
+#define STD_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
 #define DEF_RX 0x20  /* or SERIAL_CTRL_W >> 8 */
 /* Default value of tx_ctrl register: has txd(bit 7)=1 (idle) as default */
 #define DEF_TX 0x80  /* or SERIAL_CTRL_B */
@@ -335,6 +368,22 @@
 #define REG_BAUD 3
 #define REG_XOFF 4  /* this is a 32 bit register */
 
+/* The bitfields are the same for all serial ports */
+#define SER_RXD_MASK         IO_MASK(R_SERIAL0_STATUS, rxd)
+#define SER_DATA_AVAIL_MASK  IO_MASK(R_SERIAL0_STATUS, data_avail)
+#define SER_FRAMING_ERR_MASK IO_MASK(R_SERIAL0_STATUS, framing_err)
+#define SER_PAR_ERR_MASK     IO_MASK(R_SERIAL0_STATUS, par_err)
+#define SER_OVERRUN_MASK     IO_MASK(R_SERIAL0_STATUS, overrun)
+
+#define SER_ERROR_MASK (SER_OVERRUN_MASK | SER_PAR_ERR_MASK | SER_FRAMING_ERR_MASK)
+
+/* Values for info->errorcode */
+#define ERRCODE_SET_BREAK    (TTY_BREAK)
+#define ERRCODE_INSERT        0x100
+#define ERRCODE_INSERT_BREAK (ERRCODE_INSERT | TTY_BREAK)
+
+#define FORCE_EOP(info)  *R_SET_EOP = 1U << info->iseteop;
+
 /*
  * General note regarding the use of IO_* macros in this file: 
  *
@@ -413,6 +462,29 @@
 static struct termios *serial_termios[NR_PORTS];
 static struct termios *serial_termios_locked[NR_PORTS];
 
+#ifdef CONFIG_SERIAL_PROC_ENTRY
+#define PROCSTAT(x) x
+struct ser_statistics_type{
+	int overrun_cnt;
+	int early_errors_cnt;
+	int ser_ints_ok_cnt;
+	int errors_cnt;
+	unsigned long int processing_flip;
+	unsigned long processing_flip_still_room;
+	unsigned long int timeout_flush_cnt;
+	int rx_dma_ints;
+	int tx_dma_ints;
+	int rx_tot;
+	int tx_tot;
+};
+
+static struct ser_statistics_type ser_stat[NR_PORTS];
+
+#else 
+
+#define PROCSTAT(x)
+
+#endif /* CONFIG_SERIAL_PROC_ENTRY */
 
 /* RS-485 */
 #if defined(CONFIG_ETRAX_RS485)
@@ -577,10 +649,34 @@
 	/* enable timer1 irq */
 
 	*R_IRQ_MASK0_SET = IO_STATE(R_IRQ_MASK0_SET, timer1, set);
+
 	fast_timer_started = 1;
 }
 #endif /* CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST */
 
+/* Calculate the chartime depending on baudrate, numbor of bits etc. */
+static void update_char_time(struct e100_serial * info)
+{
+	tcflag_t cflags = info->tty->termios->c_cflag;
+	int bits;
+
+	/* calc. number of bits / data byte */
+	/* databits + startbit and 1 stopbit */
+	if ((cflags & CSIZE) == CS7)
+		bits = 9;
+	else
+		bits = 10;  
+
+	if (cflags & CSTOPB)     /* 2 stopbits ? */
+		bits++;
+
+	if (cflags & PARENB)     /* parity bit ? */
+		bits++;
+
+	/* calc timeout */
+	info->char_time_usec = ((bits * 1000000) / info->baud) + 1;
+}
+
 /*
  * This function maps from the Bxxxx defines in asm/termbits.h into real
  * baud rates.
@@ -642,7 +738,8 @@
 e100_dtr(struct e100_serial *info, int set)
 {
 #ifndef CONFIG_SVINTO_SIM
-	unsigned char mask  = ( 1 << e100_modem_pins[info->line].dtr_bit);
+	unsigned char mask = (1 << e100_modem_pins[info->line].dtr_bit);
+
 #ifdef SERIAL_DEBUG_IO  
 	printk("ser%i dtr %i mask: 0x%02X\n", info->line, set, mask);
 	printk("ser%i shadow before 0x%02X get: %i\n", 
@@ -651,7 +748,8 @@
 #endif
 	/* DTR is active low */
 	{
-		unsigned long flags;	
+		unsigned long flags;
+
 		save_flags(flags);
 		cli();
 		*e100_modem_pins[info->line].shadow &= ~mask;
@@ -696,8 +794,9 @@
 #ifndef CONFIG_SVINTO_SIM
 	/* RI is active low */
 	{
-		unsigned char mask  = ( 1 << e100_modem_pins[info->line].ri_bit);
-		unsigned long flags;	
+		unsigned char mask = (1 << e100_modem_pins[info->line].ri_bit);
+		unsigned long flags;
+
 		save_flags(flags);
 		cli();
 		*e100_modem_pins[info->line].shadow &= ~mask;
@@ -718,8 +817,9 @@
 #ifndef CONFIG_SVINTO_SIM
 	/* CD is active low */
 	{
-		unsigned char mask  = ( 1 << e100_modem_pins[info->line].cd_bit);
-		unsigned long flags;	
+		unsigned char mask = (1 << e100_modem_pins[info->line].cd_bit);
+		unsigned long flags;
+
 		save_flags(flags);
 		cli();
 		*e100_modem_pins[info->line].shadow &= ~mask;
@@ -797,7 +897,7 @@
 
 #ifdef SERIAL_HANDLE_EARLY_ERRORS
 /* in order to detect and fix errors on the first byte
- we have to use the serial interrupts as well. */
+   we have to use the serial interrupts as well. */
 
 static inline void
 e100_disable_serial_data_irq(struct e100_serial *info) 
@@ -860,7 +960,7 @@
 	e100_disable_rxdma_irq(info);
 #endif
 
-	if (info->rs485.delay_rts_before_send > 0){
+	if (info->rs485.delay_rts_before_send > 0) {
 		current->timeout = jiffies + (info->rs485.delay_rts_before_send * HZ)/1000;
 		current->state = TASK_INTERRUPTIBLE;
 		schedule();
@@ -880,36 +980,38 @@
 	
 	/* calc. number of bits / data byte */
 	cflags = info->tty->termios->c_cflag;
+
 	/* databits + startbit and 1 stopbit */
-	if((cflags & CSIZE) == CS7) 
-	  bits = 9;
+	if ((cflags & CSIZE) == CS7)
+		bits = 9;
 	else
-	  bits = 10;  
+		bits = 10;  
 
-	if(cflags & CSTOPB)     /* 2 stopbits ? */
-	  bits++;
+	if (cflags & CSTOPB)     /* 2 stopbits ? */
+		bits++;
 
-	if(cflags & PARENB)     /* parity bit ? */
-	  bits++;
+	if (cflags & PARENB)     /* parity bit ? */
+		bits++;
 	
 	/* calc timeout */
 	delay_ms = ((bits * size * 1000) / info->baud) + 1;
 	max_j = jiffies + (delay_ms * HZ)/1000 + 10;
 
-	while (jiffies < max_j ) {
-	  if (info->port[REG_STATUS] &
-	      IO_STATE(R_SERIAL0_STATUS, tr_ready, ready)) {
-	    for( i=0 ; i<100; i++ ) {};
-	    if (info->port[REG_STATUS] &
-		IO_STATE(R_SERIAL0_STATUS, tr_ready, ready)) {
-	      /* ~25 for loops per usec */
-	      stop_delay = 1000000 / info->baud;
-	      if(cflags & CSTOPB) 
-		stop_delay *= 2;
-	      udelay(stop_delay);
-	      break;
-	    }
-	  }
+	while (jiffies < max_j) {
+		if (info->port[REG_STATUS] &
+		    IO_STATE(R_SERIAL0_STATUS, tr_ready, ready)) {
+			for (i = 0; i < 100; i++)
+				;
+			if (info->port[REG_STATUS] &
+			    IO_STATE(R_SERIAL0_STATUS, tr_ready, ready)) {
+				/* ~25 for loops per usec */
+				stop_delay = 1000000 / info->baud;
+				if (cflags & CSTOPB) 
+					stop_delay *= 2;
+				udelay(stop_delay);
+				break;
+			}
+		}
 	}
 
 	e100_rts(info, info->rs485.rts_after_sent);
@@ -1004,9 +1106,9 @@
 	 * no-op - transmit_chars would never really be called during sim
 	 * since rs_write does not write into the xmit buffer then.
 	 */
-	if(info->xmit.tail)
+	if (info->xmit.tail)
 		printk("Error in serial.c:transmit_chars(), tail!=0\n");
-	if(info->xmit.head != info->xmit.tail) {
+	if (info->xmit.head != info->xmit.tail) {
 		SIMCOUT(info->xmit.buf + info->xmit.tail,
 			CIRC_CNT(info->xmit.head,
 				 info->xmit.tail,
@@ -1022,10 +1124,10 @@
 		IO_STATE(R_DMA_CH6_CLR_INTR, clr_eop, do);
 
 #ifdef SERIAL_DEBUG_INTR
-	if(info->line == SERIAL_DEBUG_LINE)
+	if (info->line == SERIAL_DEBUG_LINE)
 		printk("tc\n");
 #endif
-	if(!info->tr_running) {
+	if (!info->tr_running) {
 		/* weirdo... we shouldn't get here! */
 		printk("Achtung: transmit_chars with !tr_running\n");
 		return;
@@ -1037,7 +1139,7 @@
 	   and update xmit accordingly */
 
 	/* if the stop bit was not set, all data has been sent */
-	if(!(descr->status & d_stop)) {
+	if (!(descr->status & d_stop)) {
 		sentl = descr->sw_len;
 	} else 
 		/* otherwise we find the amount of data sent here */
@@ -1060,7 +1162,7 @@
 
 	c = CIRC_CNT_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
 
-	if(c <= 0) {
+	if (c <= 0) {
 		/* our job here is done, don't schedule any new DMA transfer */
 		info->tr_running = 0;
 
@@ -1106,7 +1208,7 @@
 start_transmit(struct e100_serial *info)
 {
 #if 0
-	if(info->line == SERIAL_DEBUG_LINE)
+	if (info->line == SERIAL_DEBUG_LINE)
 		printk("x\n");
 #endif
 
@@ -1118,7 +1220,6 @@
 	transmit_chars(info);
 }
 
-
 static _INLINE_ void 
 receive_chars(struct e100_serial *info)
 {
@@ -1138,79 +1239,128 @@
 
 	/* acknowledge both a dma_descr and dma_eop irq in R_DMAx_CLRINTR */
 
+	// ?
 	*info->iclrintradr =
 		IO_STATE(R_DMA_CH6_CLR_INTR, clr_descr, do) |
 		IO_STATE(R_DMA_CH6_CLR_INTR, clr_eop, do);
 
-	if(!tty) /* something wrong... */
+	if (!tty) /* something wrong... */
 		return;
 
 	descr = &info->rec_descr;
-  
+
 	/* find out how many bytes were read */
 
 	/* if the eop bit was not set, all data has been received */
-	if(!(descr->status & d_eop)) {
+	if (!(descr->status & d_eop)) {
 		recvl = descr->sw_len;
 	} else {
 		/* otherwise we find the amount of data received here */
 		recvl = descr->hw_len;
 	}
-	if(recvl) {
-		unsigned char *buf;
-		struct async_icount *icount;
 
-		icount = &info->icount;
-
-		/* update stats */
-		icount->rx += recvl;
+	/* read the status register so we can detect errors,
+	 * but we can't really do anything about those errors
+	 * anyway, since we have the DMA in "force eop at error" mode
+	 * the fault characters are not in the buffer anyway.
+	 */
 
-		/* read the status register so we can detect errors */
-		rstat = info->port[REG_STATUS];
+	rstat = info->port[REG_STATUS];
+
+	if ((rstat & SER_ERROR_MASK) != 0) {
+		unsigned char data;
+		/* if we got an error, we must reset it by reading the
+		 * data_in field
+		 */
+		data = info->port[REG_DATA];
+		PROCSTAT(ser_stat[info->line].errors_cnt++);
+		DEBUG_LOG(info->line, " #dERR: s d 0x%04X\n",
+			  ((rstat & SER_ERROR_MASK) << 8) | data);
+		/* Only handle the saved error code, that indicates that we got
+		 * the last character of a break that looks like it's ok, but
+		 * is not
+		 */
 
-		if(rstat & (IO_MASK(R_SERIAL0_STATUS, overrun) |
-			    IO_MASK(R_SERIAL0_STATUS, par_err) |
-			    IO_MASK(R_SERIAL0_STATUS, framing_err))) {
-			/* if we got an error, we must reset it by reading the
-			 * data_in field
+		if (info->errorcode == 0) {
+			*tty->flip.flag_buf_ptr = TTY_NORMAL;
+		} else {
+			unsigned char data;
+			data = info->port[REG_DATA];
+			if (info->errorcode & ERRCODE_INSERT) {
+				unsigned char *currbuf;
+				/* Get the current buffer */
+				if (tty->flip.buf_num) {
+					currbuf = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
+				} else {
+					currbuf = tty->flip.char_buf;
+				}
+				/* We should insert a character in the buffer! */
+				if (recvl == 0) {
+					recvl = 1;
+					DEBUG_LOG(info->line, "insert to %lu\n", recvl);
+				} else {
+					/* Move stuff around.. */
+					DEBUG_LOG(info->line, "#insert to %lu!\n", recvl);
+					if (recvl < TTY_FLIPBUF_SIZE) {
+						int i;
+						/* Move the data 1 step right */
+						i = recvl;
+						while (i) {
+							currbuf[i] = currbuf[i-1];
+							i--;
+						}
+						recvl++;
+					} else {
+						/* We can't move it all! Skip break! */
+						/* TODO: Handle full buffer? */
+						DEBUG_LOG(info->line, "#BRK skipped! %lu!\n", recvl);
+						info->errorcode = 0;
+					}
+				}
+			}
+	    
+			PROCSTAT(ser_stat[info->line].errors_cnt++);
+			DEBUG_LOG(info->line, " #bERR: s d 0x%04X\n",
+				  ((rstat & SER_ERROR_MASK) << 8) | data);
+			*tty->flip.flag_buf_ptr = (info->errorcode & 0xFF);
+			info->errorcode = 0;
+#if 0
+			printk("SERERR: 0x%02X data: 0x%02X\n", rstat & SER_ERROR_MASK, data);
+#endif
+			/* we only ever write errors into the first byte in
+			 * the flip flag buffer, so we dont have to clear it
+			 * all every time
 			 */
-			(void)info->port[REG_DATA];
 		}
-		
-		/* we only ever write errors into the first byte in the flip 
-		 * flag buffer, so we dont have to clear it all every time
-		 */
+	}
 
-		if(rstat & 0x04) {
-			icount->parity++;
-			*tty->flip.flag_buf_ptr = TTY_PARITY;
-		} else if(rstat & 0x08) {
-			icount->overrun++;
-			*tty->flip.flag_buf_ptr = TTY_OVERRUN;
-		} else if(rstat & 0x02) {
-			icount->frame++;
-			*tty->flip.flag_buf_ptr = TTY_FRAME;
-		} else
-			*tty->flip.flag_buf_ptr = 0;
+	DEBUG_LOG(info->line, "recvl %lu\n", recvl);
+
+	if (recvl) {
+		unsigned char *buf;
+		struct async_icount *icount = &info->icount;
+
+		/* update stats */
+		icount->rx += recvl;
 
 		/* use the flip buffer next in turn to restart DMA into */
-		
+
 		if (tty->flip.buf_num) {
 			buf = tty->flip.char_buf;
 		} else {
 			buf = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
 		}
 
-		if(buf == phys_to_virt(descr->buf)) {
+		if (buf == phys_to_virt(descr->buf)) {
 			printk("ttyS%d flip-buffer overrun!\n", info->line);
 			icount->overrun++;
 			*tty->flip.flag_buf_ptr = TTY_OVERRUN;
 			/* restart old buffer */
 		} else {
 			descr->buf = virt_to_phys(buf);
-			
+
 			/* schedule or push a flip of the buffer */
-			
+
 			info->tty->flip.count = recvl;
 
 #if (LINUX_VERSION_CODE > 131394) /* 2.1.66 */
@@ -1221,9 +1371,9 @@
 #endif	
 		}
 	}
-	
+
 	/* restart the receiving dma */
-	
+
 	descr->sw_len = TTY_FLIPBUF_SIZE;
 	descr->ctrl = d_int | d_eol | d_eop;
 	descr->hw_len = 0;
@@ -1236,6 +1386,10 @@
 	e100_enable_serial_data_irq(info);
 #endif	
 	/* input dma should be running now */
+
+	/* unthrottle if we have throttled */
+	if (E100_RTS_GET(info))
+		tty->driver.unthrottle(info->tty);
 }
 
 static void 
@@ -1253,8 +1407,8 @@
 	/* reset the input dma channel to be sure it works */
 	
 	*info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
-	while(IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
-	      IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
+	while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
+	       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
 
 	descr = &info->rec_descr;
 	
@@ -1270,7 +1424,10 @@
 
 	*info->ifirstadr = virt_to_phys(descr);
 	*info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start);
-	
+
+#ifdef CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
+	start_flush_timer();
+#endif
 }
 
 
@@ -1313,12 +1470,12 @@
 	
 	ireg = *R_IRQ_MASK2_RD;  /* get the active irq bits for the dma channels */
 	
-	for(i = 0; i < NR_PORTS; i++) {
+	for (i = 0; i < NR_PORTS; i++) {
 		info = rs_table + i;
 		if (!info->uses_dma) 
 			continue; 
 		/* check for dma_descr (dont need to check for dma_eop in output dma for serial */
-		if(ireg & info->irq) {  
+		if (ireg & info->irq) {  
 			/* we can send a new dma bunch. make it so. */
 			transmit_chars(info);
 		}
@@ -1352,12 +1509,12 @@
 	
 	ireg = *R_IRQ_MASK2_RD;  /* get the active irq bits for the dma channels */
 	
-	for(i = 0; i < NR_PORTS; i++) {
+	for (i = 0; i < NR_PORTS; i++) {
 		info = rs_table + i;
 		if (!info->uses_dma) 
 			continue; 
 		/* check for both dma_eop and dma_descr for the input dma channel */
-		if(ireg & ((info->irq << 2) | (info->irq << 3))) {
+		if (ireg & ((info->irq << 2) | (info->irq << 3))) {
 			/* we have received something */
 			receive_chars(info);
 		}
@@ -1367,17 +1524,156 @@
 	}
 }
 
+#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
+static int serial_fast_timer_started = 0;
+static int serial_fast_timer_expired = 0;
+static void flush_timeout_function(unsigned long data);
+#define START_FLUSH_FAST_TIMER(info, string) {\
+  unsigned long timer_flags; \
+  save_flags(timer_flags); \
+  cli(); \
+  TIMERD(DEBUG_LOG(info->line, "start_timer? %i ", info->line)); \
+  if (fast_timers[info->line].function == NULL) { \
+    serial_fast_timer_started++; \
+    TIMERD(DEBUG_LOG(info->line, "start_timer %i ", info->line)); \
+    TIMERD(DEBUG_LOG(info->line, "num started: %i\n", serial_fast_timer_started)); \
+    start_one_shot_timer(&fast_timers[info->line], \
+                         flush_timeout_function, \
+                         (unsigned long)info, \
+                         info->char_time_usec*4, \
+                         string); \
+  } \
+  else { \
+    /* DEBUG_LOG(info->line, " ## timer %i running ##\n", info->line); */ \
+  } \
+  restore_flags(timer_flags); \
+}
+
+#else
+#define START_FLUSH_FAST_TIMER(info, string)
+#endif
+
+void _INLINE_ check_flush_timeout(struct e100_serial *info)
+{
+	unsigned char rstat;
+	unsigned int magic;
+
+	if (0 /*info->tty->processing_flip*/) {
+		if (!E100_RTS_GET(info)) {
+			int left = (*info->ihwswadr >> 16) - (*info->istatusadr & 0x3F);
+
+			if (left < TTY_THROTTLE_LIMIT)
+				info->tty->driver.throttle(info->tty);
+		}
+
+		PROCSTAT(ser_stat[info->line].processing_flip++);
+		START_FLUSH_FAST_TIMER(info, "flip");
+		return;
+	}
+
+	/* We check data_avail bit to determine if data has 
+	 * arrived since last time
+	 */ 
+	magic = info->fifo_magic;
+#ifdef SERIAL_DEBUG_DATA
+	if (info->fifo_magic || info->fifo_didmagic) {
+		DEBUG_LOG(info->line, "timeout_int: did fifo_magic %03X\n",
+		    (info->fifo_didmagic << 8) | info->fifo_magic);
+	}
+#endif
+	rstat = info->port[REG_STATUS];
+	/* error or datavail? */
+	if (rstat & SER_ERROR_MASK) { 
+		/* Some error has occured */
+		/* If there has been valid data, 
+		 * an EOP interrupt will be made automatically.
+		 * If no data, the normal ser_interrupt should be enabled 
+		 * and handle it.
+		 * So do nothing!
+		 */
+		DEBUG_LOG(info->line, "timeout err: rstat 0x%03X\n",
+		          rstat | (info->line << 8));
+		return;
+	}
+	if (rstat & SER_DATA_AVAIL_MASK) { 
+		/* Ok data, no error, count it */
+		TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n",
+		          rstat | (info->line << 8)));
+		/* Read data to clear status flags */
+		(void)info->port[REG_DATA];
+
+		magic++;
+	}
+
+	if (magic != info->fifo_magic) {
+		info->fifo_magic = magic;
+		info->fifo_didmagic = 0;
+		START_FLUSH_FAST_TIMER(info, "magic");
+	} else {
+		/* hit the timeout, force an EOP for the input
+		 * dma channel if we haven't already
+		 */
+		if (!info->fifo_didmagic && magic) {
+			info->fifo_didmagic = 1;
+			info->fifo_magic = 0;
+			PROCSTAT(ser_stat[info->line].timeout_flush_cnt++);
+			DEBUG_LOG(info->line, "timeout EOP %i\n", info->line);
+			TIMERD(DEBUG_LOG(info->line, "timeout magic %i\n", magic));
+			FORCE_EOP(info);
+		}
+	}
+} /* check_flush_timeout */
+
+#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
+static void flush_timeout_function(unsigned long data)
+{
+	struct e100_serial *info = (struct e100_serial *)data;
+	fast_timers[info->line].function = NULL;
+	serial_fast_timer_expired++;
+	TIMERD(DEBUG_LOG(info->line, "flush_timout %i ", info->line));
+	TIMERD(DEBUG_LOG(info->line, "num expired: %i\n", serial_fast_timer_expired));
+	check_flush_timeout(info);
+}
+
+#elif defined(CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST)
+
+static void 
+timeout_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct e100_serial *info;
+	int i;
+	
+#ifdef CONFIG_SVINTO_SIM
+	/* No receive in the simulator.  Will probably be when the rest of
+	 * the serial interface works, and this piece will just be removed.
+	 */
+	{
+		const char *s = "What? timeout_interrupt in simulator??\n";
+		SIMCOUT(s,strlen(s));
+	}
+	return;
+#endif
+
+	/* acknowledge the timer1 irq */
+	*R_TIMER_CTRL = r_timer_ctrl_shadow | IO_STATE(R_TIMER_CTRL, i1, clr);
+	PROCSTAT(fast_timer_ints++);
+	
+	for (i = 0; i < NR_PORTS; i++) {
+		info = rs_table + i;
+		if (info->uses_dma) 
+			check_flush_timeout(info);
+	}
+} /* timeout_interrupt */
+
+#else
+
 /* dma fifo/buffer timeout handler
    forces an end-of-packet for the dma input channel if no chars 
-   have been received for CONFIG_ETRAX_RX_TIMEOUT_TICKS/100 s.
+   have been received for CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS/100 s.
    If CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST is configured then this
    handler is instead run at 15360 Hz.
 */
 
-#ifndef CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
-static int timeout_divider = 0;
-#endif
-
 static struct timer_list flush_timer;
 
 static void 
@@ -1391,9 +1687,9 @@
 	return;
 #endif
 	
-	for(i = 0; i < NR_PORTS; i++) {
+	for (i = 0; i < NR_PORTS; i++) {
 		info = rs_table + i;
-		if(!info->enabled || !(info->flags & ASYNC_INITIALIZED))
+		if (!info->enabled || !(info->flags & ASYNC_INITIALIZED))
 			continue;
 
 		/* istatusadr (bit 6-0) hold number of bytes in fifo 
@@ -1402,33 +1698,32 @@
 		 */
 
 		magic = (*info->istatusadr & 0x3f);
-		magic += ((*info->ihwswadr&0xffff ) - (*info->ihwswadr >> 16));
+		magic += ((*info->ihwswadr & 0xffff) - (*info->ihwswadr >> 16));
 
 		/* if magic is equal to fifo_magic (magic in previous
 		 * timeout_interrupt) then no new data has arrived since last
 		 * interrupt and we'll force eop to flush fifo+dma buffers
 		 */
 
-		if(magic != info->fifo_magic) {
+		if (magic != info->fifo_magic) {
 			info->fifo_magic = magic;
 			info->fifo_didmagic = 0;
 		} else {
 			/* hit the timeout, force an EOP for the input
 			 * dma channel if we haven't already
 			 */
-			if(!info->fifo_didmagic && magic) {
+			if (!info->fifo_didmagic && magic) {
 				info->fifo_didmagic = 1;
 				info->fifo_magic = 0;
-				*R_SET_EOP = 1U << info->iseteop;
+				FORCE_EOP(info);
 			}
 		}
 	}
 
 	/* restart flush timer */
-
-	mod_timer(&flush_timer, jiffies + MAX_FLUSH_TIME);
+	mod_timer(&flush_timer, jiffies + CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS);
 }
-
+#endif
 
 #ifdef SERIAL_HANDLE_EARLY_ERRORS
 
@@ -1439,48 +1734,190 @@
  * interrupts off.
  */
 
+/*
+BREAK handling on ETRAX 100:
+ETRAX will generate interrupt although there is no stop bit between the
+characters.
+
+Depending on how long the break sequence is, the end of the breaksequence
+will look differently:
+| indicates start/end of a character.
+
+B= Break character (0x00) with framing error.
+E= Error byte with parity error received after B characters.
+F= "Faked" valid byte received immediatly after B characters.
+V= Valid byte
+
+1.
+    B          BL         ___________________________ V
+.._|__________|__________|                           |valid data |
+
+Multiple frame errors with data == 0x00 (B),
+the timing matches up "perfectly" so no extra ending char is detected.
+The RXD pin is 1 in the last interrupt, in that case
+we set info->errorcode = ERRCODE_INSERT_BREAK, but we can't really
+know if another byte will come and this really is case 2. below 
+(e.g F=0xFF or 0xFE)
+If RXD pin is 0 we can expect another character (see 2. below).
+
+
+2.
+
+    B          B          E or F__________________..__ V
+.._|__________|__________|______    |                 |valid data
+                          "valid" or 
+                          parity error
+
+Multiple frame errors with data == 0x00 (B),
+but the part of the break trigs is interpreted as a start bit (and possibly
+som 0 bits followed by a number of 1 bits and a stop bit).
+Depending on parity settings etc. this last character can be either
+a fake "valid" char (F) or have a parity error (E).
+
+If the character is valid it will be put in the buffer,
+we set info->errorcode = ERRCODE_SET_BREAK so the receive interrupt
+will set the flags so the tty will handle it,
+if it's an error byte it will not be put in the buffer
+and we set info->errorcode = ERRCODE_INSERT_BREAK.
+
+To distinguish a V byte in 1. from an F byte in 2. we keep a timestamp
+of the last faulty char (B) and compares it with the current time:
+If the time elapsed time is less then 2*char_time_usec we will assume
+it's a faked F char and not a Valid char and set 
+info->errorcode = ERRCODE_SET_BREAK. 
+
+Flaws in the above solution:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We use the timer to distinguish a F character from a V character,
+if a V character is to close after the break we might make the wrong decision.
+
+TODO: The break will be delayed until an F or V character is received.
+
+*/
+
+static void _INLINE_ handle_ser_interrupt(struct e100_serial *info)
+{
+	unsigned char rstat = info->port[REG_STATUS];
+
+#ifdef SERIAL_DEBUG_INTR
+	printk("Interrupt from serport %d\n", i);
+#endif
+/*	DEBUG_LOG(info->line, "ser_interrupt stat %03X\n", rstat | (i << 8)); */
+	if (rstat & SER_ERROR_MASK) {
+		unsigned char data;
+		info->last_rx_active_usec = GET_JIFFIES_USEC();
+		info->last_rx_active = jiffies;
+		/* if we got an error, we must reset it by
+		 * reading the data_in field
+		 */
+		data = info->port[REG_DATA];
+
+		if ((data == 0x00) && (rstat & SER_FRAMING_ERR_MASK)) {
+			/* Most likely a break, but we get 
+			 * interrupts over and over again.
+			 */
+
+			if (info->break_detected_cnt == 0) {
+				DEBUG_LOG(info->line, "#BRK start\n", 0);
+			}
+			if (rstat & SER_RXD_MASK) {
+				/* The RX pin is high now, so the break
+				 * must be over, but....
+				 * we can't really know if we will get another
+				 * last byte ending the break or not. 
+				 * And we don't know if the byte (if any) will 
+				 * have an error or look valid.
+				 */
+				DEBUG_LOG(info->line, "# BL BRK\n", 0);
+				info->errorcode = ERRCODE_INSERT_BREAK;
+			}
+			info->break_detected_cnt++;
+		} else {
+			/* Error doesn't look like a break,
+			 * but could be end of a break 
+			 */
+			if (info->break_detected_cnt) {
+				DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt);
+				info->errorcode = ERRCODE_INSERT_BREAK;
+			}
+			info->break_detected_cnt = 0;
+			DEBUG_LOG(info->line, "#iERR s d %04X\n",
+				  ((rstat & SER_ERROR_MASK) << 8) | data);
+		}
+		PROCSTAT(ser_stat[info->line].early_errors_cnt++);
+
+#if 0
+		/* Reset DMA before starting */
+		*info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
+		while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
+		       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
+#endif
+	} else { /* it was a valid byte, now let the dma do the rest */
+		unsigned char data;
+		unsigned long curr_time_u = GET_JIFFIES_USEC();
+		unsigned long curr_time = jiffies;
+		
+		if (info->break_detected_cnt) {
+			/* Detect if this character is a new
+			 * valid char or the last char in a
+			 * break sequence:
+			 * If LSBits are 0 and MSBits are high
+			 * AND the time is close to the
+			 * previous interrupt we should discard
+			 * it.
+			 */
+			long elapsed_usec = 
+			  (curr_time - info->last_rx_active) * (1000000/HZ) + 
+			  curr_time_u - info->last_rx_active_usec;
+			if (elapsed_usec<2*info->char_time_usec) {
+				DEBUG_LOG(info->line, "FBRK %i\n", info->line);
+				/* Report as BREAK (error) and 
+				 * let receive_chars handle it
+				 */
+				info->errorcode = ERRCODE_SET_BREAK;
+			} else {
+				DEBUG_LOG(info->line, "Not end of BRK (V)%i\n", info->line);
+			}
+			DEBUG_LOG(info->line, "num brk %i\n", info->break_detected_cnt);
+		}
+		/* Reset data_avail by
+		 * reading the data_in field
+		 */
+		data = info->port[REG_DATA];
+		info->break_detected_cnt = 0;
+		info->fifo_magic++; /* Count received chars */
+#ifdef SERIAL_DEBUG_INTR
+		printk("** OK, disabling ser_interupts\n");
+#endif
+		PROCSTAT(ser_stat[info->line].ser_ints_ok_cnt++);
+		DEBUG_LOG(info->line, " ser_int OK %03X\n",
+		          (info->line << 8) | data);
+		e100_disable_serial_data_irq(info);
+	}
+
+	/* restart the DMA never hurts */
+	*info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart);
+	START_FLUSH_FAST_TIMER(info, "ser_int");
+} /* handle_ser_interrupt */
+
 static void 
 ser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct e100_serial *info;
 	int i;
-	unsigned char rstat;
 
-	for(i = 0; i < NR_PORTS; i++) {
+	for (i = 0; i < NR_PORTS; i++) {
 		info = rs_table + i;
+
 		if (!info->uses_dma) 
 			continue; 
-		rstat = info->port[REG_STATUS];
-		
-		if(*R_IRQ_MASK1_RD & (1U << (8+2*info->line))) { /* This line caused the irq */
-#ifdef SERIAL_DEBUG_INTR
-			printk("Interrupt from serport %d\n", i);
-#endif
-			if(rstat & 0x0e) {
-				/* FIXME: This is weird, but if this delay is
-				 * not present then irmaflash does not work...
-				 */
-				udelay(2300);
 
-				/* if we got an error, we must reset it by
-				 * reading the data_in field
-				 */
-				(void)info->port[REG_DATA];
-				
-				PROCSTAT(early_errors_cnt[info->line]++);
-
-				/* restart the DMA */
-				*info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart);
-			} 
-			else { /* it was a valid byte, now let the dma do the rest */
-#ifdef SERIAL_DEBUG_INTR
-				printk("** OK, disabling ser_interrupts\n");
-#endif
-				e100_disable_serial_data_irq(info);
-			}
+		/* Which line caused the irq? */
+		if (*R_IRQ_MASK1_RD & (1U << (8+2*info->line))) { 
+			handle_ser_interrupt(info);
 		}
 	}
-}
+} /* ser_interrupt */
 #endif
 
 /*
@@ -1573,7 +2010,7 @@
 	printk("starting up ttyS%d (xmit_buf 0x%x)...\n", info->line, info->xmit.buf);
 #endif
 
-	if(info->tty) {
+	if (info->tty) {
 
 		/* clear the tty flip flag buffer since we will not
 		 * be using it (we only use the first byte..)
@@ -1612,11 +2049,11 @@
 	*info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
 
 	/* wait until reset cycle is complete */
-	while(IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
-	      IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
+	while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
+	       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
 
-	while(IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) ==
-	      IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
+	while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) ==
+	       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
 	
 	*info->iclrintradr =
 		IO_STATE(R_DMA_CH6_CLR_INTR, clr_descr, do) |
@@ -1697,6 +2134,7 @@
 
 	*info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
 	*info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
+	info->uses_dma = 0;
 
 #endif /* CONFIG_SVINTO_SIM */
 
@@ -1740,7 +2178,7 @@
 
 	/* first some safety checks */
 	
-	if(!info->tty || !info->tty->termios)
+	if (!info->tty || !info->tty->termios)
 		return;
 	if (!info->port)
 		return;
@@ -1807,9 +2245,10 @@
 	info->port[REG_TR_CTRL] = info->tx_ctrl;
 	info->port[REG_REC_CTRL] = info->rx_ctrl;
 	*((unsigned long *)&info->port[REG_XOFF]) = 0;
+#endif /* !CONFIG_SVINTO_SIM */
 
-#endif /* CONFIG_SVINTO_SIM */
-}
+	update_char_time(info);
+} /* change_speed */
 
 /* start transmitting chars NOW */
 
@@ -1852,7 +2291,7 @@
 		return 0;
 	
 #ifdef SERIAL_DEBUG_DATA
-	if(info->line == SERIAL_DEBUG_LINE)
+	if (info->line == SERIAL_DEBUG_LINE)
 		printk("rs_write (%d), status %d\n", 
 		       count, info->port[REG_STATUS]);
 #endif
@@ -1871,7 +2310,7 @@
 	 * atomic operation... this could perhaps be avoided by more clever
 	 * design.
 	 */
-	if(from_user) {
+	if (from_user) {
 		down(&tmp_buf_sem);
 		while (1) {
 			int c1;
@@ -1906,7 +2345,7 @@
 		up(&tmp_buf_sem);
 	} else {
 		cli();	
-		while(1) {
+		while (1) {
 			c = CIRC_SPACE_TO_END(info->xmit.head,
 					      info->xmit.tail,
 					      SERIAL_XMIT_SIZE);
@@ -1931,10 +2370,10 @@
 	 * the IRQ's are not running anyway for this port.
 	 */
 	
-	if(info->xmit.head != info->xmit.tail
-	   && !tty->stopped &&
-	   !tty->hw_stopped &&
-	   !info->tr_running) {
+	if (info->xmit.head != info->xmit.tail
+	    && !tty->stopped &&
+	    !tty->hw_stopped &&
+	    !info->tr_running) {
 		start_transmit(info);
 	}
  	
@@ -2107,11 +2546,11 @@
 
 	old_info = *info;
 	
-	if(!capable(CAP_SYS_ADMIN)) {
-		if((new_serial.type != info->type) ||
-		   (new_serial.close_delay != info->close_delay) ||
-		   ((new_serial.flags & ~ASYNC_USR_MASK) !=
-		    (info->flags & ~ASYNC_USR_MASK)))
+	if (!capable(CAP_SYS_ADMIN)) {
+		if ((new_serial.type != info->type) ||
+		    (new_serial.close_delay != info->close_delay) ||
+		    ((new_serial.flags & ~ASYNC_USR_MASK) !=
+		     (info->flags & ~ASYNC_USR_MASK)))
 			return -EPERM;
 		info->flags = ((info->flags & ~ASYNC_USR_MASK) |
 			       (new_serial.flags & ASYNC_USR_MASK));
@@ -2136,7 +2575,7 @@
 #endif
 
  check_and_exit:
-	if(info->flags & ASYNC_INITIALIZED) {
+	if (info->flags & ASYNC_INITIALIZED) {
 		change_speed(info);
 	} else
 		retval = startup(info);
@@ -2156,16 +2595,18 @@
 static int 
 get_lsr_info(struct e100_serial * info, unsigned int *value)
 {
-	unsigned int result;
+	unsigned int result = TIOCSER_TEMT;
+#ifndef CONFIG_SVINTO_SIM
+	unsigned long curr_time = jiffies;
+	unsigned long curr_time_usec = GET_JIFFIES_USEC();
+	unsigned long elapsed_usec = 
+		(curr_time - info->last_tx_active) * 1000000/HZ + 
+		curr_time_usec - info->last_tx_active_usec;
 
-#ifdef CONFIG_SVINTO_SIM
-	/* Always open. */
-	result = TIOCSER_TEMT;
-#else
-	if (*info->ostatusadr & 0x007F)  /* something in fifo */
+	if (info->xmit.head != info->xmit.tail || 
+	    elapsed_usec < 2*info->char_time_usec) {
 		result = 0;
-	else
-		result = TIOCSER_TEMT;
+	}
 #endif
 
 	if (copy_to_user(value, &result, sizeof(int)))
@@ -2178,10 +2619,9 @@
 {
   int state;
   const char *str;
-  
 };
 
-const struct state_str control_state_str[]={
+const struct state_str control_state_str[] = {
 	{TIOCM_DTR, "DTR" },
 	{TIOCM_RTS, "RTS"},
 	{TIOCM_ST, "ST?" },
@@ -2612,20 +3052,31 @@
 {
 	unsigned long orig_jiffies;
 	struct e100_serial *info = (struct e100_serial *)tty->driver_data;
+	unsigned long curr_time = jiffies;
+	unsigned long curr_time_usec = GET_JIFFIES_USEC();
+	long elapsed_usec = 
+		(curr_time - info->last_tx_active) * (1000000/HZ) + 
+		curr_time_usec - info->last_tx_active_usec;
 
 	/*
 	 * Check R_DMA_CHx_STATUS bit 0-6=number of available bytes in FIFO
 	 * R_DMA_CHx_HWSW bit 31-16=nbr of bytes left in DMA buffer (0=64k)
 	 */
 	orig_jiffies = jiffies;
-	while(info->xmit.head != info->xmit.tail || /* More in send queue */
-	      (*info->ostatusadr & 0x007f)) { /* more in FIFO */
+	while (info->xmit.head != info->xmit.tail || /* More in send queue */
+	       (*info->ostatusadr & 0x007f) ||  /* more in FIFO */
+	       (elapsed_usec < 2*info->char_time_usec)) {
 		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(1);
 		if (signal_pending(current))
 			break;
 		if (timeout && time_after(jiffies, orig_jiffies + timeout))
 			break;
+		curr_time = jiffies;
+		curr_time_usec = GET_JIFFIES_USEC();
+		elapsed_usec = 
+			(curr_time - info->last_tx_active) * (1000000/HZ) + 
+			curr_time_usec - info->last_tx_active_usec;
 	}
 	set_current_state(TASK_RUNNING);
 }
@@ -2809,10 +3260,11 @@
 		return -ENODEV;
 
 	/* find the corresponding e100_serial struct in the table */
-
 	info = rs_table + line;
-	/* dont allow the opening of ports that are not enabled in the HW config */
-	if (!info->enabled) return -ENODEV; 
+
+	/* don't allow the opening of ports that are not enabled in the HW config */
+	if (!info->enabled)
+		return -ENODEV; 
   
 #ifdef SERIAL_DEBUG_OPEN
 	printk("[%d] rs_open %s%d, count = %d\n", current->pid,
@@ -2923,20 +3375,20 @@
 
 	ret += sprintf(buf+ret, " baud:%d", info->baud);
 
-	ret += sprintf(buf+ret, " tx:%d rx:%d",
-		      info->icount.tx, info->icount.rx);
+	ret += sprintf(buf+ret, " tx:%lu rx:%lu",
+		       info->icount.tx, info->icount.rx);
 
 	if (info->icount.frame)
-		ret += sprintf(buf+ret, " fe:%d", info->icount.frame);
+		ret += sprintf(buf+ret, " fe:%lu", info->icount.frame);
 	
 	if (info->icount.parity)
-		ret += sprintf(buf+ret, " pe:%d", info->icount.parity);
+		ret += sprintf(buf+ret, " pe:%lu", info->icount.parity);
 	
 	if (info->icount.brk)
-		ret += sprintf(buf+ret, " brk:%d", info->icount.brk);	
+		ret += sprintf(buf+ret, " brk:%lu", info->icount.brk);	
 
 	if (info->icount.overrun)
-		ret += sprintf(buf+ret, " oe:%d", info->icount.overrun);
+		ret += sprintf(buf+ret, " oe:%lu", info->icount.overrun);
 
 	/*
 	 * Last thing is the RS-232 status lines
@@ -2996,9 +3448,11 @@
 
 	/* Setup the timed flush handler system */
 
+#if !defined(CONFIG_ETRAX_SERIAL_FAST_TIMER) && !defined(CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST)
 	init_timer(&flush_timer);
 	flush_timer.function = timed_flush_handler;
-	mod_timer(&flush_timer, jiffies + MAX_FLUSH_TIME);
+	mod_timer(&flush_timer, jiffies + CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS);
+#endif
 
 	/* Initialize the tty_driver structure */
   
@@ -3089,6 +3543,7 @@
 		init_waitqueue_head(&info->close_wait);
 		info->xmit.buf = 0;
 		info->xmit.tail = info->xmit.head = 0;
+
 		if (info->enabled) {
 			printk(KERN_INFO "%s%d at 0x%x is a builtin UART with DMA\n",
 			       serial_driver.name, info->line, (unsigned int)info->port);
@@ -3099,38 +3554,38 @@
 	/* Not needed in simulator.  May only complicate stuff. */
 	/* hook the irq's for DMA channel 6 and 7, serial output and input, and some more... */
 #ifdef CONFIG_ETRAX_SERIAL_PORT0
-	if(request_irq(SER0_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "serial 0 dma tr", NULL))
+	if (request_irq(SER0_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "serial 0 dma tr", NULL))
 		panic("irq22");
-	if(request_irq(SER0_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "serial 0 dma rec", NULL))
+	if (request_irq(SER0_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "serial 0 dma rec", NULL))
 		panic("irq23");
 #endif
 #ifdef SERIAL_HANDLE_EARLY_ERRORS
-	if(request_irq(SERIAL_IRQ_NBR, ser_interrupt, SA_INTERRUPT, "serial ", NULL))
+	if (request_irq(SERIAL_IRQ_NBR, ser_interrupt, SA_INTERRUPT, "serial ", NULL))
 		panic("irq8");
 #endif
 #ifdef CONFIG_ETRAX_SERIAL_PORT1
-	if(request_irq(SER1_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "serial 1 dma tr", NULL))
+	if (request_irq(SER1_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "serial 1 dma tr", NULL))
 		panic("irq24");
-	if(request_irq(SER1_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "serial 1 dma rec", NULL))
+	if (request_irq(SER1_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "serial 1 dma rec", NULL))
 		panic("irq25");
 #endif
 #ifdef CONFIG_ETRAX_SERIAL_PORT2
 	/* DMA Shared with par0 (and SCSI0 and ATA) */
-	if(request_irq(SER2_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ, "serial 2 dma tr", NULL))
+	if (request_irq(SER2_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ, "serial 2 dma tr", NULL))
 		panic("irq18");
-	if(request_irq(SER2_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ, "serial 2 dma rec", NULL))
+	if (request_irq(SER2_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ, "serial 2 dma rec", NULL))
 		panic("irq19");
 #endif
 #ifdef CONFIG_ETRAX_SERIAL_PORT3
 	/* DMA Shared with par1 (and SCSI1 and Extern DMA 0) */
-	if(request_irq(SER3_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ, "serial 3 dma tr", NULL))
+	if (request_irq(SER3_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ, "serial 3 dma tr", NULL))
 		panic("irq20");
-	if(request_irq(SER3_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ, "serial 3 dma rec", NULL))
+	if (request_irq(SER3_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ, "serial 3 dma rec", NULL))
 		panic("irq21");
 #endif
+
 #ifdef CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
-	/* TODO: a timeout_interrupt needs to be written that calls timeout_handler */
-	if(request_irq(TIMER1_IRQ_NBR, timeout_interrupt, SA_SHIRQ,
+	if (request_irq(TIMER1_IRQ_NBR, timeout_interrupt, SA_SHIRQ | SA_INTERRUPT,
 		       "fast serial dma timeout", NULL)) {
 		printk("err: timer1 irq\n");
 	}
diff -u --recursive --new-file v2.4.14/linux/arch/cris/drivers/serial.h linux/arch/cris/drivers/serial.h
--- v2.4.14/linux/arch/cris/drivers/serial.h	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/drivers/serial.h	Fri Nov  9 13:58:02 2001
@@ -87,6 +87,15 @@
         struct wait_queue       *close_wait;
 #endif  
 
+	unsigned long char_time_usec;       /* The time for 1 char, in usecs */
+	unsigned long last_tx_active_usec;  /* Last tx usec in the jiffies */
+	unsigned long last_tx_active;       /* Last tx time in jiffies */
+	unsigned long last_rx_active_usec;  /* Last rx usec in the jiffies */
+	unsigned long last_rx_active;       /* Last rx time in jiffies */
+
+	int break_detected_cnt;
+	int errorcode;
+
 #ifdef CONFIG_RS485
 	struct rs485_control    rs485;  /* RS-485 support */
 #endif
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/Makefile linux/arch/cris/kernel/Makefile
--- v2.4.14/linux/arch/cris/kernel/Makefile	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/Makefile	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.8 2001/10/01 14:44:07 bjornw Exp $
+# $Id: Makefile,v 1.9 2001/10/22 13:10:21 pkj Exp $
 #
 # Makefile for the linux kernel.
 #
@@ -16,6 +16,9 @@
 all: kernel.o head.o
 
 O_TARGET := kernel.o
+
+export-objs := ksyms.o
+
 obj-y   := process.o signal.o entry.o traps.o irq.o \
            ptrace.o setup.o time.o sys_cris.o shadows.o \
 	   debugport.o semaphore.o
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/entry.S linux/arch/cris/kernel/entry.S
--- v2.4.14/linux/arch/cris/kernel/entry.S	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/entry.S	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-/* $Id: entry.S,v 1.34 2001/10/01 14:45:03 bjornw Exp $
+/* $Id: entry.S,v 1.35 2001/10/30 17:10:15 bjornw Exp $
  *
  *  linux/arch/cris/entry.S
  *
@@ -7,6 +7,9 @@
  *  Authors:	Bjorn Wesen (bjornw@axis.com)
  *
  *  $Log: entry.S,v $
+ *  Revision 1.35  2001/10/30 17:10:15  bjornw
+ *  Add some syscalls
+ *
  *  Revision 1.34  2001/10/01 14:45:03  bjornw
  *  Removed underscores and added register prefixes
  *
@@ -981,6 +984,9 @@
 	.long SYMBOL_NAME(sys_getdents64)       /* 220 */
 	.long SYMBOL_NAME(sys_fcntl64)
 	.long SYMBOL_NAME(sys_ni_syscall)	/* reserved for TUX */
+        .long SYMBOL_NAME(sys_ni_syscall)       /* Reserved for Security */
+        .long SYMBOL_NAME(sys_gettid)
+        .long SYMBOL_NAME(sys_readahead)        /* 225 */
 
         /*
          * NOTE!! This doesn't have to be exact - we just have
@@ -989,7 +995,7 @@
          * been shrunk every time we add a new system call.
          */
 
-	.rept NR_syscalls-222
+	.rept NR_syscalls-(.-sys_call_table)/4
 		.long SYMBOL_NAME(sys_ni_syscall)
 	.endr
 	
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/head.S linux/arch/cris/kernel/head.S
--- v2.4.14/linux/arch/cris/kernel/head.S	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/head.S	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-/* $Id: head.S,v 1.40 2001/10/03 14:59:57 pkj Exp $
+/* $Id: head.S,v 1.41 2001/10/29 14:55:58 pkj Exp $
  * 
  * Head of the kernel - alter with care
  *
@@ -7,6 +7,9 @@
  * Authors:	Bjorn Wesen (bjornw@axis.com)
  * 
  * $Log: head.S,v $
+ * Revision 1.41  2001/10/29 14:55:58  pkj
+ * Corrected pa$r0 to par0.
+ *
  * Revision 1.40  2001/10/03 14:59:57  pkj
  * Added support for resetting the Bluetooth hardware.
  *
@@ -520,7 +523,7 @@
 	moveq	0,$r0
 #if (!defined(CONFIG_ETRAX_KGDB) || !defined(CONFIG_ETRAX_DEBUG_PORT0)) \
 	&& !defined(CONFIG_DMA_MEMCPY)
-	; DMA channels 6 and 7 to se$r0, kgdb doesnt want DMA
+	; DMA channels 6 and 7 to ser0, kgdb doesnt want DMA
 	or.d	  IO_STATE (R_GEN_CONFIG, dma7, serial0)	\
 		| IO_STATE (R_GEN_CONFIG, dma6, serial0),$r0
 #endif
@@ -554,7 +557,7 @@
 #endif
 #if defined(CONFIG_ETRAX_PARALLEL_PORT0) || defined(CONFIG_ETRAX_ETHERNET_LPSLAVE)
 	; parport 0 enabled using DMA 2/3
-	or.w	IO_STATE (R_GEN_CONFIG, pa$r0, select),$r0
+	or.w	IO_STATE (R_GEN_CONFIG, par0, select),$r0
 #endif
 #if defined(CONFIG_ETRAX_PARALLEL_PORT1) || defined(CONFIG_ETRAX_ETHERNET_LPSLAVE)
 	; parport 1 enabled using DMA 4/5
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/kgdb.c linux/arch/cris/kernel/kgdb.c
--- v2.4.14/linux/arch/cris/kernel/kgdb.c	Tue May  1 16:04:56 2001
+++ linux/arch/cris/kernel/kgdb.c	Fri Nov  9 13:58:02 2001
@@ -18,6 +18,9 @@
 *! Jul 21 1999  Bjorn Wesen     eLinux port
 *!
 *! $Log: kgdb.c,v $
+*! Revision 1.6  2001/10/09 13:10:03  matsfg
+*! Added $ on registers and removed some underscores
+*!
 *! Revision 1.5  2001/04/17 13:58:39  orjanf
 *! * Renamed CONFIG_KGDB to CONFIG_ETRAX_KGDB.
 *!
@@ -52,7 +55,7 @@
 *!
 *!---------------------------------------------------------------------------
 *!
-*! $Id: kgdb.c,v 1.5 2001/04/17 13:58:39 orjanf Exp $
+*! $Id: kgdb.c,v 1.6 2001/10/09 13:10:03 matsfg Exp $
 *!
 *! (C) Copyright 1999, Axis Communications AB, LUND, SWEDEN
 *!
@@ -1343,90 +1346,90 @@
 void kgdb_handle_breakpoint(void);
 
 asm ("
-  .global _kgdb_handle_breakpoint
-_kgdb_handle_breakpoint:
+  .global kgdb_handle_breakpoint
+kgdb_handle_breakpoint:
 ;;
 ;; Response to the break-instruction
 ;;
 ;; Create a register image of the caller
 ;;
-  move     dccr,[_reg+0x5E] ; Save the flags in DCCR before disable interrupts
+  move     $dccr,[reg+0x5E] ; Save the flags in DCCR before disable interrupts
   di                        ; Disable interrupts
-  move.d   r0,[_reg]        ; Save R0
-  move.d   r1,[_reg+0x04]   ; Save R1
-  move.d   r2,[_reg+0x08]   ; Save R2
-  move.d   r3,[_reg+0x0C]   ; Save R3
-  move.d   r4,[_reg+0x10]   ; Save R4
-  move.d   r5,[_reg+0x14]   ; Save R5
-  move.d   r6,[_reg+0x18]   ; Save R6
-  move.d   r7,[_reg+0x1C]   ; Save R7
-  move.d   r8,[_reg+0x20]   ; Save R8
-  move.d   r9,[_reg+0x24]   ; Save R9
-  move.d   r10,[_reg+0x28]  ; Save R10
-  move.d   r11,[_reg+0x2C]  ; Save R11
-  move.d   r12,[_reg+0x30]  ; Save R12
-  move.d   r13,[_reg+0x34]  ; Save R13
-  move.d   sp,[_reg+0x38]   ; Save SP (R14)
+  move.d   $r0,[reg]        ; Save R0
+  move.d   $r1,[reg+0x04]   ; Save R1
+  move.d   $r2,[reg+0x08]   ; Save R2
+  move.d   $r3,[reg+0x0C]   ; Save R3
+  move.d   $r4,[reg+0x10]   ; Save R4
+  move.d   $r5,[reg+0x14]   ; Save R5
+  move.d   $r6,[reg+0x18]   ; Save R6
+  move.d   $r7,[reg+0x1C]   ; Save R7
+  move.d   $r8,[reg+0x20]   ; Save R8
+  move.d   $r9,[reg+0x24]   ; Save R9
+  move.d   $r10,[reg+0x28]  ; Save R10
+  move.d   $r11,[reg+0x2C]  ; Save R11
+  move.d   $r12,[reg+0x30]  ; Save R12
+  move.d   $r13,[reg+0x34]  ; Save R13
+  move.d   $sp,[reg+0x38]   ; Save SP (R14)
 ;; Due to the old assembler-versions BRP might not be recognized
-  .word 0xE670              ; move brp,r0
-  subq     2,r0             ; Set to address of previous instruction.
-  move.d   r0,[_reg+0x3c]   ; Save the address in PC (R15)
-  clear.b  [_reg+0x40]      ; Clear P0
-  move     vr,[_reg+0x41]   ; Save special register P1
-  clear.w  [_reg+0x42]      ; Clear P4
-  move     ccr,[_reg+0x44]  ; Save special register CCR
-  move     mof,[_reg+0x46]  ; P7
-  clear.d  [_reg+0x4A]      ; Clear P8
-  move     ibr,[_reg+0x4E]  ; P9,
-  move     irp,[_reg+0x52]  ; P10,
-  move     srp,[_reg+0x56]  ; P11,
-  move     dtp0,[_reg+0x5A] ; P12, register BAR, assembler might not know BAR
+  .word 0xE670              ; move brp,$r0
+  subq     2,$r0             ; Set to address of previous instruction.
+  move.d   $r0,[reg+0x3c]   ; Save the address in PC (R15)
+  clear.b  [reg+0x40]      ; Clear P0
+  move     $vr,[reg+0x41]   ; Save special register P1
+  clear.w  [reg+0x42]      ; Clear P4
+  move     $ccr,[reg+0x44]  ; Save special register CCR
+  move     $mof,[reg+0x46]  ; P7
+  clear.d  [reg+0x4A]      ; Clear P8
+  move     $ibr,[reg+0x4E]  ; P9,
+  move     $irp,[reg+0x52]  ; P10,
+  move     $srp,[reg+0x56]  ; P11,
+  move     $dtp0,[reg+0x5A] ; P12, register BAR, assembler might not know BAR
                             ; P13, register DCCR already saved
 ;; Due to the old assembler-versions BRP might not be recognized
   .word 0xE670              ; move brp,r0
 ;; Static (compiled) breakpoints must return to the next instruction in order
 ;; to avoid infinite loops. Dynamic (gdb-invoked) must restore the instruction
 ;; in order to execute it when execution is continued.
-  test.b   [_is_dyn_brkp]    ; Is this a dynamic breakpoint?
+  test.b   [is_dyn_brkp]    ; Is this a dynamic breakpoint?
   beq      is_static         ; No, a static breakpoint
   nop
-  subq     2,r0              ; rerun the instruction the break replaced
+  subq     2,$r0              ; rerun the instruction the break replaced
 is_static:
-  moveq    1,r1
-  move.b   r1,[_is_dyn_brkp] ; Set the state variable to dynamic breakpoint
-  move.d   r0,[_reg+0x62]    ; Save the return address in BRP
-  move     usp,[_reg+0x66]   ; USP
+  moveq    1,$r1
+  move.b   $r1,[is_dyn_brkp] ; Set the state variable to dynamic breakpoint
+  move.d   $r0,[reg+0x62]    ; Save the return address in BRP
+  move     $usp,[reg+0x66]   ; USP
 ;;
 ;; Handle the communication
 ;;
-  move.d   _internal_stack+1020,sp ; Use the internal stack which grows upward
-  moveq    5,r10                   ; SIGTRAP
-  jsr      _handle_exception       ; Interactive routine
+  move.d   internal_stack+1020,$sp ; Use the internal stack which grows upward
+  moveq    5,$r10                   ; SIGTRAP
+  jsr      handle_exception       ; Interactive routine
 ;;
 ;; Return to the caller
 ;;
-   move.d  [_reg],r0         ; Restore R0
-   move.d  [_reg+0x04],r1    ; Restore R1
-   move.d  [_reg+0x08],r2    ; Restore R2
-   move.d  [_reg+0x0C],r3    ; Restore R3
-   move.d  [_reg+0x10],r4    ; Restore R4
-   move.d  [_reg+0x14],r5    ; Restore R5
-   move.d  [_reg+0x18],r6    ; Restore R6
-   move.d  [_reg+0x1C],r7    ; Restore R7
-   move.d  [_reg+0x20],r8    ; Restore R8
-   move.d  [_reg+0x24],r9    ; Restore R9
-   move.d  [_reg+0x28],r10   ; Restore R10
-   move.d  [_reg+0x2C],r11   ; Restore R11
-   move.d  [_reg+0x30],r12   ; Restore R12
-   move.d  [_reg+0x34],r13   ; Restore R13
+   move.d  [reg],$r0         ; Restore R0
+   move.d  [reg+0x04],$r1    ; Restore R1
+   move.d  [reg+0x08],$r2    ; Restore R2
+   move.d  [reg+0x0C],$r3    ; Restore R3
+   move.d  [reg+0x10],$r4    ; Restore R4
+   move.d  [reg+0x14],$r5    ; Restore R5
+   move.d  [reg+0x18],$r6    ; Restore R6
+   move.d  [reg+0x1C],$r7    ; Restore R7
+   move.d  [reg+0x20],$r8    ; Restore R8
+   move.d  [reg+0x24],$r9    ; Restore R9
+   move.d  [reg+0x28],$r10   ; Restore R10
+   move.d  [reg+0x2C],$r11   ; Restore R11
+   move.d  [reg+0x30],$r12   ; Restore R12
+   move.d  [reg+0x34],$r13   ; Restore R13
 ;;
 ;; FIXME: Which registers should be restored?
 ;;
-   move.d  [_reg+0x38],sp    ; Restore SP (R14)
-   move    [_reg+0x56],srp   ; Restore the subroutine return pointer.
-   move    [_reg+0x5E],dccr  ; Restore DCCR
-   move    [_reg+0x66],usp   ; Restore USP
-   jump    [_reg+0x62]       ; A jump to the content in register BRP works.
+   move.d  [reg+0x38],$sp    ; Restore SP (R14)
+   move    [reg+0x56],$srp   ; Restore the subroutine return pointer.
+   move    [reg+0x5E],$dccr  ; Restore DCCR
+   move    [reg+0x66],$usp   ; Restore USP
+   jump    [reg+0x62]       ; A jump to the content in register BRP works.
    nop                       ;
 ");
 
@@ -1440,85 +1443,85 @@
 void kgdb_handle_serial(void);
 
 asm ("
-  .global _kgdb_handle_serial
-_kgdb_handle_serial:
+  .global kgdb_handle_serial
+kgdb_handle_serial:
 ;;
 ;; Response to a serial interrupt
 ;;
 
-  move     dccr,[_reg+0x5E] ; Save the flags in DCCR
+  move     $dccr,[reg+0x5E] ; Save the flags in DCCR
   di                        ; Disable interrupts
-  move.d   r0,[_reg]        ; Save R0
-  move.d   r1,[_reg+0x04]   ; Save R1
-  move.d   r2,[_reg+0x08]   ; Save R2
-  move.d   r3,[_reg+0x0C]   ; Save R3
-  move.d   r4,[_reg+0x10]   ; Save R4
-  move.d   r5,[_reg+0x14]   ; Save R5
-  move.d   r6,[_reg+0x18]   ; Save R6
-  move.d   r7,[_reg+0x1C]   ; Save R7
-  move.d   r8,[_reg+0x20]   ; Save R8
-  move.d   r9,[_reg+0x24]   ; Save R9
-  move.d   r10,[_reg+0x28]  ; Save R10
-  move.d   r11,[_reg+0x2C]  ; Save R11
-  move.d   r12,[_reg+0x30]  ; Save R12
-  move.d   r13,[_reg+0x34]  ; Save R13
-  move.d   sp,[_reg+0x38]   ; Save SP (R14)
-  move     irp,[_reg+0x3c]  ; Save the address in PC (R15)
-  clear.b  [_reg+0x40]      ; Clear P0
-  move     vr,[_reg+0x41]   ; Save special register P1,
-  clear.w  [_reg+0x42]      ; Clear P4
-  move     ccr,[_reg+0x44]  ; Save special register CCR
-  move     mof,[_reg+0x46]  ; P7
-  clear.d  [_reg+0x4A]      ; Clear P8
-  move     ibr,[_reg+0x4E]  ; P9,
-  move     irp,[_reg+0x52]  ; P10,
-  move     srp,[_reg+0x56]  ; P11,
-  move     dtp0,[_reg+0x5A] ; P12, register BAR, assembler might not know BAR
+  move.d   $r0,[reg]        ; Save R0
+  move.d   $r1,[reg+0x04]   ; Save R1
+  move.d   $r2,[reg+0x08]   ; Save R2
+  move.d   $r3,[reg+0x0C]   ; Save R3
+  move.d   $r4,[reg+0x10]   ; Save R4
+  move.d   $r5,[reg+0x14]   ; Save R5
+  move.d   $r6,[reg+0x18]   ; Save R6
+  move.d   $r7,[reg+0x1C]   ; Save R7
+  move.d   $r8,[reg+0x20]   ; Save R8
+  move.d   $r9,[reg+0x24]   ; Save R9
+  move.d   $r10,[reg+0x28]  ; Save R10
+  move.d   $r11,[reg+0x2C]  ; Save R11
+  move.d   $r12,[reg+0x30]  ; Save R12
+  move.d   $r13,[reg+0x34]  ; Save R13
+  move.d   $sp,[reg+0x38]   ; Save SP (R14)
+  move     $irp,[reg+0x3c]  ; Save the address in PC (R15)
+  clear.b  [reg+0x40]      ; Clear P0
+  move     $vr,[reg+0x41]   ; Save special register P1,
+  clear.w  [reg+0x42]      ; Clear P4
+  move     $ccr,[reg+0x44]  ; Save special register CCR
+  move     $mof,[reg+0x46]  ; P7
+  clear.d  [reg+0x4A]      ; Clear P8
+  move     $ibr,[reg+0x4E]  ; P9,
+  move     $irp,[reg+0x52]  ; P10,
+  move     $srp,[reg+0x56]  ; P11,
+  move     $dtp0,[reg+0x5A] ; P12, register BAR, assembler might not know BAR
                             ; P13, register DCCR already saved
 ;; Due to the old assembler-versions BRP might not be recognized
   .word 0xE670              ; move brp,r0
-  move.d   r0,[_reg+0x62]   ; Save the return address in BRP
-  move     usp,[_reg+0x66]  ; USP
+  move.d   $r0,[reg+0x62]   ; Save the return address in BRP
+  move     $usp,[reg+0x66]  ; USP
 
 ;; get the serial character (from debugport.c) and check if its a ctrl-c
 
-  jsr _getDebugChar
-  cmp.b 3, r10
+  jsr getDebugChar
+  cmp.b 3, $r10
   bne goback
   nop
 
 ;;
 ;; Handle the communication
 ;;
-  move.d   _internal_stack+1020,sp ; Use the internal stack
-  moveq    2,r10                   ; SIGINT
-  jsr      _handle_exception       ; Interactive routine
+  move.d   internal_stack+1020,$sp ; Use the internal stack
+  moveq    2,$r10                   ; SIGINT
+  jsr      handle_exception       ; Interactive routine
 
 goback:
 ;;
 ;; Return to the caller
 ;;
-   move.d  [_reg],r0         ; Restore R0
-   move.d  [_reg+0x04],r1    ; Restore R1
-   move.d  [_reg+0x08],r2    ; Restore R2
-   move.d  [_reg+0x0C],r3    ; Restore R3
-   move.d  [_reg+0x10],r4    ; Restore R4
-   move.d  [_reg+0x14],r5    ; Restore R5
-   move.d  [_reg+0x18],r6    ; Restore R6
-   move.d  [_reg+0x1C],r7    ; Restore R7
-   move.d  [_reg+0x20],r8    ; Restore R8
-   move.d  [_reg+0x24],r9    ; Restore R9
-   move.d  [_reg+0x28],r10   ; Restore R10
-   move.d  [_reg+0x2C],r11   ; Restore R11
-   move.d  [_reg+0x30],r12   ; Restore R12
-   move.d  [_reg+0x34],r13   ; Restore R13
+   move.d  [reg],$r0         ; Restore R0
+   move.d  [reg+0x04],$r1    ; Restore R1
+   move.d  [reg+0x08],$r2    ; Restore R2
+   move.d  [reg+0x0C],$r3    ; Restore R3
+   move.d  [reg+0x10],$r4    ; Restore R4
+   move.d  [reg+0x14],$r5    ; Restore R5
+   move.d  [reg+0x18],$r6    ; Restore R6
+   move.d  [reg+0x1C],$r7    ; Restore R7
+   move.d  [reg+0x20],$r8    ; Restore R8
+   move.d  [reg+0x24],$r9    ; Restore R9
+   move.d  [reg+0x28],$r10   ; Restore R10
+   move.d  [reg+0x2C],$r11   ; Restore R11
+   move.d  [reg+0x30],$r12   ; Restore R12
+   move.d  [reg+0x34],$r13   ; Restore R13
 ;;
 ;; FIXME: Which registers should be restored?
 ;;
-   move.d  [_reg+0x38],sp    ; Restore SP (R14)
-   move    [_reg+0x56],srp   ; Restore the subroutine return pointer.
-   move    [_reg+0x5E],dccr  ; Restore DCCR
-   move    [_reg+0x66],usp   ; Restore USP
+   move.d  [reg+0x38],$sp    ; Restore SP (R14)
+   move    [reg+0x56],$srp   ; Restore the subroutine return pointer.
+   move    [reg+0x5E],$dccr  ; Restore DCCR
+   move    [reg+0x66],$usp   ; Restore USP
    reti                      ; Return from the interrupt routine
    nop
 ");
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/ksyms.c linux/arch/cris/kernel/ksyms.c
--- v2.4.14/linux/arch/cris/kernel/ksyms.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/ksyms.c	Fri Nov  9 13:58:02 2001
@@ -24,6 +24,7 @@
 extern void dump_thread(struct pt_regs *, struct user *);
 extern unsigned long get_cmos_time(void);
 extern void __ashrdi3(void);
+extern void iounmap(void *addr);
 
 /* platform dependent support */
 
@@ -44,6 +45,19 @@
 EXPORT_SYMBOL(strncat);
 EXPORT_SYMBOL(strncmp);
 EXPORT_SYMBOL(__ashrdi3);
+
+EXPORT_SYMBOL(__ioremap);
+EXPORT_SYMBOL(iounmap);
+
+/* export shadow registers for the CPU I/O pins */
+
+EXPORT_SYMBOL(genconfig_shadow);
+EXPORT_SYMBOL(port_pa_data_shadow);
+EXPORT_SYMBOL(port_pa_dir_shadow);
+EXPORT_SYMBOL(port_pb_data_shadow);
+EXPORT_SYMBOL(port_pb_dir_shadow);
+EXPORT_SYMBOL(port_pb_config_shadow);
+EXPORT_SYMBOL(port_g_data_shadow);
 
 /* other stuff */
 
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/process.c linux/arch/cris/kernel/process.c
--- v2.4.14/linux/arch/cris/kernel/process.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/process.c	Fri Nov  9 13:58:02 2001
@@ -77,6 +77,7 @@
  * setup.
  */
 
+static struct vm_area_struct init_mmap = INIT_MMAP;
 static struct fs_struct init_fs = INIT_FS;
 static struct files_struct init_files = INIT_FILES;
 static struct signal_struct init_signals = INIT_SIGNALS;
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/setup.c linux/arch/cris/kernel/setup.c
--- v2.4.14/linux/arch/cris/kernel/setup.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/setup.c	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-/* $Id: setup.c,v 1.21 2001/10/01 14:45:35 bjornw Exp $
+/* $Id: setup.c,v 1.22 2001/10/23 17:42:58 pkj Exp $
  *
  *  linux/arch/cris/kernel/setup.c
  *
@@ -202,32 +202,58 @@
 } cpu_info[] = {
 	/* The first four models will never ever run this code and are
 	   only here for display.  */
-	{ "ETRAX 1",   0, 0 },
-	{ "ETRAX 2",   0, 0 },
-	{ "ETRAX 3",   0, HAS_TOKENRING },
-	{ "ETRAX 4",   0, HAS_TOKENRING | HAS_SCSI },
-	{ "Unknown",   0, 0 },
-	{ "Unknown",   0, 0 },
-	{ "Unknown",   0, 0 },
-	{ "Simulator",     8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA },
-	{ "ETRAX 100",     8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_IRQ_BUG },
-	{ "ETRAX 100",     8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA },
-	{ "ETRAX 100LX",  8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB | HAS_MMU | HAS_MMU_BUG },
+	{ "ETRAX 1",         0, 0 },
+	{ "ETRAX 2",         0, 0 },
+	{ "ETRAX 3",         0, HAS_TOKENRING },
+	{ "ETRAX 4",         0, HAS_TOKENRING | HAS_SCSI },
+	{ "Unknown",         0, 0 },
+	{ "Unknown",         0, 0 },
+	{ "Unknown",         0, 0 },
+	{ "Simulator",       8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA },
+	{ "ETRAX 100",       8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_IRQ_BUG },
+	{ "ETRAX 100",       8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA },
+	{ "ETRAX 100LX",     8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB | HAS_MMU | HAS_MMU_BUG },
 	{ "ETRAX 100LX v2",  8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB | HAS_MMU },
-	{ "Unknown",   0, 0 },
+	{ "Unknown",         0, 0 }  /* This entry MUST be the last */
 };
 
 /*
- * BUFFER is PAGE_SIZE bytes long.
+ * get_cpuinfo - Get information on one CPU for use by the procfs.
+ *
+ *	Prints info on the next CPU into buffer.  Beware, doesn't check for
+ *	buffer overflow.  Current implementation of procfs assumes that the
+ *	resulting data is <= 1K.
+ *
+ *	BUFFER is PAGE_SIZE - 1K bytes long.
+ *
+ * Args:
+ *	buffer	-- you guessed it, the data buffer
+ *	cpu_np	-- Input: next cpu to get (start at 0).  Output: Updated.
+ *
+ *	Returns number of bytes written to buffer.
  */
-int get_cpuinfo(char *buffer)
+int get_cpuinfo(char *buffer, unsigned *cpu_np)
 {
 	int revision;
+ 	struct cpu_info *info;
+	unsigned n;
 
 	/* read the version register in the CPU and print some stuff */
 
 	revision = rdvr();
 
+	if (revision < 0 || revision >= sizeof cpu_info/sizeof *cpu_info) {
+		info = &cpu_info[sizeof cpu_info/sizeof *cpu_info - 1];
+	} else
+		info = &cpu_info[revision];
+
+  	/* No SMP at the moment, so just toggle 0/1 */
+	n = *cpu_np;
+	*cpu_np = 1;
+	if (n != 0) {
+		return (0);
+	}
+
 	return sprintf(buffer,
 		       "cpu\t\t: CRIS\n"
 		       "cpu revision\t: %d\n"
@@ -244,16 +270,16 @@
 		       "bogomips\t: %lu.%02lu\n",
 
 		       revision,
-		       cpu_info[revision].model,
-		       cpu_info[revision].cache,
-		       cpu_info[revision].flags & HAS_FPU ? "yes" : "no",
-		       cpu_info[revision].flags & HAS_MMU ? "yes" : "no",
-		       cpu_info[revision].flags & HAS_MMU_BUG ? "yes" : "no",
-		       cpu_info[revision].flags & HAS_ETHERNET100 ? "10/100" : "10",
-		       cpu_info[revision].flags & HAS_TOKENRING ? "4/16 Mbps" : "no",
-		       cpu_info[revision].flags & HAS_SCSI ? "yes" : "no",
-		       cpu_info[revision].flags & HAS_ATA ? "yes" : "no",
-		       cpu_info[revision].flags & HAS_USB ? "yes" : "no",
+		       info->model,
+		       info->cache,
+		       info->flags & HAS_FPU ? "yes" : "no",
+		       info->flags & HAS_MMU ? "yes" : "no",
+		       info->flags & HAS_MMU_BUG ? "yes" : "no",
+		       info->flags & HAS_ETHERNET100 ? "10/100" : "10",
+		       info->flags & HAS_TOKENRING ? "4/16 Mbps" : "no",
+		       info->flags & HAS_SCSI ? "yes" : "no",
+		       info->flags & HAS_ATA ? "yes" : "no",
+		       info->flags & HAS_USB ? "yes" : "no",
 		       (loops_per_jiffy * HZ + 500) / 500000,
 		       ((loops_per_jiffy * HZ + 500) / 5000) % 100);
 }
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/time.c linux/arch/cris/kernel/time.c
--- v2.4.14/linux/arch/cris/kernel/time.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/cris/kernel/time.c	Fri Nov  9 13:58:02 2001
@@ -1,4 +1,4 @@
-/* $Id: time.c,v 1.8 2001/07/18 14:01:03 bjornw Exp $
+/* $Id: time.c,v 1.9 2001/10/25 10:26:37 johana Exp $
  *
  *  linux/arch/cris/kernel/time.c
  *
@@ -51,6 +51,11 @@
 
 extern int setup_etrax_irq(int, struct irqaction *);
 
+/* Lookup table to convert *R_TIMER0 to microseconds (us) 
+ * Timer goes from TIMER0_DIV down to 1 meaning 0-10000us in step of approx 52us
+ */
+unsigned short cris_timer0_value_us[TIMER0_DIV+1];
+
 #define TICK_SIZE tick
 
 static unsigned long do_slow_gettimeoffset(void)
@@ -380,6 +385,7 @@
 void __init
 time_init(void)
 {	
+	int i;
 	/* probe for the RTC and read it if it exists */
 
 	if(RTC_INIT() < 0) {
@@ -442,6 +448,13 @@
 		IO_STATE(R_TIMER_CTRL, tm0,       run)      |
 		IO_STATE(R_TIMER_CTRL, clksel0,   c19k2Hz);
 #endif
+
+	for (i=0; i <= TIMER0_DIV; i++) {
+		/* We must be careful not to get overflow... */
+		cris_timer0_value_us[TIMER0_DIV-i] = 
+		  (unsigned short)((unsigned long)
+		  ((i*(1000000/HZ))/TIMER0_DIV)&0x0000FFFFL);
+	}
 	
 	*R_IRQ_MASK0_SET =
 		IO_STATE(R_IRQ_MASK0_SET, timer0, set); /* unmask the timer irq */
diff -u --recursive --new-file v2.4.14/linux/arch/cris/kernel/traps.c linux/arch/cris/kernel/traps.c
--- v2.4.14/linux/arch/cris/kernel/traps.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/cris/kernel/traps.c	Fri Nov  9 13:58:02 2001
@@ -138,8 +138,8 @@
 	   register.  */
 	unsigned long usp = rdusp();
 
-	printk("IRP: %08lx SRP: %08lx DCCR: %08lx USP: %08lx MOF: %08lx    %s\n",
-	       regs->irp, regs->srp, regs->dccr, usp, regs->mof, print_tainted());
+	printk("IRP: %08lx SRP: %08lx DCCR: %08lx USP: %08lx MOF: %08lx\n",
+	       regs->irp, regs->srp, regs->dccr, usp, regs->mof );
 	printk(" r0: %08lx  r1: %08lx   r2: %08lx  r3: %08lx\n",
 	       regs->r0, regs->r1, regs->r2, regs->r3);
 	printk(" r4: %08lx  r5: %08lx   r6: %08lx  r7: %08lx\n",
diff -u --recursive --new-file v2.4.14/linux/arch/i386/boot/bootsect.S linux/arch/i386/boot/bootsect.S
--- v2.4.14/linux/arch/i386/boot/bootsect.S	Sun Sep 23 11:40:55 2001
+++ linux/arch/i386/boot/bootsect.S	Fri Nov  9 13:58:02 2001
@@ -395,9 +395,15 @@
 # NOTE: Doesn't save %ax or %dx; do it yourself if you need to.
 
 kill_motor:
+#if 1
+	xorw	%ax, %ax		# reset FDC
+	xorb	%dl, %dl
+	int	$0x13
+#else
 	movw	$0x3f2, %dx
 	xorb	%al, %al
 	outb	%al, %dx
+#endif
 	ret
 
 sectors:	.word 0
diff -u --recursive --new-file v2.4.14/linux/arch/i386/boot/compressed/misc.c linux/arch/i386/boot/compressed/misc.c
--- v2.4.14/linux/arch/i386/boot/compressed/misc.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/i386/boot/compressed/misc.c	Mon Nov 12 09:59:43 2001
@@ -9,6 +9,7 @@
  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
  */
 
+#include <linux/linkage.h>
 #include <linux/vmalloc.h>
 #include <linux/tty.h>
 #include <asm/io.h>
@@ -304,7 +305,7 @@
 	short b;
 	} stack_start = { & user_stack [STACK_SIZE] , __KERNEL_DS };
 
-void setup_normal_output_buffer(void)
+static void setup_normal_output_buffer(void)
 {
 #ifdef STANDARD_MEMORY_BIOS_CALL
 	if (EXT_MEM_K < 1024) error("Less than 2MB of memory.\n");
@@ -320,7 +321,7 @@
 	uch *high_buffer_start; int hcount;
 };
 
-void setup_output_buffer_if_we_run_high(struct moveparams *mv)
+static void setup_output_buffer_if_we_run_high(struct moveparams *mv)
 {
 	high_buffer_start = (uch *)(((ulg)&end) + HEAP_SIZE);
 #ifdef STANDARD_MEMORY_BIOS_CALL
@@ -342,7 +343,7 @@
 	mv->high_buffer_start = high_buffer_start;
 }
 
-void close_output_buffer_if_we_run_high(struct moveparams *mv)
+static void close_output_buffer_if_we_run_high(struct moveparams *mv)
 {
 	if (bytes_out > low_buffer_size) {
 		mv->lcount = low_buffer_size;
@@ -355,7 +356,7 @@
 }
 
 
-int decompress_kernel(struct moveparams *mv, void *rmode)
+asmlinkage int decompress_kernel(struct moveparams *mv, void *rmode)
 {
 	real_mode = rmode;
 
diff -u --recursive --new-file v2.4.14/linux/arch/i386/boot/setup.S linux/arch/i386/boot/setup.S
--- v2.4.14/linux/arch/i386/boot/setup.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/i386/boot/setup.S	Fri Nov  9 13:58:02 2001
@@ -232,8 +232,8 @@
 # Move rest of setup code/data to here
 	movw	$2048, %di			# four sectors loaded by LILO
 	subw	%si, %si
-	movw	%cs, %ax			# aka SETUPSEG
-	movw	%ax, %es
+	pushw	%cs
+	popw	%es
 	movw	$SYSSEG, %ax
 	movw	%ax, %ds
 	rep
@@ -253,6 +253,7 @@
 	call	prtstr
 
 no_sig_loop:
+	hlt
 	jmp	no_sig_loop
 
 good_sig:
@@ -641,18 +642,40 @@
 	movw	%ax, %ds
 	movw	%dx, %ss
 end_move_self:					# now we are at the right place
-	lidt	idt_48				# load idt with 0,0
-	xorl	%eax, %eax			# Compute gdt_base
-	movw	%ds, %ax			# (Convert %ds:gdt to a linear ptr)
-	shll	$4, %eax
-	addl	$gdt, %eax
-	movl	%eax, (gdt_48+2)
-	lgdt	gdt_48				# load gdt with whatever is
-						# appropriate
 
-# that was painless, now we enable a20
+#
+# Enable A20.  This is at the very best an annoying procedure.
+# A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin.
+#
+
+A20_TEST_LOOPS		=  32		# Iterations per wait
+A20_ENABLE_LOOPS	= 255		# Total loops to try		
+
+
+a20_try_loop:
+
+	# First, see if we are on a system with no A20 gate.
+a20_none:
+	call	a20_test
+	jnz	a20_done
+
+	# Next, try the BIOS (INT 0x15, AX=0x2401)
+a20_bios:
+	movw	$0x2401, %ax
+	pushfl					# Be paranoid about flags
+	int	$0x15
+	popfl
+
+	call	a20_test
+	jnz	a20_done
+
+	# Try enabling A20 through the keyboard controller
+a20_kbc:
 	call	empty_8042
 
+	call	a20_test			# Just in case the BIOS worked
+	jnz	a20_done			# but had a delayed reaction.
+
 	movb	$0xD1, %al			# command write
 	outb	%al, $0x64
 	call	empty_8042
@@ -661,29 +684,62 @@
 	outb	%al, $0x60
 	call	empty_8042
 
-#
-#	You must preserve the other bits here. Otherwise embarrasing things
-#	like laptops powering off on boot happen. Corrected version by Kira
-#	Brown from Linux 2.2
-#
-	inb	$0x92, %al			# 
-	orb	$02, %al			# "fast A20" version
-	outb	%al, $0x92			# some chips have only this
-
-# wait until a20 really *is* enabled; it can take a fair amount of
-# time on certain systems; Toshiba Tecras are known to have this
-# problem.  The memory location used here (0x200) is the int 0x80
-# vector, which should be safe to use.
-
-	xorw	%ax, %ax			# segment 0x0000
-	movw	%ax, %fs
-	decw	%ax				# segment 0xffff (HMA)
-	movw	%ax, %gs
-a20_wait:
-	incw	%ax				# unused memory location <0xfff0
-	movw	%ax, %fs:(0x200)		# we use the "int 0x80" vector
-	cmpw	%gs:(0x210), %ax		# and its corresponding HMA addr
-	je	a20_wait			# loop until no longer aliased
+	# Wait until a20 really *is* enabled; it can take a fair amount of
+	# time on certain systems; Toshiba Tecras are known to have this
+	# problem.
+a20_kbc_wait:
+	xorw	%cx, %cx
+a20_kbc_wait_loop:
+	call	a20_test
+	jnz	a20_done
+	loop	a20_kbc_wait_loop
+
+	# Final attempt: use "configuration port A"
+a20_fast:
+	inb	$0x92, %al			# Configuration Port A
+	orb	$0x02, %al			# "fast A20" version
+	andb	$0xFE, %al			# don't accidentally reset
+	outb	%al, $0x92
+
+	# Wait for configuration port A to take effect
+a20_fast_wait:
+	xorw	%cx, %cx
+a20_fast_wait_loop:
+	call	a20_test
+	jnz	a20_done
+	loop	a20_fast_wait_loop
+
+	# A20 is still not responding.  Try frobbing it again.
+	# 
+	decb	(a20_tries)
+	jnz	a20_try_loop
+	
+	movw	$a20_err_msg, %si
+	call	prtstr
+
+a20_die:
+	hlt
+	jmp	a20_die
+
+a20_tries:
+	.byte	A20_ENABLE_LOOPS
+
+a20_err_msg:
+	.ascii	"linux: fatal error: A20 gate not responding!"
+	.byte	13, 10, 0
+
+	# If we get here, all is good
+a20_done:
+
+# set up gdt and idt
+	lidt	idt_48				# load idt with 0,0
+	xorl	%eax, %eax			# Compute gdt_base
+	movw	%ds, %ax			# (Convert %ds:gdt to a linear ptr)
+	shll	$4, %eax
+	addl	$gdt, %eax
+	movl	%eax, (gdt_48+2)
+	lgdt	gdt_48				# load gdt with whatever is
+						# appropriate
 
 # make sure any possible coprocessor is properly reset..
 	xorw	%ax, %ax
@@ -839,6 +895,37 @@
 
 bootsect_panic_mess:
 	.string	"INT15 refuses to access high mem, giving up."
+
+
+# This routine tests whether or not A20 is enabled.  If so, it
+# exits with zf = 0.
+#
+# The memory address used, 0x200, is the int $0x80 vector, which
+# should be safe.
+
+A20_TEST_ADDR = 4*0x80
+
+a20_test:
+	pushw	%cx
+	pushw	%ax
+	xorw	%cx, %cx
+	movw	%cx, %fs			# Low memory
+	decw	%cx
+	movw	%cx, %gs			# High memory area
+	movw	$A20_TEST_LOOPS, %cx
+	movw	%fs:(A20_TEST_ADDR), %ax
+	pushw	%ax
+a20_test_wait:
+	incw	%ax
+	movw	%ax, %fs:(A20_TEST_ADDR)
+	call	delay				# Serialize and make delay constant
+	cmpw	%gs:(A20_TEST_ADDR+0x10), %ax
+	loope	a20_test_wait
+
+	popw	%fs:(A20_TEST_ADDR)
+	popw	%ax
+	popw	%cx
+	ret	
 
 # This routine checks that the keyboard command queue is empty
 # (after emptying the output buffers)
diff -u --recursive --new-file v2.4.14/linux/arch/i386/config.in linux/arch/i386/config.in
--- v2.4.14/linux/arch/i386/config.in	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/config.in	Mon Nov 12 11:58:08 2001
@@ -234,8 +234,10 @@
 
 if [ "$CONFIG_HOTPLUG" = "y" ] ; then
    source drivers/pcmcia/Config.in
+   source drivers/hotplug/Config.in
 else
    define_bool CONFIG_PCMCIA n
+   define_bool CONFIG_HOTPLUG_PCI n
 fi
 
 bool 'System V IPC' CONFIG_SYSVIPC
diff -u --recursive --new-file v2.4.14/linux/arch/i386/defconfig linux/arch/i386/defconfig
--- v2.4.14/linux/arch/i386/defconfig	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/defconfig	Mon Nov 12 11:59:03 2001
@@ -88,6 +88,13 @@
 # CONFIG_I82092 is not set
 # CONFIG_I82365 is not set
 # CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+# CONFIG_HOTPLUG_PCI_COMPAQ is not set
+# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
@@ -315,6 +322,7 @@
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_NCR53C406A is not set
 # CONFIG_SCSI_NCR53C7xx is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
 # CONFIG_SCSI_NCR53C8XX is not set
 CONFIG_SCSI_SYM53C8XX=y
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=4
@@ -468,6 +476,7 @@
 # CONFIG_PCMCIA_NMCLAN is not set
 # CONFIG_PCMCIA_SMC91C92 is not set
 # CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_PCMCIA_AXNET is not set
 # CONFIG_ARCNET_COM20020_CS is not set
 # CONFIG_PCMCIA_IBMTR is not set
 # CONFIG_PCMCIA_XIRCOM is not set
@@ -597,11 +606,15 @@
 CONFIG_AUTOFS4_FS=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
+# CONFIG_JBD_DEBUG is not set
 # CONFIG_FAT_FS is not set
 # CONFIG_MSDOS_FS is not set
 # CONFIG_UMSDOS_FS is not set
@@ -639,6 +652,7 @@
 # Network File Systems
 #
 # CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_ROOT_NFS is not set
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/Makefile linux/arch/i386/kernel/Makefile
--- v2.4.14/linux/arch/i386/kernel/Makefile	Sun Sep 23 11:40:55 2001
+++ linux/arch/i386/kernel/Makefile	Fri Nov  9 14:21:21 2001
@@ -38,7 +38,7 @@
 obj-$(CONFIG_APM)		+= apm.o
 obj-$(CONFIG_SMP)		+= smp.o smpboot.o trampoline.o
 obj-$(CONFIG_X86_LOCAL_APIC)	+= mpparse.o apic.o nmi.o
-obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o
+obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o acpitable.o
 obj-$(CONFIG_X86_VISWS_APIC)	+= visws_apic.o
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/acpitable.c linux/arch/i386/kernel/acpitable.c
--- v2.4.14/linux/arch/i386/kernel/acpitable.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/i386/kernel/acpitable.c	Sun Nov 11 19:15:06 2001
@@ -0,0 +1,550 @@
+/*
+ *  acpitable.c - IA32-specific ACPI boot-time initialization (Revision: 1)
+ *
+ *  Copyright (C) 1999 Andrew Henroid
+ *  Copyright (C) 2001 Richard Schaal
+ *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
+ *  Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
+ *  Copyright (C) 2001 Arjan van de Ven <arjanv@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * $Id: acpitable.c,v 1.7 2001/11/04 12:21:18 fenrus Exp $
+ */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/stddef.h>
+#include <linux/slab.h>
+#include <linux/pci.h>
+#include <asm/mpspec.h>
+#include <asm/io.h>
+#include <asm/apic.h>
+#include <asm/apicdef.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+
+#include "acpitable.h"
+
+static acpi_table_handler acpi_boot_ops[ACPI_TABLE_COUNT];
+
+
+static unsigned char __init
+acpi_checksum(void *buffer, int length)
+{
+	int i;
+	unsigned char *bytebuffer;
+	unsigned char sum = 0;
+
+	if (!buffer || length <= 0)
+		return 0;
+
+	bytebuffer = (unsigned char *) buffer;
+
+	for (i = 0; i < length; i++)
+		sum += *(bytebuffer++);
+
+	return sum;
+}
+
+static void __init
+acpi_print_table_header(acpi_table_header * header)
+{
+	if (!header)
+		return;
+
+	printk(KERN_INFO "ACPI table found: %.4s v%d [%.6s %.8s %d.%d]\n",
+	       header->signature, header->revision, header->oem_id,
+	       header->oem_table_id, header->oem_revision >> 16,
+	       header->oem_revision & 0xffff);
+
+	return;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_tb_scan_memory_for_rsdp
+ *
+ * PARAMETERS:  address       - Starting pointer for search
+ *              length        - Maximum length to search
+ *
+ * RETURN:      Pointer to the RSDP if found and valid, otherwise NULL.
+ *
+ * DESCRIPTION: Search a block of memory for the RSDP signature
+ *
+ ******************************************************************************/
+
+static void *__init
+acpi_tb_scan_memory_for_rsdp(void *address, int length)
+{
+	u32 offset;
+
+	if (length <= 0)
+		return NULL;
+
+	/* Search from given start addr for the requested length  */
+
+	offset = 0;
+
+	while (offset < length) {
+		/* The signature must match and the checksum must be correct */
+		if (strncmp(address, RSDP_SIG, sizeof(RSDP_SIG) - 1) == 0 &&
+		    acpi_checksum(address, RSDP_CHECKSUM_LENGTH) == 0) {
+			/* If so, we have found the RSDP */
+			printk(KERN_INFO "ACPI: RSDP located at physical address %p\n",
+			       address);
+			return address;
+		}
+		offset += RSDP_SCAN_STEP;
+		address += RSDP_SCAN_STEP;
+	}
+
+	/* Searched entire block, no RSDP was found */
+	printk(KERN_INFO "ACPI: Searched entire block, no RSDP was found.\n");
+	return NULL;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_find_root_pointer
+ *
+ * PARAMETERS:  none
+ *
+ * RETURN:      physical address of the RSDP 
+ *
+ * DESCRIPTION: Search lower 1_mbyte of memory for the root system descriptor
+ *              pointer structure.  If it is found, set *RSDP to point to it.
+ *
+ *              NOTE: The RSDP must be either in the first 1_k of the Extended
+ *              BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section
+ *              5.2.2; assertion #421).
+ *
+ ******************************************************************************/
+
+static struct acpi_table_rsdp * __init
+acpi_find_root_pointer(void)
+{
+	struct acpi_table_rsdp * rsdp;
+
+	/*
+	 * Physical address is given
+	 */
+	/*
+	 * Region 1) Search EBDA (low memory) paragraphs
+	 */
+	rsdp = acpi_tb_scan_memory_for_rsdp(__va(LO_RSDP_WINDOW_BASE),
+					 LO_RSDP_WINDOW_SIZE);
+
+	if (rsdp)
+		return rsdp;
+
+	/*
+	 * Region 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
+	 */
+	rsdp = acpi_tb_scan_memory_for_rsdp(__va(HI_RSDP_WINDOW_BASE),
+					       HI_RSDP_WINDOW_SIZE);
+
+	
+					     
+	if (rsdp)
+		return rsdp;
+
+	printk(KERN_ERR "ACPI: System description tables not found\n");
+	return NULL;
+}
+
+
+/*
+ * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_0,
+ * to map the target physical address. The problem is that set_fixmap()
+ * provides a single page, and it is possible that the page is not
+ * sufficient.
+ * By using this area, we can map up to MAX_IO_APICS pages temporarily,
+ * i.e. until the next __va_range() call.
+ */
+static __inline__ char *
+__va_range(unsigned long phys, unsigned long size)
+{
+	unsigned long base, offset, mapped_size, mapped_phys = phys;
+	int idx = FIX_IO_APIC_BASE_0;
+
+	offset = phys & (PAGE_SIZE - 1);
+	mapped_size = PAGE_SIZE - offset;
+	set_fixmap(idx, mapped_phys);
+	base = fix_to_virt(FIX_IO_APIC_BASE_0);
+
+	/*
+	 * Most cases can be covered by the below.
+	 */
+	if (mapped_size >= size)
+		return ((unsigned char *) base + offset);
+
+	dprintk("__va_range: mapping more than a single page, size = 0x%lx\n",
+		size);
+
+	do {
+		if (idx++ == FIX_IO_APIC_BASE_END)
+			return 0;	/* cannot handle this */
+		mapped_phys = mapped_phys + PAGE_SIZE;
+		set_fixmap(idx, mapped_phys);
+		mapped_size = mapped_size + PAGE_SIZE;
+	} while (mapped_size < size);
+
+	return ((unsigned char *) base + offset);
+}
+
+static int __init acpi_tables_init(void)
+{
+	int result = -ENODEV;
+	acpi_table_header *header = NULL;
+	struct acpi_table_rsdp *rsdp = NULL;
+	struct acpi_table_rsdt *rsdt = NULL;
+	struct acpi_table_rsdt saved_rsdt;
+	int tables = 0;
+	int type = 0;
+	int i = 0;
+
+
+	rsdp = (struct acpi_table_rsdp *) acpi_find_root_pointer();
+
+	if (!rsdp)
+		return -ENODEV;
+		
+	printk(KERN_INFO "%.8s v%d [%.6s]\n", rsdp->signature, rsdp->revision,
+	       rsdp->oem_id);
+	       
+	if (strncmp(rsdp->signature, RSDP_SIG,strlen(RSDP_SIG))) {
+		printk(KERN_WARNING "RSDP table signature incorrect\n");
+		return -EINVAL;
+	}
+
+	rsdt = (struct acpi_table_rsdt *)
+	    __va_range(rsdp->rsdt_address, sizeof(struct acpi_table_rsdt));
+
+	if (!rsdt) {
+		printk(KERN_WARNING "ACPI: Invalid root system description tables (RSDT)\n");
+		return -ENODEV;
+	}
+	
+	header = & rsdt->header;
+	acpi_print_table_header(header);
+	
+	if (strncmp(header->signature, RSDT_SIG, strlen(RSDT_SIG))) {
+		printk(KERN_WARNING "ACPI: RSDT signature incorrect\n");
+		return -ENODEV;
+	}
+		
+	/* 
+	 * The number of tables is computed by taking the 
+	 * size of all entries (header size minus total 
+	 * size of RSDT) divided by the size of each entry
+	 * (4-byte table pointers).
+	 */
+	tables = (header->length - sizeof(acpi_table_header)) / 4;
+		    
+	memcpy(&saved_rsdt, rsdt, sizeof(saved_rsdt));
+
+	if (saved_rsdt.header.length > sizeof(saved_rsdt)) {
+		printk(KERN_WARNING "ACPI: Too big length in RSDT: %d\n", saved_rsdt.header.length);
+		return -ENODEV;
+	}
+
+	for (i = 0; i < tables; i++) {
+
+		header = (acpi_table_header *)
+			    __va_range(saved_rsdt.entry[i],
+				       sizeof(acpi_table_header));
+
+		if (!header)
+			break;
+
+		acpi_print_table_header(header);
+		
+		if (acpi_checksum(header,header->length)) {
+			printk(KERN_WARNING "ACPI %s has invalid checksum\n", 
+				acpi_table_signatures[i]);
+			continue;
+		}
+		
+		for (type = 0; type < ACPI_TABLE_COUNT; type++)
+			if (!strncmp((char *) &header->signature,
+			     acpi_table_signatures[type],strlen(acpi_table_signatures[type])))
+				break;
+
+		if (type >= ACPI_TABLE_COUNT) {
+			printk(KERN_WARNING "ACPI: Unsupported table %.4s\n",
+			       header->signature);
+			continue;
+		}
+
+
+		if (!acpi_boot_ops[type])
+			continue;
+			
+		result = acpi_boot_ops[type] (header,
+						 (unsigned long) saved_rsdt.
+						 entry[i]);
+	}
+
+	return result;
+}
+
+static int total_cpus __initdata = 0;
+int have_acpi_tables;
+
+extern void __init MP_processor_info(struct mpc_config_processor *);
+
+static void __init
+acpi_parse_lapic(struct acpi_table_lapic *local_apic)
+{
+	struct mpc_config_processor proc_entry;
+	int ix = 0;
+
+	if (!local_apic)
+		return;
+
+	printk(KERN_INFO "LAPIC (acpi_id[0x%04x] id[0x%x] enabled[%d])\n",
+		local_apic->acpi_id, local_apic->id, local_apic->flags.enabled);
+
+	printk(KERN_INFO "CPU %d (0x%02x00)", total_cpus, local_apic->id);
+
+	if (local_apic->flags.enabled) {
+		printk(" enabled");
+		ix = local_apic->id;
+		if (ix >= MAX_APICS) {
+			printk(KERN_WARNING
+			       "Processor #%d INVALID - (Max ID: %d).\n", ix,
+			       MAX_APICS);
+			return;
+		}
+		/* 
+		 * Fill in the info we want to save.  Not concerned about 
+		 * the processor ID.  Processor features aren't present in 
+		 * the table.
+		 */
+		proc_entry.mpc_type = MP_PROCESSOR;
+		proc_entry.mpc_apicid = local_apic->id;
+		proc_entry.mpc_cpuflag = CPU_ENABLED;
+		if (proc_entry.mpc_apicid == boot_cpu_physical_apicid) {
+			printk(" (BSP)");
+			proc_entry.mpc_cpuflag |= CPU_BOOTPROCESSOR;
+		}
+		proc_entry.mpc_cpufeature =
+		    (boot_cpu_data.x86 << 8) | 
+		    (boot_cpu_data.x86_model << 4) | 
+		     boot_cpu_data.x86_mask;
+		proc_entry.mpc_featureflag = boot_cpu_data.x86_capability[0];
+		proc_entry.mpc_reserved[0] = 0;
+		proc_entry.mpc_reserved[1] = 0;
+		proc_entry.mpc_apicver = 0x10;	/* integrated APIC */
+		MP_processor_info(&proc_entry);
+	} else {
+		printk(" disabled");
+	}
+	printk("\n");
+
+	total_cpus++;
+	return;
+}
+
+static void __init
+acpi_parse_ioapic(struct acpi_table_ioapic *ioapic)
+{
+
+	if (!ioapic)
+		return;
+
+	printk(KERN_INFO
+	       "IOAPIC (id[0x%x] address[0x%x] global_irq_base[0x%x])\n",
+	       ioapic->id, ioapic->address, ioapic->global_irq_base);
+
+	if (nr_ioapics >= MAX_IO_APICS) {
+		printk(KERN_WARNING
+		       "Max # of I/O APICs (%d) exceeded (found %d).\n",
+		       MAX_IO_APICS, nr_ioapics);
+/*		panic("Recompile kernel with bigger MAX_IO_APICS!\n");   */
+	}
+}
+
+
+/* Interrupt source overrides inform the machine about exceptions
+   to the normal "PIC" mode interrupt routing */
+   
+static void __init
+acpi_parse_int_src_ovr(struct acpi_table_int_src_ovr *intsrc)
+{
+	if (!intsrc)
+		return;
+
+	printk(KERN_INFO
+	       "INT_SRC_OVR (bus[%d] irq[0x%x] global_irq[0x%x] polarity[0x%x] trigger[0x%x])\n",
+	       intsrc->bus, intsrc->bus_irq, intsrc->global_irq,
+	       intsrc->flags.polarity, intsrc->flags.trigger);
+}
+
+/*
+ * At this point, we look at the interrupt assignment entries in the MPS
+ * table.
+ */ 
+ 
+static void __init acpi_parse_nmi_src(struct acpi_table_nmi_src *nmisrc)
+{
+	if (!nmisrc)
+		return;
+
+	printk(KERN_INFO
+	       "NMI_SRC (polarity[0x%x] trigger[0x%x] global_irq[0x%x])\n",
+	       nmisrc->flags.polarity, nmisrc->flags.trigger,
+	       nmisrc->global_irq);
+
+}
+static void __init
+acpi_parse_lapic_nmi(struct acpi_table_lapic_nmi *localnmi)
+{
+	if (!localnmi)
+		return;
+
+	printk(KERN_INFO
+	       "LAPIC_NMI (acpi_id[0x%04x] polarity[0x%x] trigger[0x%x] lint[0x%x])\n",
+	       localnmi->acpi_id, localnmi->flags.polarity,
+	       localnmi->flags.trigger, localnmi->lint);
+}
+static void __init
+acpi_parse_lapic_addr_ovr(struct acpi_table_lapic_addr_ovr *lapic_addr_ovr)
+{
+	if (!lapic_addr_ovr)
+		return;
+
+	printk(KERN_INFO "LAPIC_ADDR_OVR (address[0x%lx])\n",
+	       (unsigned long) lapic_addr_ovr->address);
+
+}
+
+static void __init
+acpi_parse_plat_int_src(struct acpi_table_plat_int_src *plintsrc)
+{
+	if (!plintsrc)
+		return;
+
+	printk(KERN_INFO
+	       "PLAT_INT_SRC (polarity[0x%x] trigger[0x%x] type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
+	       plintsrc->flags.polarity, plintsrc->flags.trigger,
+	       plintsrc->type, plintsrc->id, plintsrc->eid,
+	       plintsrc->iosapic_vector, plintsrc->global_irq);
+}
+static int __init
+acpi_parse_madt(acpi_table_header * header, unsigned long phys)
+{
+
+	struct acpi_table_madt *madt;	    
+	acpi_madt_entry_header *entry_header;
+	int table_size;
+	
+	madt = (struct acpi_table_madt *) __va_range(phys, header->length);
+
+	if (!madt)
+		return -EINVAL;
+
+	table_size = (int) (header->length - sizeof(*madt));
+	entry_header =
+	    (acpi_madt_entry_header *) ((void *) madt + sizeof(*madt));
+
+	while (entry_header && (table_size > 0)) {
+		switch (entry_header->type) {
+		case ACPI_MADT_LAPIC:
+			acpi_parse_lapic((struct acpi_table_lapic *)
+					 entry_header);
+			break;
+		case ACPI_MADT_IOAPIC:
+			acpi_parse_ioapic((struct acpi_table_ioapic *)
+					  entry_header);
+			break;
+		case ACPI_MADT_INT_SRC_OVR:
+			acpi_parse_int_src_ovr((struct acpi_table_int_src_ovr *)
+					       entry_header);
+			break;
+		case ACPI_MADT_NMI_SRC:
+			acpi_parse_nmi_src((struct acpi_table_nmi_src *)
+					   entry_header);
+			break;
+		case ACPI_MADT_LAPIC_NMI:
+			acpi_parse_lapic_nmi((struct acpi_table_lapic_nmi *)
+					     entry_header);
+			break;
+		case ACPI_MADT_LAPIC_ADDR_OVR:
+			acpi_parse_lapic_addr_ovr((struct
+						   acpi_table_lapic_addr_ovr *)
+						  entry_header);
+			break;
+		case ACPI_MADT_PLAT_INT_SRC:
+			acpi_parse_plat_int_src((struct acpi_table_plat_int_src
+						 *) entry_header);
+			break;
+		default:
+			printk(KERN_WARNING
+			       "Unsupported MADT entry type 0x%x\n",
+			       entry_header->type);
+			break;
+		}
+		table_size -= entry_header->length;
+		entry_header =
+		    (acpi_madt_entry_header *) ((void *) entry_header +
+						entry_header->length);
+	}
+
+	if (!total_cpus) {
+		printk("ACPI: No Processors found in the APCI table.\n");
+		return -EINVAL;
+	}
+
+	printk(KERN_INFO "%d CPUs total\n", total_cpus);
+
+	if (madt->lapic_address)
+		mp_lapic_addr = madt->lapic_address;
+	else
+		mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
+
+	printk(KERN_INFO "Local APIC address %x\n", madt->lapic_address);
+
+	return 0;
+}
+
+extern int enable_acpi_smp_table;
+
+/*
+ * Configure the processor info using MADT in the ACPI tables. If we fail to
+ * configure that, then we use the MPS tables.
+ */
+void __init
+config_acpi_tables(void)
+{
+
+	memset(&acpi_boot_ops, 0, sizeof(acpi_boot_ops));
+	acpi_boot_ops[ACPI_APIC] = acpi_parse_madt;
+
+	/*
+	 * Only do this when requested, either because of CPU/Bios type or from the command line
+	 */
+
+	if (enable_acpi_smp_table && !acpi_tables_init()) {
+		have_acpi_tables = 1;
+		printk("Enabling the CPU's according to the ACPI table\n");
+	}
+}
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/acpitable.h linux/arch/i386/kernel/acpitable.h
--- v2.4.14/linux/arch/i386/kernel/acpitable.h	Wed Dec 31 16:00:00 1969
+++ linux/arch/i386/kernel/acpitable.h	Sun Nov 11 19:04:33 2001
@@ -0,0 +1,260 @@
+/*
+ *  acpitable.c - IA32-specific ACPI boot-time initialization (Revision: 1)
+ *
+ *  Copyright (C) 1999 Andrew Henroid
+ *  Copyright (C) 2001 Richard Schaal
+ *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
+ *  Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
+ *  Copyright (C) 2001 Arjan van de Ven <arjanv@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * $Id: acpitable.h,v 1.3 2001/11/03 22:41:34 fenrus Exp $
+ */
+
+/*
+ * The following codes are cut&pasted from drivers/acpi. Part of the code
+ * there can be not updated or delivered yet.
+ * To avoid conflicts when CONFIG_ACPI is defined, the following codes are
+ * modified so that they are self-contained in this file.
+ * -- jun
+ */
+ 
+#ifndef _HEADER_ACPITABLE_H_
+#define _HEADER_ACPITABLE_H_
+
+#define dprintk printk
+typedef unsigned int ACPI_TBLPTR;
+
+typedef struct {		/* ACPI common table header */
+	char signature[4];	/* identifies type of table */
+	u32 length;		/* length of table,
+				   in bytes, * including header */
+	u8 revision;		/* specification minor version # */
+	u8 checksum;		/* to make sum of entire table == 0 */
+	char oem_id[6];		/* OEM identification */
+	char oem_table_id[8];	/* OEM table identification */
+	u32 oem_revision;	/* OEM revision number */
+	char asl_compiler_id[4];	/* ASL compiler vendor ID */
+	u32 asl_compiler_revision;	/* ASL compiler revision number */
+} acpi_table_header __attribute__ ((packed));;
+
+enum {
+	ACPI_APIC = 0,
+	ACPI_BOOT,
+	ACPI_DBGP,
+	ACPI_DSDT,
+	ACPI_ECDT,
+	ACPI_ETDT,
+	ACPI_FACP,
+	ACPI_FACS,
+	ACPI_OEMX,
+	ACPI_PSDT,
+	ACPI_SBST,
+	ACPI_SLIT,
+	ACPI_SPCR,
+	ACPI_SRAT,
+	ACPI_SSDT,
+	ACPI_SPMI,
+	ACPI_XSDT,
+	ACPI_TABLE_COUNT
+};
+
+static char *acpi_table_signatures[ACPI_TABLE_COUNT] = {
+	"APIC",
+	"BOOT",
+	"DBGP",
+	"DSDT",
+	"ECDT",
+	"ETDT",
+	"FACP",
+	"FACS",
+	"OEM",
+	"PSDT",
+	"SBST",
+	"SLIT",
+	"SPCR",
+	"SRAT",
+	"SSDT",
+	"SPMI",
+	"XSDT"
+};
+
+struct acpi_table_madt {
+	acpi_table_header header;
+	u32 lapic_address;
+	struct {
+		u32 pcat_compat:1;
+		u32 reserved:31;
+	} flags __attribute__ ((packed));
+} __attribute__ ((packed));;
+
+enum {
+	ACPI_MADT_LAPIC = 0,
+	ACPI_MADT_IOAPIC,
+	ACPI_MADT_INT_SRC_OVR,
+	ACPI_MADT_NMI_SRC,
+	ACPI_MADT_LAPIC_NMI,
+	ACPI_MADT_LAPIC_ADDR_OVR,
+	ACPI_MADT_IOSAPIC,
+	ACPI_MADT_LSAPIC,
+	ACPI_MADT_PLAT_INT_SRC,
+	ACPI_MADT_ENTRY_COUNT
+};
+
+#define RSDP_SIG			"RSD PTR "
+#define RSDT_SIG 			"RSDT"
+
+#define ACPI_DEBUG_PRINT(pl)
+
+#define ACPI_MEMORY_MODE                0x01
+#define ACPI_LOGICAL_ADDRESSING         0x00
+#define ACPI_PHYSICAL_ADDRESSING        0x01
+
+#define LO_RSDP_WINDOW_BASE         	0	/* Physical Address */
+#define HI_RSDP_WINDOW_BASE         	0xE0000	/* Physical Address */
+#define LO_RSDP_WINDOW_SIZE         	0x400
+#define HI_RSDP_WINDOW_SIZE         	0x20000
+#define RSDP_SCAN_STEP			16
+#define RSDP_CHECKSUM_LENGTH		20
+
+typedef int (*acpi_table_handler) (acpi_table_header * header, unsigned long);
+
+struct acpi_table_rsdp {
+	char signature[8];
+	u8 checksum;
+	char oem_id[6];
+	u8 revision;
+	u32 rsdt_address;
+} __attribute__ ((packed));
+
+struct acpi_table_rsdt {
+	acpi_table_header header;
+	u32 entry[ACPI_TABLE_COUNT];
+} __attribute__ ((packed));
+
+typedef struct {
+	u8 type;
+	u8 length;
+} acpi_madt_entry_header __attribute__ ((packed));
+
+typedef struct {
+	u16 polarity:2;
+	u16 trigger:2;
+	u16 reserved:12;
+} acpi_madt_int_flags __attribute__ ((packed));
+
+struct acpi_table_lapic {
+	acpi_madt_entry_header header;
+	u8 acpi_id;
+	u8 id;
+	struct {
+		u32 enabled:1;
+		u32 reserved:31;
+	} flags __attribute__ ((packed));
+} __attribute__ ((packed));
+
+struct acpi_table_ioapic {
+	acpi_madt_entry_header header;
+	u8 id;
+	u8 reserved;
+	u32 address;
+	u32 global_irq_base;
+} __attribute__ ((packed));
+
+struct acpi_table_int_src_ovr {
+	acpi_madt_entry_header header;
+	u8 bus;
+	u8 bus_irq;
+	u32 global_irq;
+	acpi_madt_int_flags flags;
+} __attribute__ ((packed));
+
+struct acpi_table_nmi_src {
+	acpi_madt_entry_header header;
+	acpi_madt_int_flags flags;
+	u32 global_irq;
+} __attribute__ ((packed));
+
+struct acpi_table_lapic_nmi {
+	acpi_madt_entry_header header;
+	u8 acpi_id;
+	acpi_madt_int_flags flags;
+	u8 lint;
+} __attribute__ ((packed));
+
+struct acpi_table_lapic_addr_ovr {
+	acpi_madt_entry_header header;
+	u8 reserved[2];
+	u64 address;
+} __attribute__ ((packed));
+
+struct acpi_table_iosapic {
+	acpi_madt_entry_header header;
+	u8 id;
+	u8 reserved;
+	u32 global_irq_base;
+	u64 address;
+} __attribute__ ((packed));
+
+struct acpi_table_lsapic {
+	acpi_madt_entry_header header;
+	u8 acpi_id;
+	u8 id;
+	u8 eid;
+	u8 reserved[3];
+	struct {
+		u32 enabled:1;
+		u32 reserved:31;
+	} flags;
+} __attribute__ ((packed));
+
+struct acpi_table_plat_int_src {
+	acpi_madt_entry_header header;
+	acpi_madt_int_flags flags;
+	u8 type;
+	u8 id;
+	u8 eid;
+	u8 iosapic_vector;
+	u32 global_irq;
+	u32 reserved;
+} __attribute__ ((packed));
+
+/*
+ * ACPI Table Descriptor.  One per ACPI table
+ */
+typedef struct acpi_table_desc {
+	struct acpi_table_desc *prev;
+	struct acpi_table_desc *next;
+	struct acpi_table_desc *installed_desc;
+	acpi_table_header *pointer;
+	void *base_pointer;
+	u8 *aml_pointer;
+	u64 physical_address;
+	u32 aml_length;
+	u32 length;
+	u32 count;
+	u16 table_id;
+	u8 type;
+	u8 allocation;
+	u8 loaded_into_namespace;
+
+} acpi_table_desc __attribute__ ((packed));;
+
+#endif
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/apic.c linux/arch/i386/kernel/apic.c
--- v2.4.14/linux/arch/i386/kernel/apic.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/kernel/apic.c	Fri Nov  9 14:12:55 2001
@@ -575,7 +575,6 @@
 static int __init detect_init_APIC (void)
 {
 	u32 h, l, features;
-	int needs_pm = 0;
 	extern void get_cpu_vendor(struct cpuinfo_x86*);
 
 	/* Workaround for us being called before identify_cpu(). */
@@ -608,7 +607,6 @@
 			l &= ~MSR_IA32_APICBASE_BASE;
 			l |= MSR_IA32_APICBASE_ENABLE | APIC_DEFAULT_PHYS_BASE;
 			wrmsr(MSR_IA32_APICBASE, l, h);
-			needs_pm = 1;
 		}
 	}
 	/*
@@ -628,8 +626,7 @@
 
 	printk("Found and enabled local APIC!\n");
 
-	if (needs_pm)
-		apic_pm_init1();
+	apic_pm_init1();
 
 	return 0;
 
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/apm.c linux/arch/i386/kernel/apm.c
--- v2.4.14/linux/arch/i386/kernel/apm.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/i386/kernel/apm.c	Fri Nov  9 13:58:02 2001
@@ -1471,7 +1471,7 @@
 	as = filp->private_data;
 	if (check_apm_user(as, "ioctl"))
 		return -EIO;
-	if (!as->suser)
+	if ((!as->suser) || (!as->writer))
 		return -EPERM;
 	switch (cmd) {
 	case APM_IOC_STANDBY:
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/bluesmoke.c linux/arch/i386/kernel/bluesmoke.c
--- v2.4.14/linux/arch/i386/kernel/bluesmoke.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/i386/kernel/bluesmoke.c	Mon Nov 12 09:59:43 2001
@@ -100,11 +100,11 @@
 
 /*
  *	Call the installed machine check handler for this CPU setup.
- */ 
- 
+ */
+
 static void (*machine_check_vector)(struct pt_regs *, long error_code) = unexpected_machine_check;
 
-void do_machine_check(struct pt_regs * regs, long error_code)
+asmlinkage void do_machine_check(struct pt_regs * regs, long error_code)
 {
 	machine_check_vector(regs, error_code);
 }
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/dmi_scan.c linux/arch/i386/kernel/dmi_scan.c
--- v2.4.14/linux/arch/i386/kernel/dmi_scan.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/i386/kernel/dmi_scan.c	Sun Nov 11 10:38:46 2001
@@ -7,9 +7,10 @@
 #include <linux/slab.h>
 #include <asm/io.h>
 #include <linux/pm.h>
-#include <linux/keyboard.h>
 #include <asm/keyboard.h>
+#include <asm/system.h>
 
+unsigned long dmi_broken;
 int is_sony_vaio_laptop;
 
 struct dmi_header
@@ -87,7 +88,7 @@
 }
 
 
-int __init dmi_iterate(void (*decode)(struct dmi_header *))
+static int __init dmi_iterate(void (*decode)(struct dmi_header *))
 {
 	unsigned char buf[20];
 	long fp=0xE0000L;
@@ -98,7 +99,7 @@
  	 *	Skip on x86/64 with simnow. Will eventually go away
  	 *	If you see this ifdef in 2.6pre mail me !
  	 */
-	return;
+	return -1;
 #endif
  	
 	while( fp < 0xFFFFF)
@@ -315,15 +316,14 @@
 	return 0;
 }		
 
-#if defined(CONFIG_SONYPI) || defined(CONFIG_SONYPI_MODULE)
 /*
- * Check for a Sony Vaio system in order to enable the use of
- * the sonypi driver (we don't want this driver to be used on
- * other systems, even if they have the good PCI IDs).
+ * Check for a Sony Vaio system
  *
- * This one isn't a bug detect for those who asked, we simply want to
- * activate Sony specific goodies like the camera and jogdial..
+ * On a Sony system we want to enable the use of the sonypi
+ * driver for Sony-specific goodies like the camera and jogdial.
+ * We also want to avoid using certain functions of the PnP BIOS.
  */
+
 static __init int sony_vaio_laptop(struct dmi_blacklist *d)
 {
 	if (is_sony_vaio_laptop == 0)
@@ -333,7 +333,6 @@
 	}
 	return 0;
 }
-#endif
 
 /*
  * This bios swaps the APM minute reporting bytes over (Many sony laptops
@@ -359,18 +358,49 @@
 	printk(KERN_INFO " *** Possibly defective BIOS detected (irqtable)\n");
 	printk(KERN_INFO " *** Many BIOSes matching this signature have incorrect IRQ routing tables.\n");
 	printk(KERN_INFO " *** If you see IRQ problems, in paticular SCSI resets and hangs at boot\n");
-	printk(KERN_INFO " *** contact your vendor and ask about updates.\n");
+	printk(KERN_INFO " *** contact your hardware vendor and ask about updates.\n");
 	printk(KERN_INFO " *** Building an SMP kernel may evade the bug some of the time.\n");
 	return 0;
 }
 
 /*
+ * ASUS K7V-RM has broken ACPI table defining sleep modes
+ */
+
+static __init int broken_acpi_Sx(struct dmi_blacklist *d)
+{
+	printk(KERN_WARNING "Detected ASUS mainboard with broken ACPI sleep table\n");
+	dmi_broken |= BROKEN_ACPI_Sx;
+	return 0;
+}
+
+/*
+ * Toshiba keyboard likes to repeat keys when they are not repeated.
+ */
+
+static __init int broken_toshiba_keyboard(struct dmi_blacklist *d)
+{
+	printk(KERN_WARNING "Toshiba with broken keyboard detected. If your keyboard sometimes generates 3 keypresses instead of one, contact pavel@ucw.cz\n");
+	return 0;
+}
+
+/*
+ * Toshiba fails to preserve interrupts over S1
+ */
+
+static __init int init_ints_after_s1(struct dmi_blacklist *d)
+{
+	printk(KERN_WARNING "Toshiba with broken S1 detected.\n");
+	dmi_broken |= BROKEN_INIT_AFTER_S1;
+	return 0;
+}
+
+/*
  * Some Bioses enable the PS/2 mouse (touchpad) at resume, even if it
  * was disabled before the suspend. Linux gets terribly confused by that.
  */
 
 typedef void (pm_kbd_func) (void);
-extern pm_kbd_func *pm_kbd_request_override;
 
 static __init int broken_ps2_resume(struct dmi_blacklist *d)
 {
@@ -380,11 +410,20 @@
 		pm_kbd_request_override = pckbd_pm_resume;
 		printk(KERN_INFO "%s machine detected. Mousepad Resume Bug workaround enabled.\n", d->ident);
 	}
-#endif	
+#endif
 	return 0;
 }
 
 
+/*
+ *	Simple "print if true" callback
+ */
+ 
+static __init int print_if_true(struct dmi_blacklist *d)
+{
+	printk("%s\n", d->ident);
+	return 0;
+}
 
 /*
  *	Process the DMI blacklists
@@ -428,10 +467,6 @@
 			MATCH(DMI_PRODUCT_NAME, "PowerEdge 300/"),
 			NO_MATCH, NO_MATCH
 			} },
-	{ set_apm_ints, "IBM", {	/* Allow interrupts during suspend on IBM laptops */
-			MATCH(DMI_SYS_VENDOR, "IBM"),
-			NO_MATCH, NO_MATCH, NO_MATCH
-			} },
 	{ set_apm_ints, "Dell Inspiron", {	/* Allow interrupts during suspend on Dell Inspiron laptops*/
 			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
 			MATCH(DMI_PRODUCT_NAME, "Inspiron 4000"),
@@ -459,13 +494,11 @@
 			MATCH(DMI_BIOS_VENDOR,"SystemSoft"),
 			MATCH(DMI_BIOS_VERSION,"Version R2.08")
 			} },
-#if defined(CONFIG_SONYPI) || defined(CONFIG_SONYPI_MODULE)
 	{ sony_vaio_laptop, "Sony Vaio", { /* This is a Sony Vaio laptop */
 			MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 			MATCH(DMI_PRODUCT_NAME, "PCG-"),
 			NO_MATCH, NO_MATCH,
 			} },
-#endif
 	{ swab_apm_power_in_minutes, "Sony VAIO", { /* Handle problems with APM on Sony Vaio PCG-N505X(DE) */
 			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
 			MATCH(DMI_BIOS_VERSION, "R0206H"),
@@ -536,11 +569,47 @@
 			MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0125.P13"),
 			NO_MATCH, NO_MATCH
 			} },
+	{ broken_pirq, "l44GX Bios", {		/* Bad $PIR */
+			MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
+			MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07.9906041405"),
+			NO_MATCH, NO_MATCH
+			} },
                         
 	/* Intel in disgiuse - In this case they can't hide and they don't run
 	   too well either... */
 	{ broken_pirq, "Dell PowerEdge 8450", {		/* Bad $PIR */
 			MATCH(DMI_PRODUCT_NAME, "Dell PowerEdge 8450"),
+			NO_MATCH, NO_MATCH, NO_MATCH
+			} },
+			
+	{ broken_acpi_Sx, "ASUS K7V-RM", {		/* Bad ACPI Sx table */
+			MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"),
+			MATCH(DMI_BOARD_NAME, "<K7V-RM>"),
+			NO_MATCH, NO_MATCH
+			} },
+			
+	{ broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */
+			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
+			NO_MATCH, NO_MATCH, NO_MATCH
+			} },
+	{ init_ints_after_s1, "Toshiba Satellite 4030cdt", { /* Reinitialization of 8259 is needed after S1 resume */
+			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
+			NO_MATCH, NO_MATCH, NO_MATCH
+			} },
+
+	{ print_if_true, KERN_WARNING "IBM T23 - BIOS 1.03b+ and controller firmware 1.02+ may be needed for Linux APM.", {
+			MATCH(DMI_SYS_VENDOR, "IBM"),
+			MATCH(DMI_BIOS_VERSION, "1AET38WW (1.01b)"),
+			NO_MATCH, NO_MATCH
+			} },
+	 
+			
+	/*
+	 *	Generic per vendor APM settings
+	 */
+	 
+	{ set_apm_ints, "IBM", {	/* Allow interrupts during suspend on IBM laptops */
+			MATCH(DMI_SYS_VENDOR, "IBM"),
 			NO_MATCH, NO_MATCH, NO_MATCH
 			} },
 
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/i386_ksyms.c linux/arch/i386/kernel/i386_ksyms.c
--- v2.4.14/linux/arch/i386/kernel/i386_ksyms.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/i386/kernel/i386_ksyms.c	Tue Nov 13 09:13:20 2001
@@ -112,6 +112,11 @@
 EXPORT_SYMBOL(pci_mem_start);
 #endif
 
+#ifdef CONFIG_PCI_BIOS
+EXPORT_SYMBOL(pcibios_set_irq_routing);
+EXPORT_SYMBOL(pcibios_get_irq_routing_table);
+#endif
+
 #ifdef CONFIG_X86_USE_3DNOW
 EXPORT_SYMBOL(_mmx_memcpy);
 EXPORT_SYMBOL(mmx_clear_page);
@@ -157,10 +162,6 @@
 extern void * memcpy(void *,const void *,__kernel_size_t);
 EXPORT_SYMBOL_NOVERS(memcpy);
 EXPORT_SYMBOL_NOVERS(memset);
-
-#ifdef CONFIG_X86_PAE
-EXPORT_SYMBOL(empty_zero_page);
-#endif
 
 #ifdef CONFIG_HAVE_DEC_LOCK
 EXPORT_SYMBOL(atomic_dec_and_lock);
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c
--- v2.4.14/linux/arch/i386/kernel/io_apic.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/kernel/io_apic.c	Tue Nov 13 17:28:41 2001
@@ -753,7 +753,6 @@
 	printk(KERN_DEBUG ".......     : PRQ implemented: %X\n", reg_01.PRQ);
 	printk(KERN_DEBUG ".......     : IO APIC version: %04X\n", reg_01.version);
 	if (	(reg_01.version != 0x01) && /* 82489DX IO-APICs */
-		(reg_01.version != 0x02) && /* 82801BA IO-APICs (ICH2) */
 		(reg_01.version != 0x10) && /* oldest IO-APICs */
 		(reg_01.version != 0x11) && /* Pentium/Pro IO-APICs */
 		(reg_01.version != 0x13) && /* Xeon IO-APICs */
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/mpparse.c linux/arch/i386/kernel/mpparse.c
--- v2.4.14/linux/arch/i386/kernel/mpparse.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/i386/kernel/mpparse.c	Fri Nov  9 14:58:18 2001
@@ -36,6 +36,7 @@
  */
 int apic_version [MAX_APICS];
 int mp_bus_id_to_type [MAX_MP_BUSSES];
+int mp_bus_id_to_node [MAX_MP_BUSSES];
 int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
 int mp_current_pci_id;
 
@@ -55,6 +56,7 @@
 
 /* Processor that is doing the boot up */
 unsigned int boot_cpu_physical_apicid = -1U;
+unsigned int boot_cpu_logical_apicid = -1U;
 /* Internal processor count */
 static unsigned int num_processors;
 
@@ -118,18 +120,45 @@
 	return n;
 }
 
-static void __init MP_processor_info (struct mpc_config_processor *m)
-{
-	int ver;
+#ifdef CONFIG_X86_IO_APIC
+extern int have_acpi_tables;	/* set by acpitable.c */
+#else
+#define have_acpi_tables (0)
+#endif
+
+/* 
+ * Have to match translation table entries to main table entries by counter
+ * hence the mpc_record variable .... can't see a less disgusting way of
+ * doing this ....
+ */
+
+static int mpc_record; 
+static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
 
+void __init MP_processor_info (struct mpc_config_processor *m)
+{
+ 	int ver, quad, logical_apicid;
+ 	
 	if (!(m->mpc_cpuflag & CPU_ENABLED))
 		return;
 
-	printk("Processor #%d %s APIC version %d\n",
-		m->mpc_apicid,
-		mpc_family(	(m->mpc_cpufeature & CPU_FAMILY_MASK)>>8 ,
-				(m->mpc_cpufeature & CPU_MODEL_MASK)>>4),
-		m->mpc_apicver);
+	logical_apicid = m->mpc_apicid;
+	if (clustered_apic_mode) {
+		quad = translation_table[mpc_record]->trans_quad;
+		logical_apicid = (quad << 4) + 
+			(m->mpc_apicid ? m->mpc_apicid << 1 : 1);
+		printk("Processor #%d %s APIC version %d (quad %d, apic %d)\n",
+			m->mpc_apicid,
+			mpc_family((m->mpc_cpufeature & CPU_FAMILY_MASK)>>8 ,
+				   (m->mpc_cpufeature & CPU_MODEL_MASK)>>4),
+			m->mpc_apicver, quad, logical_apicid);
+	} else {
+		printk("Processor #%d %s APIC version %d\n",
+			m->mpc_apicid,
+			mpc_family((m->mpc_cpufeature & CPU_FAMILY_MASK)>>8 ,
+				   (m->mpc_cpufeature & CPU_MODEL_MASK)>>4),
+			m->mpc_apicver);
+	}
 
 	if (m->mpc_featureflag&(1<<0))
 		Dprintk("    Floating point unit present.\n");
@@ -172,7 +201,8 @@
 		Dprintk("    Willamette New Instructions  present.\n");
 	if (m->mpc_featureflag&(1<<27))
 		Dprintk("    Self Snoop  present.\n");
-	/* 28 Reserved */
+	if (m->mpc_featureflag&(1<<28))
+		Dprintk("    HT  present.\n");
 	if (m->mpc_featureflag&(1<<29))
 		Dprintk("    Thermal Monitor present.\n");
 	/* 30, 31 Reserved */
@@ -181,6 +211,7 @@
 	if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
 		Dprintk("    Bootup CPU\n");
 		boot_cpu_physical_apicid = m->mpc_apicid;
+		boot_cpu_logical_apicid = logical_apicid;
 	}
 
 	num_processors++;
@@ -192,12 +223,11 @@
 	}
 	ver = m->mpc_apicver;
 
-	if (clustered_apic_mode)
-		/* Crude temporary hack. Assumes processors are sequential */
-		phys_cpu_present_map |= 1 << (num_processors-1);
-	else
+	if (clustered_apic_mode) {
+		phys_cpu_present_map |= (logical_apicid&0xf) << (4*quad);
+	} else {
 		phys_cpu_present_map |= 1 << m->mpc_apicid;
-
+	}
 	/*
 	 * Validate version
 	 */
@@ -214,7 +244,13 @@
 
 	memcpy(str, m->mpc_bustype, 6);
 	str[6] = 0;
-	Dprintk("Bus #%d is %s\n", m->mpc_busid, str);
+	
+	if (clustered_apic_mode) {
+		mp_bus_id_to_node[m->mpc_busid] = translation_table[mpc_record]->trans_quad;
+		printk("Bus #%d is %s (node %d)\n", m->mpc_busid, str, mp_bus_id_to_node[m->mpc_busid]);
+	} else {
+		Dprintk("Bus #%d is %s\n", m->mpc_busid, str);
+	}
 
 	if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
 		mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
@@ -286,6 +322,63 @@
 			BUG();
 }
 
+static void __init MP_translation_info (struct mpc_config_translation *m)
+{
+	printk("Translation: record %d, type %d, quad %d, global %d, local %d\n", mpc_record, m->trans_type, 
+		m->trans_quad, m->trans_global, m->trans_local);
+
+	if (mpc_record >= MAX_MPC_ENTRY) 
+		printk("MAX_MPC_ENTRY exceeded!\n");
+	else
+		translation_table[mpc_record] = m; /* stash this for later */
+}
+
+/*
+ * Read/parse the MPC oem tables
+ */
+
+static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, \
+	unsigned short oemsize)
+{
+	int count = sizeof (*oemtable); /* the header size */
+	unsigned char *oemptr = ((unsigned char *)oemtable)+count;
+	
+	printk("Found an OEM MPC table at %8p - parsing it ... \n", oemtable);
+	if (memcmp(oemtable->oem_signature,MPC_OEM_SIGNATURE,4))
+	{
+		printk("SMP mpc oemtable: bad signature [%c%c%c%c]!\n",
+			oemtable->oem_signature[0],
+			oemtable->oem_signature[1],
+			oemtable->oem_signature[2],
+			oemtable->oem_signature[3]);
+		return;
+	}
+	if (mpf_checksum((unsigned char *)oemtable,oemtable->oem_length))
+	{
+		printk("SMP oem mptable: checksum error!\n");
+		return;
+	}
+	while (count < oemtable->oem_length) {
+		switch (*oemptr) {
+			case MP_TRANSLATION:
+			{
+				struct mpc_config_translation *m=
+					(struct mpc_config_translation *)oemptr;
+				MP_translation_info(m);
+				oemptr += sizeof(*m);
+				count += sizeof(*m);
+				++mpc_record;
+				break;
+			}
+			default:
+			{
+				printk("Unrecognised OEM table entry type! - %d\n", (int) *oemptr);
+				return;
+			}
+		}
+       }
+}
+
 /*
  * Read/parse the MPC
  */
@@ -327,8 +420,18 @@
 
 	printk("APIC at: 0x%lX\n",mpc->mpc_lapic);
 
-	/* save the local APIC address, it might be non-default */
-	mp_lapic_addr = mpc->mpc_lapic;
+	/* save the local APIC address, it might be non-default,
+	 * but only if we're not using the ACPI tables
+	 */
+	if (!have_acpi_tables)
+		mp_lapic_addr = mpc->mpc_lapic;
+
+	if (clustered_apic_mode && mpc->mpc_oemptr) {
+		/* We need to process the oem mpc tables to tell us which quad things are in ... */
+		mpc_record = 0;
+		smp_read_mpc_oem((struct mp_config_oemtable *) mpc->mpc_oemptr, mpc->mpc_oemsize);
+		mpc_record = 0;
+	}
 
 	/*
 	 *	Now process the configuration blocks.
@@ -339,7 +442,10 @@
 			{
 				struct mpc_config_processor *m=
 					(struct mpc_config_processor *)mpt;
-				MP_processor_info(m);
+
+				/* ACPI may already have provided this one for us */
+				if (!have_acpi_tables)
+					MP_processor_info(m);
 				mpt += sizeof(*m);
 				count += sizeof(*m);
 				break;
@@ -381,7 +487,13 @@
 				count+=sizeof(*m);
 				break;
 			}
+			default:
+			{
+				count = mpc->mpc_length;
+				break;
+			}
 		}
+		++mpc_record;
 	}
 	if (clustered_apic_mode && nr_ioapics > 2) {
 		/* don't initialise IO apics on secondary quads */
@@ -550,6 +662,7 @@
 }
 
 static struct intel_mp_floating *mpf_found;
+extern void 	config_acpi_tables(void);
 
 /*
  * Scan the memory blocks for an SMP configuration block.
@@ -557,6 +670,18 @@
 void __init get_smp_config (void)
 {
 	struct intel_mp_floating *mpf = mpf_found;
+
+#ifdef CONFIG_X86_IO_APIC
+	/*
+	 * Check if the ACPI tables are provided. Use them only to get
+	 * the processor information, mainly because it provides
+	 * the info on the logical processor(s), rather than the physical
+	 * processor(s) that are provided by the MPS. We attempt to 
+	 * check only if the user provided a commandline override
+	 */
+	config_acpi_tables();
+#endif
+	
 	printk("Intel MultiProcessor Specification v1.%d\n", mpf->mpf_specification);
 	if (mpf->mpf_feature2 & (1<<7)) {
 		printk("    IMCR and PIC compatibility mode.\n");
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/mtrr.c linux/arch/i386/kernel/mtrr.c
--- v2.4.14/linux/arch/i386/kernel/mtrr.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/kernel/mtrr.c	Fri Nov  9 13:58:02 2001
@@ -2249,9 +2249,11 @@
 	proc_root_mtrr->proc_fops = &mtrr_fops;
     }
 #endif
+#ifdef USERSPACE_INTERFACE
     devfs_handle = devfs_register (NULL, "cpu/mtrr", DEVFS_FL_DEFAULT, 0, 0,
 				   S_IFREG | S_IRUGO | S_IWUSR,
 				   &mtrr_fops, NULL);
+#endif
     init_table ();
     return 0;
 }   /*  End Function mtrr_init  */
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/pci-i386.h linux/arch/i386/kernel/pci-i386.h
--- v2.4.14/linux/arch/i386/kernel/pci-i386.h	Tue Jul  3 17:08:18 2001
+++ linux/arch/i386/kernel/pci-i386.h	Sun Nov 11 10:09:32 2001
@@ -37,9 +37,6 @@
 extern struct pci_bus *pci_root_bus;
 extern struct pci_ops *pci_root_ops;
 
-struct irq_routing_table *pcibios_get_irq_routing_table(void);
-int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
-
 /* pci-irq.c */
 
 struct irq_info {
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/pci-pc.c linux/arch/i386/kernel/pci-pc.c
--- v2.4.14/linux/arch/i386/kernel/pci-pc.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/kernel/pci-pc.c	Fri Nov  9 13:58:02 2001
@@ -309,7 +309,7 @@
  * This should be close to trivial, but it isn't, because there are buggy
  * chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID.
  */
-static int __init pci_sanity_check(struct pci_ops *o)
+static int __devinit pci_sanity_check(struct pci_ops *o)
 {
 	u16 x;
 	struct pci_bus bus;		/* Fake bus and device */
@@ -329,7 +329,7 @@
 	return 0;
 }
 
-static struct pci_ops * __init pci_check_direct(void)
+static struct pci_ops * __devinit pci_check_direct(void)
 {
 	unsigned int tmp;
 	unsigned long flags;
@@ -488,7 +488,7 @@
 
 static int pci_bios_present;
 
-static int __init check_pcibios(void)
+static int __devinit check_pcibios(void)
 {
 	u32 signature, eax, ebx, ecx;
 	u8 status, major_ver, minor_ver, hw_mech;
@@ -538,7 +538,7 @@
 	return 0;
 }
 
-static int __init pci_bios_find_device (unsigned short vendor, unsigned short device_id,
+static int __devinit pci_bios_find_device (unsigned short vendor, unsigned short device_id,
 					unsigned short index, unsigned char *bus, unsigned char *device_fn)
 {
 	unsigned short bx;
@@ -747,7 +747,7 @@
  * Try to find PCI BIOS.
  */
 
-static struct pci_ops * __init pci_find_bios(void)
+static struct pci_ops * __devinit pci_find_bios(void)
 {
 	union bios32 *check;
 	unsigned char sum;
@@ -801,7 +801,7 @@
  * which used BIOS ordering, we are bound to do this...
  */
 
-static void __init pcibios_sort(void)
+static void __devinit pcibios_sort(void)
 {
 	LIST_HEAD(sorted_devices);
 	struct list_head *ln;
@@ -855,7 +855,7 @@
 	u16 segment;
 } __attribute__((packed));
 
-struct irq_routing_table * __init pcibios_get_irq_routing_table(void)
+struct irq_routing_table * __devinit pcibios_get_irq_routing_table(void)
 {
 	struct irq_routing_options opt;
 	struct irq_routing_table *rt = NULL;
@@ -929,7 +929,7 @@
  * expected to be unique) and remove the ghost devices.
  */
 
-static void __init pcibios_fixup_ghosts(struct pci_bus *b)
+static void __devinit pcibios_fixup_ghosts(struct pci_bus *b)
 {
 	struct list_head *ln, *mn;
 	struct pci_dev *d, *e;
@@ -979,7 +979,7 @@
  * Discover remaining PCI buses in case there are peer host bridges.
  * We use the number of last PCI bus provided by the PCI BIOS.
  */
-static void __init pcibios_fixup_peer_bridges(void)
+static void __devinit pcibios_fixup_peer_bridges(void)
 {
 	int n;
 	struct pci_bus bus;
@@ -1010,7 +1010,7 @@
  * Exceptions for specific devices. Usually work-arounds for fatal design flaws.
  */
 
-static void __init pci_fixup_i450nx(struct pci_dev *d)
+static void __devinit pci_fixup_i450nx(struct pci_dev *d)
 {
 	/*
 	 * i450NX -- Find and scan all secondary buses on all PXB's.
@@ -1032,7 +1032,7 @@
 	pcibios_last_bus = -1;
 }
 
-static void __init pci_fixup_i450gx(struct pci_dev *d)
+static void __devinit pci_fixup_i450gx(struct pci_dev *d)
 {
 	/*
 	 * i450GX and i450KX -- Find and scan all secondary buses.
@@ -1045,49 +1045,7 @@
 	pcibios_last_bus = -1;
 }
 
-#if 0
-/* Until we get proper handling pray the BIOS gets it right */
-/*
- * ServerWorks host bridges -- Find and scan all secondary buses.
- * Register 0x44 contains first, 0x45 last bus number routed there.
- */
-static void __init pci_fixup_serverworks(struct pci_dev *d)
-{
-	u8 busno1, busno2;
-
-	pci_read_config_byte(d, 0x44, &busno1);
-	pci_read_config_byte(d, 0x45, &busno2);
-	if (busno2 < busno1)
-		busno2 = busno1;
-	if (busno2 > pcibios_last_bus) {
-		pcibios_last_bus = busno2;
-		printk("PCI: ServerWorks host bridge: last bus %02x\n", pcibios_last_bus);
-	}
-}
-#endif
-
-#if 0
-/* Our bus code shouldnt need this fixup any more. Delete once verified */
-/*	
- * Compaq host bridges -- Find and scan all secondary buses.
- * This time registers 0xc8 and 0xc9.
- */
-static void __init pci_fixup_compaq(struct pci_dev *d)
-{
-	u8 busno1, busno2;
-
-	pci_read_config_byte(d, 0xc8, &busno1);
-	pci_read_config_byte(d, 0xc9, &busno2);
-	if (busno2 < busno1)
-		busno2 = busno1;
-	if (busno2 > pcibios_last_bus) {
-		pcibios_last_bus = busno2;
-		printk("PCI: Compaq host bridge: last bus %02x\n", busno2);
-	}
-}
-#endif	
-
-static void __init pci_fixup_umc_ide(struct pci_dev *d)
+static void __devinit  pci_fixup_umc_ide(struct pci_dev *d)
 {
 	/*
 	 * UM8886BF IDE controller sets region type bits incorrectly,
@@ -1100,7 +1058,7 @@
 		d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
 }
 
-static void __init pci_fixup_ide_bases(struct pci_dev *d)
+static void __devinit pci_fixup_ide_bases(struct pci_dev *d)
 {
 	int i;
 
@@ -1119,7 +1077,7 @@
 	}
 }
 
-static void __init pci_fixup_ide_trash(struct pci_dev *d)
+static void __devinit  pci_fixup_ide_trash(struct pci_dev *d)
 {
 	int i;
 
@@ -1132,7 +1090,7 @@
 		d->resource[i].start = d->resource[i].end = d->resource[i].flags = 0;
 }
 
-static void __init pci_fixup_latency(struct pci_dev *d)
+static void __devinit  pci_fixup_latency(struct pci_dev *d)
 {
 	/*
 	 *  SiS 5597 and 5598 chipsets require latency timer set to
@@ -1142,7 +1100,7 @@
 	pcibios_max_latency = 32;
 }
 
-static void __init pci_fixup_piix4_acpi(struct pci_dev *d)
+static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d)
 {
 	/*
 	 * PIIX4 ACPI device: hardwired IRQ9
@@ -1173,16 +1131,6 @@
 struct pci_fixup pcibios_fixups[] = {
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82451NX,	pci_fixup_i450nx },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82454GX,	pci_fixup_i450gx },
-#if 0
-/* Until we get proper handling pray the BIOS gets it right */
-	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SERVERWORKS,	PCI_DEVICE_ID_SERVERWORKS_HE,		pci_fixup_serverworks },
-	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SERVERWORKS,	PCI_DEVICE_ID_SERVERWORKS_LE,		pci_fixup_serverworks },
-	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SERVERWORKS,	PCI_DEVICE_ID_SERVERWORKS_CMIC_HE,	pci_fixup_serverworks },
-#endif	
-#if 0
-/* Our bus code shouldnt need this fixup any more. Delete once verified */
-	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_COMPAQ,	PCI_DEVICE_ID_COMPAQ_6010,	pci_fixup_compaq },
-#endif	
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_UMC,	PCI_DEVICE_ID_UMC_UM8886BF,	pci_fixup_umc_ide },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_5513,		pci_fixup_ide_trash },
 	{ PCI_FIXUP_HEADER,	PCI_ANY_ID,		PCI_ANY_ID,			pci_fixup_ide_bases },
@@ -1198,14 +1146,14 @@
  *  are examined.
  */
 
-void __init pcibios_fixup_bus(struct pci_bus *b)
+void __devinit  pcibios_fixup_bus(struct pci_bus *b)
 {
 	pcibios_fixup_ghosts(b);
 	pci_read_bridge_bases(b);
 }
 
 
-void __init pcibios_config_init(void)
+void __devinit pcibios_config_init(void)
 {
 	/*
 	 * Try all known PCI access methods. Note that we support using 
@@ -1262,7 +1210,7 @@
 #endif
 }
 
-char * __init pcibios_setup(char *str)
+char * __devinit  pcibios_setup(char *str)
 {
 	if (!strcmp(str, "off")) {
 		pci_probe = 0;
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/semaphore.c linux/arch/i386/kernel/semaphore.c
--- v2.4.14/linux/arch/i386/kernel/semaphore.c	Thu Apr 12 12:22:53 2001
+++ linux/arch/i386/kernel/semaphore.c	Fri Nov  9 13:58:02 2001
@@ -243,7 +243,8 @@
 .globl	__write_lock_failed
 __write_lock_failed:
 	" LOCK "addl	$" RW_LOCK_BIAS_STR ",(%eax)
-1:	cmpl	$" RW_LOCK_BIAS_STR ",(%eax)
+1:	rep; nop
+	cmpl	$" RW_LOCK_BIAS_STR ",(%eax)
 	jne	1b
 
 	" LOCK "subl	$" RW_LOCK_BIAS_STR ",(%eax)
@@ -255,7 +256,8 @@
 .globl	__read_lock_failed
 __read_lock_failed:
 	lock ; incl	(%eax)
-1:	cmpl	$1,(%eax)
+1:	rep; nop
+	cmpl	$1,(%eax)
 	js	1b
 
 	lock ; decl	(%eax)
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c
--- v2.4.14/linux/arch/i386/kernel/setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/i386/kernel/setup.c	Mon Nov 19 15:16:13 2001
@@ -67,6 +67,10 @@
  *
  *  AMD Athlon/Duron/Thunderbird bluesmoke support.
  *  Dave Jones <davej@suse.de>, April 2001.
+ *
+ *  CacheSize bug workaround updates for AMD, Intel & VIA Cyrix.
+ *  Dave Jones <davej@suse.de>, September, October 2001.
+ *
  */
 
 /*
@@ -94,6 +98,7 @@
 #endif
 #include <linux/highmem.h>
 #include <linux/bootmem.h>
+#include <linux/seq_file.h>
 #include <asm/processor.h>
 #include <linux/console.h>
 #include <asm/mtrr.h>
@@ -156,6 +161,8 @@
 static int disable_x86_serial_nr __initdata = 1;
 static int disable_x86_fxsr __initdata = 0;
 
+int enable_acpi_smp_table;
+
 /*
  * This is set up by the setup-routine at boot-time
  */
@@ -753,6 +760,10 @@
 				add_memory_region(start_at, mem_size, E820_RAM);
 			}
 		}
+		/* acpismp=force forces parsing and use of the ACPI SMP table */
+		if (c == ' ' && !memcmp(from, "acpismp=force", 13)) 	
+			 enable_acpi_smp_table = 1;
+	
 		c = *(from++);
 		if (!c)
 			break;
@@ -1035,6 +1046,15 @@
 #endif
 }
 
+static int cachesize_override __initdata = -1;
+static int __init cachesize_setup(char *str)
+{
+	get_option (&str, &cachesize_override);
+	return 1;
+}
+__setup("cachesize=", cachesize_setup);
+
+
 #ifndef CONFIG_X86_TSC
 static int tsc_disable __initdata = 0;
 
@@ -1105,12 +1125,25 @@
 			l2size = 256;
 	}
 
+	/* Intel PIII Tualatin. This comes in two flavours.
+	 * One has 256kb of cache, the other 512. We have no way
+	 * to determine which, so we use a boottime override
+	 * for the 512kb model, and assume 256 otherwise.
+	 */
+	if ((c->x86_vendor == X86_VENDOR_INTEL) && (c->x86 == 6) &&
+		(c->x86_model == 11) && (l2size == 0))
+		l2size = 256;
+
 	/* VIA C3 CPUs (670-68F) need further shifting. */
 	if (c->x86_vendor == X86_VENDOR_CENTAUR && (c->x86 == 6) &&
 		((c->x86_model == 7) || (c->x86_model == 8))) {
 		l2size = l2size >> 8;
 	}
 
+	/* Allow user to override all this if necessary. */
+	if (cachesize_override != -1)
+		l2size = cachesize_override;
+
 	if ( l2size == 0 )
 		return;		/* Again, no L2 cache is possible */
 
@@ -1200,13 +1233,12 @@
 			}
 
 			/* K6 with old style WHCR */
-			if( c->x86_model < 8 ||
-				(c->x86_model== 8 && c->x86_mask < 8))
-			{
+			if (c->x86_model < 8 ||
+			   (c->x86_model== 8 && c->x86_mask < 8)) {
 				/* We can only write allocate on the low 508Mb */
 				if(mbytes>508)
 					mbytes=508;
-					
+
 				rdmsr(MSR_K6_WHCR, l, h);
 				if ((l&0x0000FFFF)==0) {
 					unsigned long flags;
@@ -1217,14 +1249,14 @@
 					local_irq_restore(flags);
 					printk(KERN_INFO "Enabling old style K6 write allocation for %d Mb\n",
 						mbytes);
-					
 				}
 				break;
 			}
-			if (c->x86_model == 8 || c->x86_model == 9 || c->x86_model == 13)
-			{
+
+			if ((c->x86_model == 8 && c->x86_mask >7) ||
+			     c->x86_model == 9 || c->x86_model == 13) {
 				/* The more serious chips .. */
-				
+
 				if(mbytes>4092)
 					mbytes=4092;
 
@@ -1241,10 +1273,8 @@
 				}
 
 				/*  Set MTRR capability flag if appropriate */
-				if ( (c->x86_model == 13) ||
-				     (c->x86_model == 9) ||
-				     ((c->x86_model == 8) && 
-				     (c->x86_mask >= 8)) )
+				if (c->x86_model == 13 || c->x86_model == 9 ||
+				   (c->x86_model == 8 && c->x86_mask >= 8))
 					set_bit(X86_FEATURE_K6_MTRR, &c->x86_capability);
 				break;
 			}
@@ -2301,14 +2331,14 @@
 }
 
 
-int __init x86_serial_nr_setup(char *s)
+static int __init x86_serial_nr_setup(char *s)
 {
 	disable_x86_serial_nr = 0;
 	return 1;
 }
 __setup("serialnumber", x86_serial_nr_setup);
 
-int __init x86_fxsr_setup(char * s)
+static int __init x86_fxsr_setup(char * s)
 {
 	disable_x86_fxsr = 1;
 	return 1;
@@ -2403,7 +2433,6 @@
    	        {
 			unsigned char ccr3, ccr4;
 			unsigned long flags;
-
 			printk(KERN_INFO "Enabling CPUID on Cyrix processor.\n");
 			local_irq_save(flags);
 			ccr3 = getCx86(CX86_CCR3);
@@ -2655,11 +2684,8 @@
 /*
  *	Get CPU information for use by the procfs.
  */
-
-int get_cpuinfo(char * buffer)
+static int show_cpuinfo(struct seq_file *m, void *v)
 {
-	char *p = buffer;
-
 	/* 
 	 * These flag bits must match the definitions in <asm/cpufeature.h>.
 	 * NULL means this bit is undefined or reserved; either way it doesn't
@@ -2693,75 +2719,88 @@
 		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 	};
-	struct cpuinfo_x86 *c = cpu_data;
-	int i, n;
+	struct cpuinfo_x86 *c = v;
+	int i, n = c - cpu_data;
+	int fpu_exception;
 
-	for (n = 0; n < NR_CPUS; n++, c++) {
-		int fpu_exception;
 #ifdef CONFIG_SMP
-		if (!(cpu_online_map & (1<<n)))
-			continue;
+	if (!(cpu_online_map & (1<<n)))
+		return 0;
 #endif
-		/* Stupid hack */
-		if (p - buffer > (3*PAGE_SIZE)/4)
-			break;
+	seq_printf(m, "processor\t: %d\n"
+		"vendor_id\t: %s\n"
+		"cpu family\t: %d\n"
+		"model\t\t: %d\n"
+		"model name\t: %s\n",
+		n,
+		c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
+		c->x86,
+		c->x86_model,
+		c->x86_model_id[0] ? c->x86_model_id : "unknown");
 
-		p += sprintf(p,"processor\t: %d\n"
-			"vendor_id\t: %s\n"
-			"cpu family\t: %d\n"
-			"model\t\t: %d\n"
-			"model name\t: %s\n",
-			n,
-			c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
-			c->x86,
-			c->x86_model,
-			c->x86_model_id[0] ? c->x86_model_id : "unknown");
+	if (c->x86_mask || c->cpuid_level >= 0)
+		seq_printf(m, "stepping\t: %d\n", c->x86_mask);
+	else
+		seq_printf(m, "stepping\t: unknown\n");
 
-		if (c->x86_mask || c->cpuid_level >= 0)
-			p += sprintf(p, "stepping\t: %d\n", c->x86_mask);
-		else
-			p += sprintf(p, "stepping\t: unknown\n");
+	if ( test_bit(X86_FEATURE_TSC, &c->x86_capability) ) {
+		seq_printf(m, "cpu MHz\t\t: %lu.%03lu\n",
+			cpu_khz / 1000, (cpu_khz % 1000));
+	}
 
-		if ( test_bit(X86_FEATURE_TSC, &c->x86_capability) ) {
-			p += sprintf(p, "cpu MHz\t\t: %lu.%03lu\n",
-				cpu_khz / 1000, (cpu_khz % 1000));
-		}
+	/* Cache size */
+	if (c->x86_cache_size >= 0)
+		seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
+	
+	/* We use exception 16 if we have hardware math and we've either seen it or the CPU claims it is internal */
+	fpu_exception = c->hard_math && (ignore_irq13 || cpu_has_fpu);
+	seq_printf(m, "fdiv_bug\t: %s\n"
+			"hlt_bug\t\t: %s\n"
+			"f00f_bug\t: %s\n"
+			"coma_bug\t: %s\n"
+			"fpu\t\t: %s\n"
+			"fpu_exception\t: %s\n"
+			"cpuid level\t: %d\n"
+			"wp\t\t: %s\n"
+			"flags\t\t:",
+		     c->fdiv_bug ? "yes" : "no",
+		     c->hlt_works_ok ? "no" : "yes",
+		     c->f00f_bug ? "yes" : "no",
+		     c->coma_bug ? "yes" : "no",
+		     c->hard_math ? "yes" : "no",
+		     fpu_exception ? "yes" : "no",
+		     c->cpuid_level,
+		     c->wp_works_ok ? "yes" : "no");
+
+	for ( i = 0 ; i < 32*NCAPINTS ; i++ )
+		if ( test_bit(i, &c->x86_capability) &&
+		     x86_cap_flags[i] != NULL )
+			seq_printf(m, " %s", x86_cap_flags[i]);
+
+	seq_printf(m, "\nbogomips\t: %lu.%02lu\n\n",
+		     c->loops_per_jiffy/(500000/HZ),
+		     (c->loops_per_jiffy/(5000/HZ)) % 100);
+	return 0;
+}
 
-		/* Cache size */
-		if (c->x86_cache_size >= 0)
-			p += sprintf(p, "cache size\t: %d KB\n", c->x86_cache_size);
-		
-		/* We use exception 16 if we have hardware math and we've either seen it or the CPU claims it is internal */
-		fpu_exception = c->hard_math && (ignore_irq13 || cpu_has_fpu);
-		p += sprintf(p, "fdiv_bug\t: %s\n"
-			        "hlt_bug\t\t: %s\n"
-			        "f00f_bug\t: %s\n"
-			        "coma_bug\t: %s\n"
-			        "fpu\t\t: %s\n"
-			        "fpu_exception\t: %s\n"
-			        "cpuid level\t: %d\n"
-			        "wp\t\t: %s\n"
-			        "flags\t\t:",
-			     c->fdiv_bug ? "yes" : "no",
-			     c->hlt_works_ok ? "no" : "yes",
-			     c->f00f_bug ? "yes" : "no",
-			     c->coma_bug ? "yes" : "no",
-			     c->hard_math ? "yes" : "no",
-			     fpu_exception ? "yes" : "no",
-			     c->cpuid_level,
-			     c->wp_works_ok ? "yes" : "no");
-
-		for ( i = 0 ; i < 32*NCAPINTS ; i++ )
-			if ( test_bit(i, &c->x86_capability) &&
-			     x86_cap_flags[i] != NULL )
-				p += sprintf(p, " %s", x86_cap_flags[i]);
-
-		p += sprintf(p, "\nbogomips\t: %lu.%02lu\n\n",
-			     c->loops_per_jiffy/(500000/HZ),
-			     (c->loops_per_jiffy/(5000/HZ)) % 100);
-	}
-	return p - buffer;
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	return *pos < NR_CPUS ? cpu_data + *pos : NULL;
+}
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+static void c_stop(struct seq_file *m, void *v)
+{
 }
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
 
 unsigned long cpu_initialized __initdata = 0;
 
@@ -2834,6 +2873,53 @@
 	stts();
 }
 
+/*
+ *	Early probe support logic for ppro memory erratum #50
+ *
+ *	This is called before we do cpu ident work
+ */
+ 
+int __init ppro_with_ram_bug(void)
+{
+	char vendor_id[16];
+	int ident;
+
+	/* Must have CPUID */
+	if(!have_cpuid_p())
+		return 0;
+	if(cpuid_eax(0)<1)
+		return 0;
+	
+	/* Must be Intel */
+	cpuid(0, &ident, 
+		(int *)&vendor_id[0],
+		(int *)&vendor_id[8],
+		(int *)&vendor_id[4]);
+	
+	if(memcmp(vendor_id, "IntelInside", 12))
+		return 0;
+	
+	ident = cpuid_eax(1);
+
+	/* Model 6 */
+
+	if(((ident>>8)&15)!=6)
+		return 0;
+	
+	/* Pentium Pro */
+
+	if(((ident>>4)&15)!=1)
+		return 0;
+	
+	if((ident&15) < 8)
+	{
+		printk(KERN_INFO "Pentium Pro with Errata#50 detected. Taking evasive action.\n");
+		return 1;
+	}
+	printk(KERN_INFO "Your Pentium Pro seems ok.\n");
+	return 0;
+}
+	
 /*
  * Local Variables:
  * mode:c
diff -u --recursive --new-file v2.4.14/linux/arch/i386/kernel/time.c linux/arch/i386/kernel/time.c
--- v2.4.14/linux/arch/i386/kernel/time.c	Sun Sep 23 11:40:55 2001
+++ linux/arch/i386/kernel/time.c	Sun Nov 11 10:20:21 2001
@@ -519,6 +519,7 @@
 	unsigned int year, mon, day, hour, min, sec;
 	int i;
 
+	spin_lock(&rtc_lock);
 	/* The Linux interpretation of the CMOS clock register contents:
 	 * When the Update-In-Progress (UIP) flag goes from 1 to 0, the
 	 * RTC registers show the second which has precisely just started.
@@ -548,6 +549,7 @@
 	    BCD_TO_BIN(mon);
 	    BCD_TO_BIN(year);
 	  }
+	spin_unlock(&rtc_lock);
 	if ((year += 1900) < 1970)
 		year += 100;
 	return mktime(year, mon, day, hour, min, sec);
diff -u --recursive --new-file v2.4.14/linux/arch/i386/lib/usercopy.c linux/arch/i386/lib/usercopy.c
--- v2.4.14/linux/arch/i386/lib/usercopy.c	Sun Sep 23 11:40:55 2001
+++ linux/arch/i386/lib/usercopy.c	Fri Nov  9 13:58:02 2001
@@ -165,6 +165,8 @@
 	unsigned long res, tmp;
 
 	__asm__ __volatile__(
+		"	testl %0, %0\n"
+		"	jz 3f\n"
 		"	andl %0,%%ecx\n"
 		"0:	repne; scasb\n"
 		"	setne %%al\n"
@@ -173,6 +175,8 @@
 		"1:\n"
 		".section .fixup,\"ax\"\n"
 		"2:	xorl %%eax,%%eax\n"
+		"	jmp 1b\n"
+		"3:	movb $1,%%al\n"
 		"	jmp 1b\n"
 		".previous\n"
 		".section __ex_table,\"a\"\n"
diff -u --recursive --new-file v2.4.14/linux/arch/i386/math-emu/fpu_proto.h linux/arch/i386/math-emu/fpu_proto.h
--- v2.4.14/linux/arch/i386/math-emu/fpu_proto.h	Tue Dec  9 17:57:09 1997
+++ linux/arch/i386/math-emu/fpu_proto.h	Mon Nov 12 09:59:43 2001
@@ -53,7 +53,7 @@
 extern void fst_i_(void);
 extern void fstp_i(void);
 /* fpu_entry.c */
-extern void math_emulate(long arg);
+asmlinkage extern void math_emulate(long arg);
 extern void math_abort(struct info *info, unsigned int signal);
 /* fpu_etc.c */
 extern void FPU_etc(void);
diff -u --recursive --new-file v2.4.14/linux/arch/i386/mm/init.c linux/arch/i386/mm/init.c
--- v2.4.14/linux/arch/i386/mm/init.c	Sun Sep 23 11:40:55 2001
+++ linux/arch/i386/mm/init.c	Sun Nov 11 10:09:32 2001
@@ -439,13 +439,24 @@
 	return 0;
 }
 
+static inline int page_kills_ppro(unsigned long pagenr)
+{
+	if(pagenr >= 0x70000 && pagenr <= 0x7003F)
+		return 1;
+	return 0;
+}
+	
 void __init mem_init(void)
 {
+	extern int ppro_with_ram_bug(void);
 	int codesize, reservedpages, datasize, initsize;
 	int tmp;
+	int bad_ppro;
 
 	if (!mem_map)
 		BUG();
+	
+	bad_ppro = ppro_with_ram_bug();
 
 #ifdef CONFIG_HIGHMEM
 	highmem_start_page = mem_map + highstart_pfn;
@@ -473,6 +484,11 @@
 		struct page *page = mem_map + tmp;
 
 		if (!page_is_ram(tmp)) {
+			SetPageReserved(page);
+			continue;
+		}
+		if (bad_ppro && page_kills_ppro(tmp))
+		{
 			SetPageReserved(page);
 			continue;
 		}
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/Makefile linux/arch/ia64/Makefile
--- v2.4.14/linux/arch/ia64/Makefile	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/Makefile	Fri Nov  9 14:26:17 2001
@@ -17,13 +17,15 @@
 AFLAGS_KERNEL := -mconstant-gp
 EXTRA	=
 
-CFLAGS := $(CFLAGS) -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f10-f15,f32-f127 -falign-functions=32
+CFLAGS := $(CFLAGS) -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f10-f15,f32-f127 \
+	  -falign-functions=32
+# -ffunction-sections
 CFLAGS_KERNEL := -mconstant-gp
 
 GCC_VERSION=$(shell $(CROSS_COMPILE)$(HOSTCC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f1 -d'.')
 
 ifneq ($(GCC_VERSION),2)
-	CFLAGS += -frename-registers
+	CFLAGS += -frename-registers --param max-inline-insns=400
 endif
 
 ifeq ($(CONFIG_ITANIUM_BSTEP_SPECIFIC),y)
@@ -32,7 +34,7 @@
 
 ifdef CONFIG_IA64_GENERIC
 	CORE_FILES      :=      arch/$(ARCH)/hp/hp.a	\
-				arch/$(ARCH)/sn/sn.a	\
+				arch/$(ARCH)/sn/sn.o	\
 				arch/$(ARCH)/dig/dig.a	\
 				arch/$(ARCH)/sn/io/sgiio.o \
 				$(CORE_FILES)
@@ -52,15 +54,14 @@
                                 $(CORE_FILES)
 endif
 
-ifdef CONFIG_IA64_SGI_SN1
+ifdef CONFIG_IA64_SGI_SN
 	CFLAGS		+= -DBRINGUP
-        SUBDIRS         :=      arch/$(ARCH)/sn/sn1	\
-				arch/$(ARCH)/sn		\
+        SUBDIRS         :=      arch/$(ARCH)/sn/kernel	\
 				arch/$(ARCH)/sn/io	\
 				arch/$(ARCH)/sn/fprom	\
 				$(SUBDIRS)
-        CORE_FILES      :=      arch/$(ARCH)/sn/sn.a	\
-				arch/$(ARCH)/sn/io/sgiio.o\
+        CORE_FILES      :=      arch/$(ARCH)/sn/kernel/sn.o	\
+				arch/$(ARCH)/sn/io/sgiio.o	\
 				$(CORE_FILES)
 endif
 
@@ -105,7 +106,7 @@
 
 compressed: vmlinux
 	$(OBJCOPY) --strip-all vmlinux vmlinux-tmp
-	gzip -9 vmlinux-tmp
+	gzip vmlinux-tmp
 	mv vmlinux-tmp.gz vmlinux.gz
 
 rawboot:
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/config.in linux/arch/ia64/config.in
--- v2.4.14/linux/arch/ia64/config.in	Tue Oct 23 22:48:49 2001
+++ linux/arch/ia64/config.in	Fri Nov  9 14:26:17 2001
@@ -28,6 +28,7 @@
 
 if [ "$CONFIG_IA64_HP_SIM" = "n" ]; then
   define_bool CONFIG_ACPI y
+  define_bool CONFIG_ACPI_EFI y
   define_bool CONFIG_ACPI_INTERPRETER y
   define_bool CONFIG_ACPI_KERNEL_CONFIG y
 fi
@@ -40,7 +41,8 @@
 	"generic		CONFIG_IA64_GENERIC		\
 	 DIG-compliant		CONFIG_IA64_DIG			\
 	 HP-simulator		CONFIG_IA64_HP_SIM		\
-	 SGI-SN1		CONFIG_IA64_SGI_SN1" generic
+	 SGI-SN1		CONFIG_IA64_SGI_SN1		\
+	 SGI-SN2		CONFIG_IA64_SGI_SN2" generic
 
 choice 'Kernel page size'						\
 	"4KB			CONFIG_IA64_PAGE_SIZE_4KB		\
@@ -51,25 +53,6 @@
 if [ "$CONFIG_ITANIUM" = "y" ]; then
 	define_bool CONFIG_IA64_BRL_EMU y
 	bool '  Enable Itanium B-step specific code' CONFIG_ITANIUM_BSTEP_SPECIFIC
-	if [ "$CONFIG_ITANIUM_BSTEP_SPECIFIC" = "y" ]; then
-	  bool '   Enable Itanium B0-step specific code' CONFIG_ITANIUM_B0_SPECIFIC
-        fi
-	if [ "$CONFIG_ITANIUM_BSTEP_SPECIFIC" = "y" ]; then
-	  bool '   Enable Itanium B1-step specific code' CONFIG_ITANIUM_B1_SPECIFIC
-	fi
-	if [ "$CONFIG_ITANIUM_BSTEP_SPECIFIC" = "y" ]; then
-	  bool '   Enable Itanium B2-step specific code' CONFIG_ITANIUM_B2_SPECIFIC
-	fi
-	bool '  Enable Itanium C-step specific code' CONFIG_ITANIUM_CSTEP_SPECIFIC
-	if [ "$CONFIG_ITANIUM_CSTEP_SPECIFIC" = "y" ]; then
-	  bool '   Enable Itanium C0-step specific code' CONFIG_ITANIUM_C0_SPECIFIC
-	fi
-	if [ "$CONFIG_ITANIUM_B0_SPECIFIC" = "y" \
-	     -o "$CONFIG_ITANIUM_B1_SPECIFIC" = "y" -o "$CONFIG_ITANIUM_B2_SPECIFIC" = "y" ]; then
-	  define_bool CONFIG_ITANIUM_PTCG n
-	else
-	  define_bool CONFIG_ITANIUM_PTCG y
-	fi
 	if [ "$CONFIG_IA64_SGI_SN1" = "y" ]; then
 	  define_int CONFIG_IA64_L1_CACHE_SHIFT 7 # align cache-sensitive data to 128 bytes
 	else
@@ -78,7 +61,6 @@
 fi
 
 if [ "$CONFIG_MCKINLEY" = "y" ]; then
-	define_bool CONFIG_ITANIUM_PTCG y
 	define_int CONFIG_IA64_L1_CACHE_SHIFT 7
 	bool '  Enable McKinley A-step specific code' CONFIG_MCKINLEY_ASTEP_SPECIFIC
 	if [ "$CONFIG_MCKINLEY_ASTEP_SPECIFIC" = "y" ]; then
@@ -87,28 +69,32 @@
 fi
 
 if [ "$CONFIG_IA64_DIG" = "y" ]; then
-	bool '  Force interrupt redirection' CONFIG_IA64_HAVE_IRQREDIR
 	bool '  Enable IA-64 Machine Check Abort' CONFIG_IA64_MCA
 	define_bool CONFIG_PM y
 fi
 
-if [ "$CONFIG_IA64_SGI_SN1" = "y" ]; then
-	bool '  Enable SGI Medusa Simulator Support' CONFIG_IA64_SGI_SN1_SIM
-	define_bool CONFIG_DEVFS_DEBUG y
+if [ "$CONFIG_IA64_SGI_SN1" = "y" ] || [ "$CONFIG_IA64_SGI_SN2" = "y" ]; then
+	define_bool CONFIG_IA64_SGI_SN y
+	bool '  Enable extra debugging code' CONFIG_IA64_SGI_SN_DEBUG n
+	bool '  Enable SGI Medusa Simulator Support' CONFIG_IA64_SGI_SN_SIM
+	bool '  Enable autotest (llsc). Option to run cache test instead of booting' \
+			CONFIG_IA64_SGI_AUTOTEST n
 	define_bool CONFIG_DEVFS_FS y
-	define_bool CONFIG_IA64_BRL_EMU y
+	if [ "$CONFIG_DEVFS_FS" = "y" ]; then
+	  bool '    Enable DEVFS Debug Code' CONFIG_DEVFS_DEBUG n
+	fi
+	bool '  Enable protocol mode for the L1 console' CONFIG_SERIAL_SGI_L1_PROTOCOL y
+	define_bool CONFIG_DISCONTIGMEM y
 	define_bool CONFIG_IA64_MCA y
-	define_bool CONFIG_ITANIUM y
-	define_bool CONFIG_SGI_IOC3_ETH y
+	define_bool CONFIG_NUMA y
 	define_bool CONFIG_PERCPU_IRQ y
-	define_int  CONFIG_CACHE_LINE_SHIFT 7
-	bool '  Enable DISCONTIGMEM support' CONFIG_DISCONTIGMEM
-	bool '	Enable NUMA support' CONFIG_NUMA
+	tristate '  PCIBA support' CONFIG_PCIBA
 fi
 
 define_bool CONFIG_KCORE_ELF y	# On IA-64, we always want an ELF /proc/kcore.
 
 bool 'SMP support' CONFIG_SMP
+tristate 'Support running of Linux/x86 binaries' CONFIG_IA32_SUPPORT
 bool 'Performance monitor support' CONFIG_PERFMON
 tristate '/proc/pal support' CONFIG_IA64_PALINFO
 tristate '/proc/efi/vars support' CONFIG_EFI_VARS
@@ -270,19 +256,23 @@
 mainmenu_option next_comment
 comment 'Kernel hacking'
 
-#bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
-if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Kernel support for IA-32 emulation' CONFIG_IA32_SUPPORT
-  tristate 'Kernel FP software completion' CONFIG_MATHEMU
-else
-  define_bool CONFIG_MATHEMU y
+choice 'Physical memory granularity'				\
+	"16MB			CONFIG_IA64_GRANULE_16MB	\
+	 64MB			CONFIG_IA64_GRANULE_64MB" 64MB
+
+bool 'Kernel debugging' CONFIG_DEBUG_KERNEL
+if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
+   bool '  Print possible IA64 hazards to console' CONFIG_IA64_PRINT_HAZARDS
+   bool '  Disable VHPT' CONFIG_DISABLE_VHPT
+   bool '  Magic SysRq key' CONFIG_MAGIC_SYSRQ
+
+# early printk is currently broken for SMP: the secondary processors get stuck...
+#   bool '  Early printk support (requires VGA!)' CONFIG_IA64_EARLY_PRINTK
+
+   bool '  Debug memory allocations' CONFIG_DEBUG_SLAB
+   bool '  Spinlock debugging' CONFIG_DEBUG_SPINLOCK
+   bool '  Turn on compare-and-exchange bug checking (slow!)' CONFIG_IA64_DEBUG_CMPXCHG
+   bool '  Turn on irq debug checks (slow!)' CONFIG_IA64_DEBUG_IRQ
 fi
-
-bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
-bool 'Early printk support (requires VGA!)' CONFIG_IA64_EARLY_PRINTK
-bool 'Turn on compare-and-exchange bug checking (slow!)' CONFIG_IA64_DEBUG_CMPXCHG
-bool 'Turn on irq debug checks (slow!)' CONFIG_IA64_DEBUG_IRQ
-bool 'Print possible IA64 hazards to console' CONFIG_IA64_PRINT_HAZARDS
-bool 'Disable VHPT' CONFIG_DISABLE_VHPT
 
 endmenu
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/defconfig linux/arch/ia64/defconfig
--- v2.4.14/linux/arch/ia64/defconfig	Thu Jun 22 07:09:44 2000
+++ linux/arch/ia64/defconfig	Fri Nov  9 14:26:17 2001
@@ -3,47 +3,125 @@
 #
 
 #
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODVERSIONS=y
+# CONFIG_KMOD is not set
+
+#
 # General setup
 #
 CONFIG_IA64=y
 # CONFIG_ISA is not set
+# CONFIG_EISA is not set
+# CONFIG_MCA is not set
 # CONFIG_SBUS is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_ACPI=y
+CONFIG_ACPI_EFI=y
+CONFIG_ACPI_INTERPRETER=y
+CONFIG_ACPI_KERNEL_CONFIG=y
+CONFIG_ITANIUM=y
+# CONFIG_MCKINLEY is not set
 # CONFIG_IA64_GENERIC is not set
-CONFIG_IA64_HP_SIM=y
-# CONFIG_IA64_SGI_SN1_SIM is not set
-# CONFIG_IA64_DIG is not set
+CONFIG_IA64_DIG=y
+# CONFIG_IA64_HP_SIM is not set
+# CONFIG_IA64_SGI_SN1 is not set
+# CONFIG_IA64_SGI_SN2 is not set
 # CONFIG_IA64_PAGE_SIZE_4KB is not set
 # CONFIG_IA64_PAGE_SIZE_8KB is not set
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
+CONFIG_IA64_BRL_EMU=y
+# CONFIG_ITANIUM_BSTEP_SPECIFIC is not set
+CONFIG_IA64_L1_CACHE_SHIFT=6
+CONFIG_IA64_MCA=y
+CONFIG_PM=y
 CONFIG_KCORE_ELF=y
-# CONFIG_SMP is not set
-# CONFIG_PERFMON is not set
-# CONFIG_NET is not set
-# CONFIG_SYSVIPC is not set
+CONFIG_SMP=y
+CONFIG_IA32_SUPPORT=y
+CONFIG_PERFMON=y
+CONFIG_IA64_PALINFO=y
+CONFIG_EFI_VARS=y
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_SYSCTL is not set
-# CONFIG_BINFMT_ELF is not set
+CONFIG_SYSCTL=y
+CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_BUSMGR is not set
+# CONFIG_ACPI_SYS is not set
+# CONFIG_ACPI_CPU is not set
+# CONFIG_ACPI_BUTTON is not set
+# CONFIG_ACPI_AC is not set
+# CONFIG_ACPI_EC is not set
+# CONFIG_ACPI_CMBATT is not set
+# CONFIG_ACPI_THERMAL is not set
 CONFIG_PCI=y
 CONFIG_PCI_NAMES=y
 # CONFIG_HOTPLUG is not set
 # CONFIG_PCMCIA is not set
 
 #
-# Code maturity level options
+# Parallel port support
 #
-CONFIG_EXPERIMENTAL=y
+# CONFIG_PARPORT is not set
 
 #
-# Loadable module support
+# Networking options
 #
-# CONFIG_MODULES is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+CONFIG_FILTER=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+
+#
+#  
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
 
 #
-# Parallel port support
+# QoS and/or fair queueing
 #
-# CONFIG_PARPORT is not set
+# CONFIG_NET_SCHED is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
 
 #
 # Plug and Play configuration
@@ -58,14 +136,12 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
-
-#
-# Additional Block Devices
-#
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
 
 #
 # I2O device support
@@ -73,10 +149,23 @@
 # CONFIG_I2O is not set
 # CONFIG_I2O_PCI is not set
 # CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
 # CONFIG_I2O_SCSI is not set
 # CONFIG_I2O_PROC is not set
 
 #
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_MD_MULTIPATH is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
 # ATA/IDE/MFM/RLL support
 #
 CONFIG_IDE=y
@@ -92,12 +181,21 @@
 # CONFIG_BLK_DEV_HD_IDE is not set
 # CONFIG_BLK_DEV_HD is not set
 CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_IDEDISK_MULTI_MODE=y
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
 # CONFIG_BLK_DEV_IDECS is not set
 CONFIG_BLK_DEV_IDECD=y
 # CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
+CONFIG_BLK_DEV_IDEFLOPPY=y
+CONFIG_BLK_DEV_IDESCSI=y
 
 #
 # IDE chipset support/bugfixes
@@ -109,45 +207,208 @@
 CONFIG_BLK_DEV_IDEPCI=y
 CONFIG_IDEPCI_SHARE_IRQ=y
 CONFIG_BLK_DEV_IDEDMA_PCI=y
+CONFIG_BLK_DEV_ADMA=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_PCI_AUTO is not set
 CONFIG_BLK_DEV_IDEDMA=y
-CONFIG_IDEDMA_PCI_EXPERIMENTAL=y
 # CONFIG_IDEDMA_PCI_WIP is not set
 # CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set
-# CONFIG_BLK_DEV_AEC6210 is not set
-# CONFIG_AEC6210_TUNING is not set
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_AEC62XX_TUNING is not set
 # CONFIG_BLK_DEV_ALI15X3 is not set
 # CONFIG_WDC_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD7409 is not set
-# CONFIG_AMD7409_OVERRIDE is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_AMD74XX_OVERRIDE is not set
 # CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_CMD64X_RAID is not set
 # CONFIG_BLK_DEV_CY82C693 is not set
 # CONFIG_BLK_DEV_CS5530 is not set
 # CONFIG_BLK_DEV_HPT34X is not set
 # CONFIG_HPT34X_AUTODMA is not set
 # CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_HPT366_FIP is not set
-# CONFIG_HPT366_MODE3 is not set
 CONFIG_BLK_DEV_PIIX=y
-CONFIG_PIIX_TUNING=y
+# CONFIG_PIIX_TUNING is not set
 # CONFIG_BLK_DEV_NS87415 is not set
 # CONFIG_BLK_DEV_OPTI621 is not set
 # CONFIG_BLK_DEV_PDC202XX is not set
 # CONFIG_PDC202XX_BURST is not set
-# CONFIG_PDC202XX_MASTER is not set
+# CONFIG_PDC202XX_FORCE is not set
+# CONFIG_BLK_DEV_SVWKS is not set
 # CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
 # CONFIG_IDE_CHIPSETS is not set
-CONFIG_IDEDMA_AUTO=y
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_IDEDMA_IVB is not set
+# CONFIG_DMA_NONPCI is not set
 CONFIG_BLK_DEV_IDE_MODES=y
+# CONFIG_BLK_DEV_ATARAID is not set
+# CONFIG_BLK_DEV_ATARAID_PDC is not set
+# CONFIG_BLK_DEV_ATARAID_HPT is not set
 
 #
 # SCSI support
 #
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_SD_EXTRA_DEVS=40
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_DEBUG_QUEUES=y
+# CONFIG_SCSI_MULTI_LUN is not set
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AHA1740 is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_MEGARAID is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_CPQFCTS is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_DMA 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_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_NCR53C7xx is not set
+# CONFIG_SCSI_NCR53C8XX is not set
+# CONFIG_SCSI_SYM53C8XX is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PCI2000 is not set
+# CONFIG_SCSI_PCI2220I is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+CONFIG_SCSI_QLOGIC_1280=y
+# CONFIG_SCSI_QLOGIC_QLA2100 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+CONFIG_DUMMY=y
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_SUNLANCE is not set
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNBMAC is not set
+# CONFIG_SUNQE is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_APRICOT is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_TULIP is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_DGRS is not set
+# CONFIG_DM9102 is not set
+CONFIG_EEPRO100=y
+# CONFIG_LNE390 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+# CONFIG_NE3210 is not set
+# CONFIG_ES3210 is not set
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
 
 #
 # Amateur Radio support
@@ -165,13 +426,28 @@
 # CONFIG_CD_NO_IDESCSI is not set
 
 #
+# Input core support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_KEYBDEV=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+
+#
 # Character devices
 #
-# CONFIG_VT is not set
-# CONFIG_SERIAL is not set
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_SERIAL=y
+CONFIG_SERIAL_CONSOLE=y
+# CONFIG_SERIAL_ACPI is not set
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_UNIX98_PTYS is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
 
 #
 # I2C support
@@ -182,26 +458,55 @@
 # Mice
 #
 # CONFIG_BUSMOUSE is not set
-# CONFIG_MOUSE is not set
+CONFIG_MOUSE=y
+CONFIG_PSMOUSE=y
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_INPUT_GAMEPORT is not set
+# CONFIG_INPUT_NS558 is not set
+# CONFIG_INPUT_LIGHTNING is not set
+# CONFIG_INPUT_PCIGAME is not set
+# CONFIG_INPUT_CS461X is not set
+# CONFIG_INPUT_EMU10K1 is not set
+CONFIG_INPUT_SERIO=y
+CONFIG_INPUT_SERPORT=y
 
 #
 # Joysticks
 #
-# CONFIG_JOYSTICK is not set
+# CONFIG_INPUT_ANALOG is not set
+# CONFIG_INPUT_A3D is not set
+# CONFIG_INPUT_ADI is not set
+# CONFIG_INPUT_COBRA is not set
+# CONFIG_INPUT_GF2K is not set
+# CONFIG_INPUT_GRIP is not set
+# CONFIG_INPUT_INTERACT is not set
+# CONFIG_INPUT_TMDC is not set
+# CONFIG_INPUT_SIDEWINDER is not set
+# CONFIG_INPUT_IFORCE_USB is not set
+# CONFIG_INPUT_IFORCE_232 is not set
+# CONFIG_INPUT_WARRIOR is not set
+# CONFIG_INPUT_MAGELLAN is not set
+# CONFIG_INPUT_SPACEORB is not set
+# CONFIG_INPUT_SPACEBALL is not set
+# CONFIG_INPUT_STINGER is not set
+# CONFIG_INPUT_DB9 is not set
+# CONFIG_INPUT_GAMECON is not set
+# CONFIG_INPUT_TURBOGRAFX is not set
 # CONFIG_QIC02_TAPE is not set
 
 #
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 CONFIG_EFI_RTC=y
-
-#
-# Video For Linux
-#
-# CONFIG_VIDEO_DEV is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -210,69 +515,366 @@
 # Ftape, the floppy tape device driver
 #
 # CONFIG_FTAPE is not set
-# CONFIG_DRM is not set
-# CONFIG_DRM_TDFX is not set
-# CONFIG_AGP is not set
+CONFIG_AGP=y
+# CONFIG_AGP_INTEL is not set
+CONFIG_AGP_I460=y
+# CONFIG_AGP_I810 is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_AGP_AMD is not set
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_ALI is not set
+# CONFIG_AGP_SWORKS is not set
+CONFIG_DRM=y
+# CONFIG_DRM_NEW is not set
+CONFIG_DRM_OLD=y
+CONFIG_DRM40_TDFX=y
+# CONFIG_DRM40_GAMMA is not set
+# CONFIG_DRM40_R128 is not set
+# CONFIG_DRM40_RADEON is not set
+# CONFIG_DRM40_I810 is not set
+# CONFIG_DRM40_MGA is not set
 
 #
-# USB support
+# Multimedia devices
+#
+CONFIG_VIDEO_DEV=y
+
+#
+# Video For Linux
 #
-# CONFIG_USB is not set
+CONFIG_VIDEO_PROC_FS=y
+# CONFIG_I2C_PARPORT is not set
+
+#
+# Video Adapters
+#
+# CONFIG_VIDEO_PMS is not set
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_TUNER_3036 is not set
+# CONFIG_VIDEO_STRADIS is not set
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_VIDEO_ZR36120 is not set
+# CONFIG_VIDEO_MEYE is not set
+
+#
+# Radio Adapters
+#
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_GEMTEK is not set
+# CONFIG_RADIO_GEMTEK_PCI is not set
+# CONFIG_RADIO_MAXIRADIO is not set
+# CONFIG_RADIO_MAESTRO is not set
+# CONFIG_RADIO_MIROPCM20 is not set
+# CONFIG_RADIO_MIROPCM20_RDS is not set
+# CONFIG_RADIO_SF16FMI is not set
+# CONFIG_RADIO_TERRATEC is not set
+# CONFIG_RADIO_TRUST is not set
+# CONFIG_RADIO_TYPHOON is not set
+# CONFIG_RADIO_ZOLTRIX is not set
 
 #
 # File systems
 #
 # CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS_FS=y
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
-# CONFIG_FAT_FS is not set
-# CONFIG_MSDOS_FS is not set
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
 # CONFIG_UMSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
+CONFIG_VFAT_FS=y
 # CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
-# CONFIG_ISO9660_FS is not set
+# CONFIG_TMPFS is not set
+# CONFIG_RAMFS is not set
+CONFIG_ISO9660_FS=y
 # CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
-# CONFIG_PROC_FS is not set
+CONFIG_PROC_FS=y
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVFS_MOUNT is not set
 # CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS is not set
+CONFIG_DEVPTS_FS=y
 # CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
 # CONFIG_ROMFS_FS is not set
-# CONFIG_EXT2_FS is not set
+CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
 # CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_ROOT_NFS is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+# CONFIG_ZISOFS_FS is not set
+# CONFIG_ZLIB_FS_INFLATE is not set
 
 #
 # Partition Types
 #
-# CONFIG_PARTITION_ADVANCED is not set
+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_NLS is not set
-# CONFIG_NLS is not set
+# 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_EFI_PARTITION=y
+# CONFIG_DEVFS_GUID 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_SMB_NLS is not set
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+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_1251 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
+
+#
+# Console drivers
+#
+CONFIG_VGA_CONSOLE=y
+
+#
+# Frame-buffer support
+#
+# CONFIG_FB is not set
 
 #
 # Sound
 #
-# CONFIG_SOUND is not set
+CONFIG_SOUND=y
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_MIDI_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+CONFIG_SOUND_CS4281=y
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_MIDI_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
+
+#
+# USB support
+#
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_LONG_TIMEOUT is not set
+
+#
+# USB Controllers
+#
+CONFIG_USB_UHCI=m
+# CONFIG_USB_UHCI_ALT is not set
+# CONFIG_USB_OHCI is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_STORAGE_DEBUG 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_SDDR09 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=m
+CONFIG_USB_HIDDEV=y
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_WACOM is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_PWC is not set
+# CONFIG_USB_SE401 is not set
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_CDCETHER is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_SERIAL_GENERIC is not set
+# CONFIG_USB_SERIAL_BELKIN is not set
+# CONFIG_USB_SERIAL_WHITEHEAT is not set
+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+# CONFIG_USB_SERIAL_EMPEG is not set
+# CONFIG_USB_SERIAL_FTDI_SIO is not set
+# CONFIG_USB_SERIAL_VISOR is not set
+# CONFIG_USB_SERIAL_IR is not set
+# CONFIG_USB_SERIAL_EDGEPORT is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
+# CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_PL2303 is not set
+# CONFIG_USB_SERIAL_CYBERJACK is not set
+# CONFIG_USB_SERIAL_XIRCOM is not set
+# CONFIG_USB_SERIAL_OMNINET is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
 
 #
 # Kernel hacking
 #
-# CONFIG_IA32_SUPPORT is not set
-# CONFIG_MATHEMU is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_IA64_EARLY_PRINTK is not set
+# CONFIG_IA64_GRANULE_16MB is not set
+CONFIG_IA64_GRANULE_64MB=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_IA64_PRINT_HAZARDS=y
+# CONFIG_DISABLE_VHPT is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_IA64_DEBUG_CMPXCHG is not set
 # CONFIG_IA64_DEBUG_IRQ is not set
-# CONFIG_IA64_PRINT_HAZARDS is not set
-# CONFIG_KDB is not set
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/binfmt_elf32.c linux/arch/ia64/ia32/binfmt_elf32.c
--- v2.4.14/linux/arch/ia64/ia32/binfmt_elf32.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/ia32/binfmt_elf32.c	Fri Nov  9 14:26:17 2001
@@ -3,10 +3,11 @@
  *
  * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com>
  * Copyright (C) 2001 Hewlett-Packard Co
- * Copyright (C) 2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * 06/16/00	A. Mallick	initialize csd/ssd/tssd/cflg for ia32_load_state
  * 04/13/01	D. Mosberger	dropped saving tssd in ar.k1---it's not needed
+ * 09/14/01	D. Mosberger	fixed memory management for gdt/tss page
  */
 #include <linux/config.h>
 
@@ -41,65 +42,59 @@
 extern void ia64_elf32_init (struct pt_regs *regs);
 extern void put_dirty_page (struct task_struct * tsk, struct page *page, unsigned long address);
 
+static void elf32_set_personality (void);
+
 #define ELF_PLAT_INIT(_r)		ia64_elf32_init(_r)
 #define setup_arg_pages(bprm)		ia32_setup_arg_pages(bprm)
-#define elf_map				elf_map32
+#define elf_map				elf32_map
+#define SET_PERSONALITY(ex, ibcs2)	elf32_set_personality()
 
 /* Ugly but avoids duplication */
 #include "../../../fs/binfmt_elf.c"
 
-/* Global descriptor table */
-unsigned long *ia32_gdt_table, *ia32_tss;
+extern struct page *ia32_shared_page[];
+extern unsigned long *ia32_gdt;
 
 struct page *
-put_shared_page (struct task_struct * tsk, struct page *page, unsigned long address)
+ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int no_share)
 {
-	pgd_t * pgd;
-	pmd_t * pmd;
-	pte_t * pte;
-
-	if (page_count(page) != 1)
-		printk("mem_map disagrees with %p at %08lx\n", (void *) page, address);
+	struct page *pg = ia32_shared_page[(address - vma->vm_start)/PAGE_SIZE];
 
-	pgd = pgd_offset(tsk->mm, address);
-
-	spin_lock(&tsk->mm->page_table_lock);
-	{
-		pmd = pmd_alloc(tsk->mm, pgd, address);
-		if (!pmd)
-			goto out;
-		pte = pte_alloc(tsk->mm, pmd, address);
-		if (!pte)
-			goto out;
-		if (!pte_none(*pte))
-			goto out;
-		flush_page_to_ram(page);
-		set_pte(pte, pte_mkwrite(mk_pte(page, PAGE_SHARED)));
-	}
-	spin_unlock(&tsk->mm->page_table_lock);
-	/* no need for flush_tlb */
-	return page;
-
-  out:
-	spin_unlock(&tsk->mm->page_table_lock);
-	__free_page(page);
-	return 0;
+	get_page(pg);
+	return pg;
 }
 
+static struct vm_operations_struct ia32_shared_page_vm_ops = {
+	nopage:	ia32_install_shared_page
+};
+
 void
 ia64_elf32_init (struct pt_regs *regs)
 {
 	struct vm_area_struct *vma;
-	int nr;
 
 	/*
 	 * Map GDT and TSS below 4GB, where the processor can find them.  We need to map
 	 * it with privilege level 3 because the IVE uses non-privileged accesses to these
 	 * tables.  IA-32 segmentation is used to protect against IA-32 accesses to them.
 	 */
-	put_shared_page(current, virt_to_page(ia32_gdt_table), IA32_GDT_OFFSET);
-	if (PAGE_SHIFT <= IA32_PAGE_SHIFT)
-		put_shared_page(current, virt_to_page(ia32_tss), IA32_TSS_OFFSET);
+	vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+	if (vma) {
+		vma->vm_mm = current->mm;
+		vma->vm_start = IA32_GDT_OFFSET;
+		vma->vm_end = vma->vm_start + max(PAGE_SIZE, 2*IA32_PAGE_SIZE);
+		vma->vm_page_prot = PAGE_SHARED;
+		vma->vm_flags = VM_READ|VM_MAYREAD;
+		vma->vm_ops = &ia32_shared_page_vm_ops;
+		vma->vm_pgoff = 0;
+		vma->vm_file = NULL;
+		vma->vm_private_data = NULL;
+		down_write(&current->mm->mmap_sem);
+		{
+			insert_vm_struct(current->mm, vma);
+		}
+		up_write(&current->mm->mmap_sem);
+	}
 
 	/*
 	 * Install LDT as anonymous memory.  This gives us all-zero segment descriptors
@@ -116,34 +111,13 @@
 		vma->vm_pgoff = 0;
 		vma->vm_file = NULL;
 		vma->vm_private_data = NULL;
-		insert_vm_struct(current->mm, vma);
+		down_write(&current->mm->mmap_sem);
+		{
+			insert_vm_struct(current->mm, vma);
+		}
+		up_write(&current->mm->mmap_sem);
 	}
 
-	nr = smp_processor_id();
-
-	current->thread.map_base  = IA32_PAGE_OFFSET/3;
-	current->thread.task_size = IA32_PAGE_OFFSET;	/* use what Linux/x86 uses... */
-	set_fs(USER_DS);				/* set addr limit for new TASK_SIZE */
-
-	/* Setup the segment selectors */
-	regs->r16 = (__USER_DS << 16) | __USER_DS; /* ES == DS, GS, FS are zero */
-	regs->r17 = (__USER_DS << 16) | __USER_CS; /* SS, CS; ia32_load_state() sets TSS and LDT */
-
-	/* Setup the segment descriptors */
-	regs->r24 = IA32_SEG_UNSCRAMBLE(ia32_gdt_table[__USER_DS >> 3]);	/* ESD */
-	regs->r27 = IA32_SEG_UNSCRAMBLE(ia32_gdt_table[__USER_DS >> 3]);	/* DSD */
-	regs->r28 = 0;								/* FSD (null) */
-	regs->r29 = 0;								/* GSD (null) */
-	regs->r30 = IA32_SEG_UNSCRAMBLE(ia32_gdt_table[_LDT(nr)]);		/* LDTD */
-
-	/*
-	 * Setup GDTD.  Note: GDTD is the descrambled version of the pseudo-descriptor
-	 * format defined by Figure 3-11 "Pseudo-Descriptor Format" in the IA-32
-	 * architecture manual.
-	 */
-	regs->r31 = IA32_SEG_UNSCRAMBLE(IA32_SEG_DESCRIPTOR(IA32_GDT_OFFSET, IA32_PAGE_SIZE - 1, 0,
-							    0, 0, 0, 0, 0, 0));
-
 	ia64_psr(regs)->ac = 0;		/* turn off alignment checking */
 	regs->loadrs = 0;
 	/*
@@ -164,10 +138,19 @@
 	current->thread.fcr = IA32_FCR_DEFAULT;
 	current->thread.fir = 0;
 	current->thread.fdr = 0;
-	current->thread.csd = IA32_SEG_UNSCRAMBLE(ia32_gdt_table[__USER_CS >> 3]);
-	current->thread.ssd = IA32_SEG_UNSCRAMBLE(ia32_gdt_table[__USER_DS >> 3]);
-	current->thread.tssd = IA32_SEG_UNSCRAMBLE(ia32_gdt_table[_TSS(nr)]);
 
+	/*
+	 * Setup GDTD.  Note: GDTD is the descrambled version of the pseudo-descriptor
+	 * format defined by Figure 3-11 "Pseudo-Descriptor Format" in the IA-32
+	 * architecture manual.
+	 */
+	regs->r31 = IA32_SEG_UNSCRAMBLE(IA32_SEG_DESCRIPTOR(IA32_GDT_OFFSET, IA32_PAGE_SIZE - 1, 0,
+							    0, 0, 0, 0, 0, 0));
+	/* Setup the segment selectors */
+	regs->r16 = (__USER_DS << 16) | __USER_DS; /* ES == DS, GS, FS are zero */
+	regs->r17 = (__USER_DS << 16) | __USER_CS; /* SS, CS; ia32_load_state() sets TSS and LDT */
+
+	ia32_load_segment_descriptors(current);
 	ia32_load_state(current);
 }
 
@@ -189,6 +172,7 @@
 	if (!mpnt)
 		return -ENOMEM;
 
+	down_write(&current->mm->mmap_sem);
 	{
 		mpnt->vm_mm = current->mm;
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
@@ -204,54 +188,32 @@
 	}
 
 	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
-		if (bprm->page[i]) {
-			put_dirty_page(current,bprm->page[i],stack_base);
+		struct page *page = bprm->page[i];
+		if (page) {
+			bprm->page[i] = NULL;
+			put_dirty_page(current, page, stack_base);
 		}
 		stack_base += PAGE_SIZE;
 	}
+	up_write(&current->mm->mmap_sem);
 
 	return 0;
 }
 
-static unsigned long
-ia32_mm_addr (unsigned long addr)
+static void
+elf32_set_personality (void)
 {
-	struct vm_area_struct *vma;
-
-	if ((vma = find_vma(current->mm, addr)) == NULL)
-		return ELF_PAGESTART(addr);
-	if (vma->vm_start > addr)
-		return ELF_PAGESTART(addr);
-	return ELF_PAGEALIGN(addr);
+	set_personality(PER_LINUX32);
+	current->thread.map_base  = IA32_PAGE_OFFSET/3;
+	current->thread.task_size = IA32_PAGE_OFFSET;	/* use what Linux/x86 uses... */
+	set_fs(USER_DS);				/* set addr limit for new TASK_SIZE */
 }
 
-/*
- *  Normally we would do an `mmap' to map in the process's text section.
- *  This doesn't work with IA32 processes as the ELF file might specify
- *  a non page size aligned address.  Instead we will just allocate
- *  memory and read the data in from the file.  Slightly less efficient
- *  but it works.
- */
-extern long ia32_do_mmap (struct file *filep, unsigned int len, unsigned int prot,
-			  unsigned int flags, unsigned int fd, unsigned int offset);
-
 static unsigned long
-elf_map32 (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type)
+elf32_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type)
 {
-	unsigned long retval;
+	unsigned long pgoff = (eppnt->p_vaddr) & ~IA32_PAGE_MASK;
 
-	if (eppnt->p_memsz >= (1UL<<32) || addr > (1UL<<32) - eppnt->p_memsz)
-		return -EINVAL;
-
-	/*
-	 *  Make sure the elf interpreter doesn't get loaded at location 0
-	 *    so that NULL pointers correctly cause segfaults.
-	 */
-	if (addr == 0)
-		addr += PAGE_SIZE;
-	set_brk(ia32_mm_addr(addr), addr + eppnt->p_memsz);
-	memset((char *) addr + eppnt->p_filesz, 0, eppnt->p_memsz - eppnt->p_filesz);
-	kernel_read(filep, eppnt->p_offset, (char *) addr, eppnt->p_filesz);
-	retval = (unsigned long) addr;
-	return retval;
+	return ia32_do_mmap(filep, (addr & IA32_PAGE_MASK), eppnt->p_filesz + pgoff, prot, type,
+			    eppnt->p_offset - pgoff);
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/ia32_entry.S linux/arch/ia64/ia32/ia32_entry.S
--- v2.4.14/linux/arch/ia64/ia32/ia32_entry.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/ia32/ia32_entry.S	Fri Nov  9 14:26:17 2001
@@ -2,7 +2,7 @@
 #include <asm/offsets.h>
 #include <asm/signal.h>
 
-#include "../kernel/entry.h"
+#include "../kernel/minstate.h"
 
 	/*
 	 * execve() is special because in case of success, we need to
@@ -14,13 +14,13 @@
 	alloc loc1=ar.pfs,3,2,4,0
 	mov loc0=rp
 	.body
-	mov out0=in0			// filename
+	zxt4 out0=in0			// filename
 	;;				// stop bit between alloc and call
-	mov out1=in1			// argv
-	mov out2=in2			// envp
+	zxt4 out1=in1			// argv
+	zxt4 out2=in2			// envp
 	add out3=16,sp			// regs
 	br.call.sptk.few rp=sys32_execve
-1:	cmp4.ge p6,p0=r8,r0
+1:	cmp.ge p6,p0=r8,r0
 	mov ar.pfs=loc1			// restore ar.pfs
 	;;
 (p6)	mov ar.pfs=r0			// clear ar.pfs in case of success
@@ -29,31 +29,80 @@
 	br.ret.sptk.few rp
 END(ia32_execve)
 
-	//
-	// Get possibly unaligned sigmask argument into an aligned
-	//   kernel buffer
-GLOBAL_ENTRY(ia32_rt_sigsuspend)
-	// We'll cheat and not do an alloc here since we are ultimately
-	// going to do a simple branch to the IA64 sys_rt_sigsuspend.
-	// r32 is still the first argument which is the signal mask.
-	// We copy this 4-byte aligned value to an 8-byte aligned buffer
-	// in the task structure and then jump to the IA64 code.
+ENTRY(ia32_clone)
+	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
+	alloc r16=ar.pfs,2,2,4,0
+	DO_SAVE_SWITCH_STACK
+	mov loc0=rp
+	mov loc1=r16				// save ar.pfs across do_fork
+	.body
+	zxt4 out1=in1				// newsp
+	mov out3=0				// stacksize
+	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
+	zxt4 out0=in0				// out0 = clone_flags
+	br.call.sptk.many rp=do_fork
+.ret0:	.restore sp
+	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
+	mov ar.pfs=loc1
+	mov rp=loc0
+	br.ret.sptk.many rp
+END(ia32_clone)
 
-	EX(.Lfail, ld4 r2=[r32],4)		// load low part of sigmask
-	;;
-	EX(.Lfail, ld4 r3=[r32])		// load high part of sigmask
-	adds r32=IA64_TASK_THREAD_SIGMASK_OFFSET,r13
-	;;
-	st8 [r32]=r2
-	adds r10=IA64_TASK_THREAD_SIGMASK_OFFSET+4,r13
+ENTRY(sys32_rt_sigsuspend)
+	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
+	alloc loc1=ar.pfs,8,2,3,0		// preserve all eight input regs
+	mov loc0=rp
+	mov out0=in0				// mask
+	mov out1=in1				// sigsetsize
+	mov out2=sp				// out2 = &sigscratch
+	.fframe 16
+	adds sp=-16,sp				// allocate dummy "sigscratch"
 	;;
+	.body
+	br.call.sptk.many rp=ia32_rt_sigsuspend
+1:	.restore sp
+	adds sp=16,sp
+	mov rp=loc0
+	mov ar.pfs=loc1
+	br.ret.sptk.many rp
+END(sys32_rt_sigsuspend)
 
-	st4 [r10]=r3
-	br.cond.sptk.many sys_rt_sigsuspend
-
-.Lfail:	br.ret.sptk.many rp	// failed to read sigmask
-END(ia32_rt_sigsuspend)
+ENTRY(sys32_sigsuspend)
+	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
+	alloc loc1=ar.pfs,8,2,3,0		// preserve all eight input regs
+	mov loc0=rp
+	mov out0=in2				// mask (first two args are ignored)
+	;;
+	mov out1=sp				// out1 = &sigscratch
+	.fframe 16
+	adds sp=-16,sp				// allocate dummy "sigscratch"
+	.body
+	br.call.sptk.many rp=ia32_sigsuspend
+1:	.restore sp
+	adds sp=16,sp
+	mov rp=loc0
+	mov ar.pfs=loc1
+	br.ret.sptk.many rp
+END(sys32_sigsuspend)
 
+GLOBAL_ENTRY(ia32_ret_from_clone)
+	PT_REGS_UNWIND_INFO(0)
+	/*
+	 * We need to call schedule_tail() to complete the scheduling process.
+	 * Called by ia64_switch_to after do_fork()->copy_thread().  r8 contains the
+	 * address of the previously executing task.
+	 */
+	br.call.sptk.many rp=ia64_invoke_schedule_tail
+.ret1:	adds r2=IA64_TASK_PTRACE_OFFSET,r13
+	;;
+	ld8 r2=[r2]
+	;;
+	mov r8=0
+	tbit.nz p6,p0=r2,PT_TRACESYS_BIT
+(p6)	br.cond.spnt .ia32_strace_check_retval
+	;;					// prevent RAW on r8
+END(ia32_ret_from_clone)
+	// fall thrugh
 GLOBAL_ENTRY(ia32_ret_from_syscall)
 	PT_REGS_UNWIND_INFO(0)
 
@@ -72,20 +121,25 @@
 	// manipulate ar.pfs.
 	//
 	// Input:
-	//	r15 = syscall number
-	//	b6  = syscall entry point
+	//	r8 = syscall number
+	//	b6 = syscall entry point
 	//
 GLOBAL_ENTRY(ia32_trace_syscall)
 	PT_REGS_UNWIND_INFO(0)
+	mov r3=-38
+	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp
+	;;
+	st8 [r2]=r3				// initialize return code to -ENOSYS
 	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args
-.ret0:	br.call.sptk.few rp=b6			// do the syscall
-.ret1:	cmp.lt p6,p0=r8,r0			// syscall failed?
+.ret2:	br.call.sptk.few rp=b6			// do the syscall
+.ia32_strace_check_retval:
+	cmp.lt p6,p0=r8,r0			// syscall failed?
 	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp	// r2 = &pt_regs.r8
 	;;
 	st8.spill [r2]=r8			// store return value in slot for r8
 	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch return value
-.ret2:	alloc r2=ar.pfs,0,0,0,0			// drop the syscall argument frame
-	br.cond.sptk.many ia64_leave_kernel	// rp MUST be != ia64_leave_kernel!
+.ret4:	alloc r2=ar.pfs,0,0,0,0			// drop the syscall argument frame
+	br.cond.sptk.many ia64_leave_kernel
 END(ia32_trace_syscall)
 
 GLOBAL_ENTRY(sys32_vfork)
@@ -110,7 +164,7 @@
 	mov out3=0
 	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
 	br.call.sptk.few rp=do_fork
-.ret3:	mov ar.pfs=loc1
+.ret5:	mov ar.pfs=loc1
 	.restore sp
 	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
 	mov rp=loc0
@@ -137,21 +191,21 @@
 	data8 sys32_time
 	data8 sys_mknod
 	data8 sys_chmod		  /* 15 */
-	data8 sys_lchown
+	data8 sys_lchown	/* 16-bit version */
 	data8 sys32_ni_syscall	  /* old break syscall holder */
 	data8 sys32_ni_syscall
 	data8 sys32_lseek
 	data8 sys_getpid	  /* 20 */
 	data8 sys_mount
 	data8 sys_oldumount
-	data8 sys_setuid
-	data8 sys_getuid
+	data8 sys_setuid	/* 16-bit version */
+	data8 sys_getuid	/* 16-bit version */
 	data8 sys32_ni_syscall /* sys_stime is not supported on IA64 */  /* 25 */
 	data8 sys32_ptrace
 	data8 sys32_alarm
 	data8 sys32_ni_syscall
-	data8 sys_pause
-	data8 ia32_utime	  /* 30 */
+	data8 sys32_pause
+	data8 sys32_utime	  /* 30 */
 	data8 sys32_ni_syscall	  /* old stty syscall holder */
 	data8 sys32_ni_syscall	  /* old gtty syscall holder */
 	data8 sys_access
@@ -167,15 +221,15 @@
 	data8 sys32_times
 	data8 sys32_ni_syscall	  /* old prof syscall holder */
 	data8 sys_brk		  /* 45 */
-	data8 sys_setgid
-	data8 sys_getgid
+	data8 sys_setgid	/* 16-bit version */
+	data8 sys_getgid	/* 16-bit version */
 	data8 sys32_signal
-	data8 sys_geteuid
-	data8 sys_getegid	  /* 50 */
+	data8 sys_geteuid	/* 16-bit version */
+	data8 sys_getegid	/* 16-bit version */	  /* 50 */
 	data8 sys_acct
 	data8 sys_umount	  /* recycled never used phys( */
 	data8 sys32_ni_syscall	  /* old lock syscall holder */
-	data8 ia32_ioctl
+	data8 sys32_ioctl
 	data8 sys32_fcntl	  /* 55 */
 	data8 sys32_ni_syscall	  /* old mpx syscall holder */
 	data8 sys_setpgid
@@ -191,19 +245,19 @@
 	data8 sys32_sigaction
 	data8 sys32_ni_syscall
 	data8 sys32_ni_syscall
-	data8 sys_setreuid	  /* 70 */
-	data8 sys_setregid
-	data8 sys32_ni_syscall
-	data8 sys_sigpending
+	data8 sys_setreuid	/* 16-bit version */	  /* 70 */
+	data8 sys_setregid	/* 16-bit version */
+	data8 sys32_sigsuspend
+	data8 sys32_sigpending
 	data8 sys_sethostname
 	data8 sys32_setrlimit	  /* 75 */
-	data8 sys32_getrlimit
+	data8 sys32_old_getrlimit
 	data8 sys32_getrusage
 	data8 sys32_gettimeofday
 	data8 sys32_settimeofday
-	data8 sys_getgroups	  /* 80 */
-	data8 sys_setgroups
-	data8 old_select
+	data8 sys32_getgroups16	  /* 80 */
+	data8 sys32_setgroups16
+	data8 sys32_old_select
 	data8 sys_symlink
 	data8 sys32_ni_syscall
 	data8 sys_readlink	  /* 85 */
@@ -212,17 +266,17 @@
 	data8 sys_reboot
 	data8 sys32_readdir
 	data8 sys32_mmap	  /* 90 */
-	data8 sys_munmap
+	data8 sys32_munmap
 	data8 sys_truncate
 	data8 sys_ftruncate
 	data8 sys_fchmod
-	data8 sys_fchown	  /* 95 */
+	data8 sys_fchown	/* 16-bit version */	  /* 95 */
 	data8 sys_getpriority
 	data8 sys_setpriority
 	data8 sys32_ni_syscall	  /* old profil syscall holder */
 	data8 sys32_statfs
 	data8 sys32_fstatfs	  /* 100 */
-	data8 sys_ioperm
+	data8 sys32_ioperm
 	data8 sys32_socketcall
 	data8 sys_syslog
 	data8 sys32_setitimer
@@ -231,36 +285,36 @@
 	data8 sys32_newlstat
 	data8 sys32_newfstat
 	data8 sys32_ni_syscall
-	data8 sys_iopl		  /* 110 */
+	data8 sys32_iopl		  /* 110 */
 	data8 sys_vhangup
 	data8 sys32_ni_syscall		/* used to be sys_idle */
 	data8 sys32_ni_syscall
 	data8 sys32_wait4
 	data8 sys_swapoff	  /* 115 */
-	data8 sys_sysinfo
+	data8 sys32_sysinfo
 	data8 sys32_ipc
 	data8 sys_fsync
 	data8 sys32_sigreturn
-	data8 sys_clone		  /* 120 */
+	data8 ia32_clone	  /* 120 */
 	data8 sys_setdomainname
 	data8 sys32_newuname
 	data8 sys32_modify_ldt
-	data8 sys_adjtimex
+	data8 sys32_ni_syscall	/* adjtimex */
 	data8 sys32_mprotect	  /* 125 */
-	data8 sys_sigprocmask
-	data8 sys_create_module
-	data8 sys_init_module
-	data8 sys_delete_module
-	data8 sys_get_kernel_syms  /* 130 */
-	data8 sys_quotactl
+	data8 sys32_sigprocmask
+	data8 sys32_ni_syscall	/* create_module */
+	data8 sys32_ni_syscall	/* init_module */
+	data8 sys32_ni_syscall	/* delete_module */
+	data8 sys32_ni_syscall	/* get_kernel_syms */  /* 130 */
+	data8 sys32_quotactl
 	data8 sys_getpgid
 	data8 sys_fchdir
-	data8 sys_bdflush
-	data8 sys_sysfs		  /* 135 */
-	data8 sys_personality
+	data8 sys32_ni_syscall	/* sys_bdflush */
+	data8 sys_sysfs		/* 135 */
+	data8 sys32_personality
 	data8 sys32_ni_syscall	  /* for afs_syscall */
-	data8 sys_setfsuid
-	data8 sys_setfsgid
+	data8 sys_setfsuid	/* 16-bit version */
+	data8 sys_setfsgid	/* 16-bit version */
 	data8 sys_llseek	  /* 140 */
 	data8 sys32_getdents
 	data8 sys32_select
@@ -282,66 +336,73 @@
 	data8 sys_sched_yield
 	data8 sys_sched_get_priority_max
 	data8 sys_sched_get_priority_min	 /* 160 */
-	data8 sys_sched_rr_get_interval
+	data8 sys32_sched_rr_get_interval
 	data8 sys32_nanosleep
 	data8 sys_mremap
-	data8 sys_setresuid
-	data8 sys32_getresuid	  /* 165 */
-	data8 sys_vm86
-	data8 sys_query_module
+	data8 sys_setresuid	/* 16-bit version */
+	data8 sys32_getresuid16	/* 16-bit version */	  /* 165 */
+	data8 sys32_ni_syscall	/* vm86 */
+	data8 sys32_ni_syscall	/* sys_query_module */
 	data8 sys_poll
-	data8 sys_nfsservctl
+	data8 sys32_ni_syscall	/* nfsservctl */
 	data8 sys_setresgid	  /* 170 */
-	data8 sys32_getresgid
+	data8 sys32_getresgid16
 	data8 sys_prctl
 	data8 sys32_rt_sigreturn
 	data8 sys32_rt_sigaction
 	data8 sys32_rt_sigprocmask /* 175 */
 	data8 sys_rt_sigpending
-	data8 sys_rt_sigtimedwait
-	data8 sys_rt_sigqueueinfo
-	data8 ia32_rt_sigsuspend
-	data8 sys_pread		  /* 180 */
-	data8 sys_pwrite
-	data8 sys_chown
+	data8 sys32_rt_sigtimedwait
+	data8 sys32_rt_sigqueueinfo
+	data8 sys32_rt_sigsuspend
+	data8 sys32_pread	  /* 180 */
+	data8 sys32_pwrite
+	data8 sys_chown	/* 16-bit version */
 	data8 sys_getcwd
 	data8 sys_capget
 	data8 sys_capset	  /* 185 */
 	data8 sys32_sigaltstack
-	data8 sys_sendfile
+	data8 sys32_sendfile
 	data8 sys32_ni_syscall		  /* streams1 */
 	data8 sys32_ni_syscall		  /* streams2 */
 	data8 sys32_vfork	  /* 190 */
+	data8 sys32_getrlimit
+	data8 sys32_mmap2
+	data8 sys32_truncate64
+	data8 sys32_ftruncate64
+	data8 sys32_stat64	  /* 195 */
+	data8 sys32_lstat64
+	data8 sys32_fstat64
+	data8 sys_lchown
+	data8 sys_getuid
+	data8 sys_getgid	  /* 200 */
+	data8 sys_geteuid
+	data8 sys_getegid
+	data8 sys_setreuid
+	data8 sys_setregid
+	data8 sys_getgroups	  /* 205 */
+	data8 sys_setgroups
+	data8 sys_fchown
+	data8 sys_setresuid
+	data8 sys_getresuid
+	data8 sys_setresgid	  /* 210 */
+	data8 sys_getresgid
+	data8 sys_chown
+	data8 sys_setuid
+	data8 sys_setgid
+	data8 sys_setfsuid	  /* 215 */
+	data8 sys_setfsgid
+	data8 sys_pivot_root
+	data8 sys_mincore
+	data8 sys_madvise
+	data8 sys_getdents64	  /* 220 */
+	data8 sys32_fcntl64
+	data8 sys_ni_syscall		/* reserved for TUX */
+	data8 sys_ni_syscall		/* reserved for Security */
+	data8 sys_gettid
+	data8 sys_readahead	  /* 225 */
 	data8 sys_ni_syscall
 	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	  /* 195 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	  /* 200 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	  /* 205 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	  /* 210 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	  /* 215 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	  /* 220 */
 	data8 sys_ni_syscall
 	data8 sys_ni_syscall
 	/*
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/ia32_ioctl.c linux/arch/ia64/ia32/ia32_ioctl.c
--- v2.4.14/linux/arch/ia64/ia32/ia32_ioctl.c	Thu Jan  4 12:50:17 2001
+++ linux/arch/ia64/ia32/ia32_ioctl.c	Fri Nov  9 14:26:17 2001
@@ -3,6 +3,8 @@
  *
  * Copyright (C) 2000 VA Linux Co
  * Copyright (C) 2000 Don Dugger <n0ano@valinux.com>
+ * Copyright (C) 2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 
 #include <linux/types.h>
@@ -22,8 +24,12 @@
 #include <linux/if_ppp.h>
 #include <linux/ixjuser.h>
 #include <linux/i2o-dev.h>
+
+#include <asm/ia32.h>
+
 #include <../drivers/char/drm/drm.h>
 
+
 #define IOCTL_NR(a)	((a) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
 
 #define DO_IOCTL(fd, cmd, arg) ({			\
@@ -36,179 +42,200 @@
 	_ret;						\
 })
 
-#define P(i)	((void *)(long)(i))
-
+#define P(i)	((void *)(unsigned long)(i))
 
 asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
 
-asmlinkage long ia32_ioctl(unsigned int fd, unsigned int cmd, unsigned int arg)
+static long
+put_dirent32 (struct dirent *d, struct linux32_dirent *d32)
+{
+	size_t namelen = strlen(d->d_name);
+
+	return (put_user(d->d_ino, &d32->d_ino)
+		|| put_user(d->d_off, &d32->d_off)
+		|| put_user(d->d_reclen, &d32->d_reclen)
+		|| copy_to_user(d32->d_name, d->d_name, namelen + 1));
+}
+
+asmlinkage long
+sys32_ioctl (unsigned int fd, unsigned int cmd, unsigned int arg)
 {
 	long ret;
 
 	switch (IOCTL_NR(cmd)) {
-
-	case IOCTL_NR(DRM_IOCTL_VERSION):
-		{
-			drm_version_t ver;
-			struct {
-				int	version_major;
-				int	version_minor;
-				int	version_patchlevel;
-				unsigned int name_len;
-				unsigned int name; /* pointer */
-				unsigned int date_len;
-				unsigned int date; /* pointer */
-				unsigned int desc_len;
-				unsigned int desc; /* pointer */
-			} ver32;
-
-			if (copy_from_user(&ver32, P(arg), sizeof(ver32)))
-				return -EFAULT;
-			ver.name_len = ver32.name_len;
-			ver.name = P(ver32.name);
-			ver.date_len = ver32.date_len;
-			ver.date = P(ver32.date);
-			ver.desc_len = ver32.desc_len;
-			ver.desc = P(ver32.desc);
-			ret = DO_IOCTL(fd, cmd, &ver);
-			if (ret >= 0) {
-				ver32.version_major = ver.version_major;
-				ver32.version_minor = ver.version_minor;
-				ver32.version_patchlevel = ver.version_patchlevel;
-				ver32.name_len = ver.name_len;
-				ver32.date_len = ver.date_len;
-				ver32.desc_len = ver.desc_len;
-				if (copy_to_user(P(arg), &ver32, sizeof(ver32)))
-					return -EFAULT;
-			}
-			return(ret);
-		}
-
-	case IOCTL_NR(DRM_IOCTL_GET_UNIQUE):
-		{
-			drm_unique_t un;
-			struct {
-				unsigned int unique_len;
-				unsigned int unique;
-			} un32;
-
-			if (copy_from_user(&un32, P(arg), sizeof(un32)))
-				return -EFAULT;
-			un.unique_len = un32.unique_len;
-			un.unique = P(un32.unique);
-			ret = DO_IOCTL(fd, cmd, &un);
-			if (ret >= 0) {
-				un32.unique_len = un.unique_len;
-				if (copy_to_user(P(arg), &un32, sizeof(un32)))
-					return -EFAULT;
-			}
-			return(ret);
-		}
-	case IOCTL_NR(DRM_IOCTL_SET_UNIQUE):
-	case IOCTL_NR(DRM_IOCTL_ADD_MAP):
-	case IOCTL_NR(DRM_IOCTL_ADD_BUFS):
-	case IOCTL_NR(DRM_IOCTL_MARK_BUFS):
-	case IOCTL_NR(DRM_IOCTL_INFO_BUFS):
-	case IOCTL_NR(DRM_IOCTL_MAP_BUFS):
-	case IOCTL_NR(DRM_IOCTL_FREE_BUFS):
-	case IOCTL_NR(DRM_IOCTL_ADD_CTX):
-	case IOCTL_NR(DRM_IOCTL_RM_CTX):
-	case IOCTL_NR(DRM_IOCTL_MOD_CTX):
-	case IOCTL_NR(DRM_IOCTL_GET_CTX):
-	case IOCTL_NR(DRM_IOCTL_SWITCH_CTX):
-	case IOCTL_NR(DRM_IOCTL_NEW_CTX):
-	case IOCTL_NR(DRM_IOCTL_RES_CTX):
-
-	case IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE):
-	case IOCTL_NR(DRM_IOCTL_AGP_RELEASE):
-	case IOCTL_NR(DRM_IOCTL_AGP_ENABLE):
-	case IOCTL_NR(DRM_IOCTL_AGP_INFO):
-	case IOCTL_NR(DRM_IOCTL_AGP_ALLOC):
-	case IOCTL_NR(DRM_IOCTL_AGP_FREE):
-	case IOCTL_NR(DRM_IOCTL_AGP_BIND):
-	case IOCTL_NR(DRM_IOCTL_AGP_UNBIND):
-
-	/* Mga specific ioctls */
-
-	case IOCTL_NR(DRM_IOCTL_MGA_INIT):
-
-	/* I810 specific ioctls */
-
-	case IOCTL_NR(DRM_IOCTL_I810_GETBUF):
-	case IOCTL_NR(DRM_IOCTL_I810_COPY):
-
-	/* Rage 128 specific ioctls */
-
-	case IOCTL_NR(DRM_IOCTL_R128_PACKET):
-
-	case IOCTL_NR(VFAT_IOCTL_READDIR_BOTH):
-	case IOCTL_NR(VFAT_IOCTL_READDIR_SHORT):
-	case IOCTL_NR(MTIOCGET):
-	case IOCTL_NR(MTIOCPOS):
-	case IOCTL_NR(MTIOCGETCONFIG):
-	case IOCTL_NR(MTIOCSETCONFIG):
-	case IOCTL_NR(PPPIOCSCOMPRESS):
-	case IOCTL_NR(PPPIOCGIDLE):
-	case IOCTL_NR(NCP_IOC_GET_FS_INFO_V2):
-	case IOCTL_NR(NCP_IOC_GETOBJECTNAME):
-	case IOCTL_NR(NCP_IOC_SETOBJECTNAME):
-	case IOCTL_NR(NCP_IOC_GETPRIVATEDATA):
-	case IOCTL_NR(NCP_IOC_SETPRIVATEDATA):
-	case IOCTL_NR(NCP_IOC_GETMOUNTUID2):
-	case IOCTL_NR(CAPI_MANUFACTURER_CMD):
-	case IOCTL_NR(VIDIOCGTUNER):
-	case IOCTL_NR(VIDIOCSTUNER):
-	case IOCTL_NR(VIDIOCGWIN):
-	case IOCTL_NR(VIDIOCSWIN):
-	case IOCTL_NR(VIDIOCGFBUF):
-	case IOCTL_NR(VIDIOCSFBUF):
-	case IOCTL_NR(MGSL_IOCSPARAMS):
-	case IOCTL_NR(MGSL_IOCGPARAMS):
-	case IOCTL_NR(ATM_GETNAMES):
-	case IOCTL_NR(ATM_GETLINKRATE):
-	case IOCTL_NR(ATM_GETTYPE):
-	case IOCTL_NR(ATM_GETESI):
-	case IOCTL_NR(ATM_GETADDR):
-	case IOCTL_NR(ATM_RSTADDR):
-	case IOCTL_NR(ATM_ADDADDR):
-	case IOCTL_NR(ATM_DELADDR):
-	case IOCTL_NR(ATM_GETCIRANGE):
-	case IOCTL_NR(ATM_SETCIRANGE):
-	case IOCTL_NR(ATM_SETESI):
-	case IOCTL_NR(ATM_SETESIF):
-	case IOCTL_NR(ATM_GETSTAT):
-	case IOCTL_NR(ATM_GETSTATZ):
-	case IOCTL_NR(ATM_GETLOOP):
-	case IOCTL_NR(ATM_SETLOOP):
-	case IOCTL_NR(ATM_QUERYLOOP):
-	case IOCTL_NR(ENI_SETMULT):
-	case IOCTL_NR(NS_GETPSTAT):
-	/* case IOCTL_NR(NS_SETBUFLEV): This is a duplicate case with ZATM_GETPOOLZ */
-	case IOCTL_NR(ZATM_GETPOOLZ):
-	case IOCTL_NR(ZATM_GETPOOL):
-	case IOCTL_NR(ZATM_SETPOOL):
-	case IOCTL_NR(ZATM_GETTHIST):
-	case IOCTL_NR(IDT77105_GETSTAT):
-	case IOCTL_NR(IDT77105_GETSTATZ):
-	case IOCTL_NR(IXJCTL_TONE_CADENCE):
-	case IOCTL_NR(IXJCTL_FRAMES_READ):
-	case IOCTL_NR(IXJCTL_FRAMES_WRITTEN):
-	case IOCTL_NR(IXJCTL_READ_WAIT):
-	case IOCTL_NR(IXJCTL_WRITE_WAIT):
-	case IOCTL_NR(IXJCTL_DRYBUFFER_READ):
-	case IOCTL_NR(I2OHRTGET):
-	case IOCTL_NR(I2OLCTGET):
-	case IOCTL_NR(I2OPARMSET):
-	case IOCTL_NR(I2OPARMGET):
-	case IOCTL_NR(I2OSWDL):
-	case IOCTL_NR(I2OSWUL):
-	case IOCTL_NR(I2OSWDEL):
-	case IOCTL_NR(I2OHTML):
+	      case IOCTL_NR(VFAT_IOCTL_READDIR_SHORT):
+	      case IOCTL_NR(VFAT_IOCTL_READDIR_BOTH): {
+		      struct linux32_dirent *d32 = P(arg);
+		      struct dirent d[2];
+
+		      ret = DO_IOCTL(fd, _IOR('r', _IOC_NR(cmd),
+					      struct dirent [2]),
+				     (unsigned long) d);
+		      if (ret < 0)
+			  return ret;
+
+		      if (put_dirent32(d, d32) || put_dirent32(d + 1, d32 + 1))
+			  return -EFAULT;
+
+		      return ret;
+	      }
+
+	      case IOCTL_NR(DRM_IOCTL_VERSION):
+	      {
+		      drm_version_t ver;
+		      struct {
+			      int	version_major;
+			      int	version_minor;
+			      int	version_patchlevel;
+			      unsigned int name_len;
+			      unsigned int name; /* pointer */
+			      unsigned int date_len;
+			      unsigned int date; /* pointer */
+			      unsigned int desc_len;
+			      unsigned int desc; /* pointer */
+		      } ver32;
+
+		      if (copy_from_user(&ver32, P(arg), sizeof(ver32)))
+			      return -EFAULT;
+		      ver.name_len = ver32.name_len;
+		      ver.name = P(ver32.name);
+		      ver.date_len = ver32.date_len;
+		      ver.date = P(ver32.date);
+		      ver.desc_len = ver32.desc_len;
+		      ver.desc = P(ver32.desc);
+		      ret = DO_IOCTL(fd, DRM_IOCTL_VERSION, &ver);
+		      if (ret >= 0) {
+			      ver32.version_major = ver.version_major;
+			      ver32.version_minor = ver.version_minor;
+			      ver32.version_patchlevel = ver.version_patchlevel;
+			      ver32.name_len = ver.name_len;
+			      ver32.date_len = ver.date_len;
+			      ver32.desc_len = ver.desc_len;
+			      if (copy_to_user(P(arg), &ver32, sizeof(ver32)))
+				      return -EFAULT;
+		      }
+		      return ret;
+	      }
+
+	      case IOCTL_NR(DRM_IOCTL_GET_UNIQUE):
+	      {
+		      drm_unique_t un;
+		      struct {
+			      unsigned int unique_len;
+			      unsigned int unique;
+		      } un32;
+
+		      if (copy_from_user(&un32, P(arg), sizeof(un32)))
+			      return -EFAULT;
+		      un.unique_len = un32.unique_len;
+		      un.unique = P(un32.unique);
+		      ret = DO_IOCTL(fd, DRM_IOCTL_GET_UNIQUE, &un);
+		      if (ret >= 0) {
+			      un32.unique_len = un.unique_len;
+			      if (copy_to_user(P(arg), &un32, sizeof(un32)))
+				      return -EFAULT;
+		      }
+		      return ret;
+	      }
+	      case IOCTL_NR(DRM_IOCTL_SET_UNIQUE):
+	      case IOCTL_NR(DRM_IOCTL_ADD_MAP):
+	      case IOCTL_NR(DRM_IOCTL_ADD_BUFS):
+	      case IOCTL_NR(DRM_IOCTL_MARK_BUFS):
+	      case IOCTL_NR(DRM_IOCTL_INFO_BUFS):
+	      case IOCTL_NR(DRM_IOCTL_MAP_BUFS):
+	      case IOCTL_NR(DRM_IOCTL_FREE_BUFS):
+	      case IOCTL_NR(DRM_IOCTL_ADD_CTX):
+	      case IOCTL_NR(DRM_IOCTL_RM_CTX):
+	      case IOCTL_NR(DRM_IOCTL_MOD_CTX):
+	      case IOCTL_NR(DRM_IOCTL_GET_CTX):
+	      case IOCTL_NR(DRM_IOCTL_SWITCH_CTX):
+	      case IOCTL_NR(DRM_IOCTL_NEW_CTX):
+	      case IOCTL_NR(DRM_IOCTL_RES_CTX):
+
+	      case IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE):
+	      case IOCTL_NR(DRM_IOCTL_AGP_RELEASE):
+	      case IOCTL_NR(DRM_IOCTL_AGP_ENABLE):
+	      case IOCTL_NR(DRM_IOCTL_AGP_INFO):
+	      case IOCTL_NR(DRM_IOCTL_AGP_ALLOC):
+	      case IOCTL_NR(DRM_IOCTL_AGP_FREE):
+	      case IOCTL_NR(DRM_IOCTL_AGP_BIND):
+	      case IOCTL_NR(DRM_IOCTL_AGP_UNBIND):
+
+		/* Mga specific ioctls */
+
+	      case IOCTL_NR(DRM_IOCTL_MGA_INIT):
+
+		/* I810 specific ioctls */
+
+	      case IOCTL_NR(DRM_IOCTL_I810_GETBUF):
+	      case IOCTL_NR(DRM_IOCTL_I810_COPY):
+
+	      case IOCTL_NR(MTIOCGET):
+	      case IOCTL_NR(MTIOCPOS):
+	      case IOCTL_NR(MTIOCGETCONFIG):
+	      case IOCTL_NR(MTIOCSETCONFIG):
+	      case IOCTL_NR(PPPIOCSCOMPRESS):
+	      case IOCTL_NR(PPPIOCGIDLE):
+	      case IOCTL_NR(NCP_IOC_GET_FS_INFO_V2):
+	      case IOCTL_NR(NCP_IOC_GETOBJECTNAME):
+	      case IOCTL_NR(NCP_IOC_SETOBJECTNAME):
+	      case IOCTL_NR(NCP_IOC_GETPRIVATEDATA):
+	      case IOCTL_NR(NCP_IOC_SETPRIVATEDATA):
+	      case IOCTL_NR(NCP_IOC_GETMOUNTUID2):
+	      case IOCTL_NR(CAPI_MANUFACTURER_CMD):
+	      case IOCTL_NR(VIDIOCGTUNER):
+	      case IOCTL_NR(VIDIOCSTUNER):
+	      case IOCTL_NR(VIDIOCGWIN):
+	      case IOCTL_NR(VIDIOCSWIN):
+	      case IOCTL_NR(VIDIOCGFBUF):
+	      case IOCTL_NR(VIDIOCSFBUF):
+	      case IOCTL_NR(MGSL_IOCSPARAMS):
+	      case IOCTL_NR(MGSL_IOCGPARAMS):
+	      case IOCTL_NR(ATM_GETNAMES):
+	      case IOCTL_NR(ATM_GETLINKRATE):
+	      case IOCTL_NR(ATM_GETTYPE):
+	      case IOCTL_NR(ATM_GETESI):
+	      case IOCTL_NR(ATM_GETADDR):
+	      case IOCTL_NR(ATM_RSTADDR):
+	      case IOCTL_NR(ATM_ADDADDR):
+	      case IOCTL_NR(ATM_DELADDR):
+	      case IOCTL_NR(ATM_GETCIRANGE):
+	      case IOCTL_NR(ATM_SETCIRANGE):
+	      case IOCTL_NR(ATM_SETESI):
+	      case IOCTL_NR(ATM_SETESIF):
+	      case IOCTL_NR(ATM_GETSTAT):
+	      case IOCTL_NR(ATM_GETSTATZ):
+	      case IOCTL_NR(ATM_GETLOOP):
+	      case IOCTL_NR(ATM_SETLOOP):
+	      case IOCTL_NR(ATM_QUERYLOOP):
+	      case IOCTL_NR(ENI_SETMULT):
+	      case IOCTL_NR(NS_GETPSTAT):
+		/* case IOCTL_NR(NS_SETBUFLEV): This is a duplicate case with ZATM_GETPOOLZ */
+	      case IOCTL_NR(ZATM_GETPOOLZ):
+	      case IOCTL_NR(ZATM_GETPOOL):
+	      case IOCTL_NR(ZATM_SETPOOL):
+	      case IOCTL_NR(ZATM_GETTHIST):
+	      case IOCTL_NR(IDT77105_GETSTAT):
+	      case IOCTL_NR(IDT77105_GETSTATZ):
+	      case IOCTL_NR(IXJCTL_TONE_CADENCE):
+	      case IOCTL_NR(IXJCTL_FRAMES_READ):
+	      case IOCTL_NR(IXJCTL_FRAMES_WRITTEN):
+	      case IOCTL_NR(IXJCTL_READ_WAIT):
+	      case IOCTL_NR(IXJCTL_WRITE_WAIT):
+	      case IOCTL_NR(IXJCTL_DRYBUFFER_READ):
+	      case IOCTL_NR(I2OHRTGET):
+	      case IOCTL_NR(I2OLCTGET):
+	      case IOCTL_NR(I2OPARMSET):
+	      case IOCTL_NR(I2OPARMGET):
+	      case IOCTL_NR(I2OSWDL):
+	      case IOCTL_NR(I2OSWUL):
+	      case IOCTL_NR(I2OSWDEL):
+	      case IOCTL_NR(I2OHTML):
 		break;
-	default:
-		return(sys_ioctl(fd, cmd, (unsigned long)arg));
+	      default:
+		return sys_ioctl(fd, cmd, (unsigned long)arg);
 
 	}
 	printk("%x:unimplemented IA32 ioctl system call\n", cmd);
-	return(-EINVAL);
+	return -EINVAL;
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/ia32_ldt.c linux/arch/ia64/ia32/ia32_ldt.c
--- v2.4.14/linux/arch/ia64/ia32/ia32_ldt.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/ia32/ia32_ldt.c	Fri Nov  9 14:26:17 2001
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2001 Hewlett-Packard Co
- * Copyright (C) 2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * Adapted from arch/i386/kernel/ldt.c
  */
@@ -16,6 +16,8 @@
 #include <asm/uaccess.h>
 #include <asm/ia32.h>
 
+#define P(p)	((void *) (unsigned long) (p))
+
 /*
  * read_ldt() is not really atomic - this is not a problem since synchronization of reads
  * and writes done to the LDT has to be assured by user-space anyway. Writes are atomic,
@@ -58,10 +60,30 @@
 }
 
 static int
+read_default_ldt (void * ptr, unsigned long bytecount)
+{
+	unsigned long size;
+	int err;
+
+	/* XXX fix me: should return equivalent of default_ldt[0] */
+	err = 0;
+	size = 8;
+	if (size > bytecount)
+		size = bytecount;
+
+	err = size;
+	if (clear_user(ptr, size))
+		err = -EFAULT;
+
+	return err;
+}
+
+static int
 write_ldt (void * ptr, unsigned long bytecount, int oldmode)
 {
 	struct ia32_modify_ldt_ldt_s ldt_info;
 	__u64 entry;
+	int ret;
 
 	if (bytecount != sizeof(ldt_info))
 		return -EINVAL;
@@ -97,23 +119,28 @@
 	 * memory, but we still need to guard against out-of-memory, hence we must use
 	 * put_user().
 	 */
-	return __put_user(entry, (__u64 *) IA32_LDT_OFFSET + ldt_info.entry_number);
+	ret = __put_user(entry, (__u64 *) IA32_LDT_OFFSET + ldt_info.entry_number);
+	ia32_load_segment_descriptors(current);
+	return ret;
 }
 
 asmlinkage int
-sys32_modify_ldt (int func, void *ptr, unsigned int bytecount)
+sys32_modify_ldt (int func, unsigned int ptr, unsigned int bytecount)
 {
 	int ret = -ENOSYS;
 
 	switch (func) {
 	      case 0:
-		ret = read_ldt(ptr, bytecount);
+		ret = read_ldt(P(ptr), bytecount);
 		break;
 	      case 1:
-		ret = write_ldt(ptr, bytecount, 1);
+		ret = write_ldt(P(ptr), bytecount, 1);
+		break;
+	      case 2:
+		ret = read_default_ldt(P(ptr), bytecount);
 		break;
 	      case 0x11:
-		ret = write_ldt(ptr, bytecount, 0);
+		ret = write_ldt(P(ptr), bytecount, 0);
 		break;
 	}
 	return ret;
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/ia32_signal.c linux/arch/ia64/ia32/ia32_signal.c
--- v2.4.14/linux/arch/ia64/ia32/ia32_signal.c	Mon Oct  9 17:54:53 2000
+++ linux/arch/ia64/ia32/ia32_signal.c	Fri Nov  9 14:26:17 2001
@@ -1,8 +1,8 @@
 /*
  * IA32 Architecture-specific signal handling support.
  *
- * Copyright (C) 1999 Hewlett-Packard Co
- * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1999, 2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com>
  * Copyright (C) 2000 VA Linux Co
  * Copyright (C) 2000 Don Dugger <n0ano@valinux.com>
@@ -13,6 +13,7 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/personality.h>
 #include <linux/ptrace.h>
 #include <linux/sched.h>
 #include <linux/signal.h>
@@ -28,9 +29,15 @@
 #include <asm/segment.h>
 #include <asm/ia32.h>
 
+#include "../kernel/sigframe.h"
+
+#define A(__x)		((unsigned long)(__x))
+
 #define DEBUG_SIG	0
 #define _BLOCKABLE	(~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
+#define __IA32_NR_sigreturn            119
+#define __IA32_NR_rt_sigreturn         173
 
 struct sigframe_ia32
 {
@@ -54,12 +61,51 @@
        char retcode[8];
 };
 
-static int
+int
+copy_siginfo_from_user32 (siginfo_t *to, siginfo_t32 *from)
+{
+	unsigned long tmp;
+	int err;
+
+	if (!access_ok(VERIFY_READ, from, sizeof(siginfo_t32)))
+		return -EFAULT;
+
+	err = __get_user(to->si_signo, &from->si_signo);
+	err |= __get_user(to->si_errno, &from->si_errno);
+	err |= __get_user(to->si_code, &from->si_code);
+
+	if (from->si_code < 0)
+		err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
+	else {
+		switch (from->si_code >> 16) {
+		      case __SI_CHLD >> 16:
+			err |= __get_user(to->si_utime, &from->si_utime);
+			err |= __get_user(to->si_stime, &from->si_stime);
+			err |= __get_user(to->si_status, &from->si_status);
+		      default:
+			err |= __get_user(to->si_pid, &from->si_pid);
+			err |= __get_user(to->si_uid, &from->si_uid);
+			break;
+		      case __SI_FAULT >> 16:
+			err |= __get_user(tmp, &from->si_addr);
+			to->si_addr = (void *) tmp;
+			break;
+		      case __SI_POLL >> 16:
+			err |= __get_user(to->si_band, &from->si_band);
+			err |= __get_user(to->si_fd, &from->si_fd);
+			break;
+			/* case __SI_RT: This is not generated by the kernel as of now.  */
+		}
+	}
+	return err;
+}
+
+int
 copy_siginfo_to_user32 (siginfo_t32 *to, siginfo_t *from)
 {
 	int err;
 
-	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
+	if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t32)))
 		return -EFAULT;
 
 	/* If you change siginfo_t structure, please be sure
@@ -97,110 +143,329 @@
 	return err;
 }
 
+static inline void
+sigact_set_handler (struct k_sigaction *sa, unsigned int handler, unsigned int restorer)
+{
+	if (handler + 1 <= 2)
+		/* SIG_DFL, SIG_IGN, or SIG_ERR: must sign-extend to 64-bits */
+		sa->sa.sa_handler = (__sighandler_t) A((int) handler);
+	else
+		sa->sa.sa_handler = (__sighandler_t) (((unsigned long) restorer << 32) | handler);
+}
 
+asmlinkage long
+ia32_rt_sigsuspend (sigset32_t *uset, unsigned int sigsetsize, struct sigscratch *scr)
+{
+	extern long ia64_do_signal (sigset_t *oldset, struct sigscratch *scr, long in_syscall);
+	sigset_t oldset, set;
 
-static int
-setup_sigcontext_ia32(struct sigcontext_ia32 *sc, struct _fpstate_ia32 *fpstate,
-                struct pt_regs *regs, unsigned long mask)
+	scr->scratch_unat = 0;	/* avoid leaking kernel bits to user level */
+	memset(&set, 0, sizeof(&set));
+
+	if (sigsetsize > sizeof(sigset_t))
+		return -EINVAL;
+
+	if (copy_from_user(&set.sig, &uset->sig, sigsetsize))
+		return -EFAULT;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+
+	spin_lock_irq(&current->sigmask_lock);
+	{
+		oldset = current->blocked;
+		current->blocked = set;
+		recalc_sigpending(current);
+	}
+	spin_unlock_irq(&current->sigmask_lock);
+
+	/*
+	 * The return below usually returns to the signal handler.  We need to pre-set the
+	 * correct error code here to ensure that the right values get saved in sigcontext
+	 * by ia64_do_signal.
+	 */
+	scr->pt.r8 = -EINTR;
+	while (1) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule();
+		if (ia64_do_signal(&oldset, scr, 1))
+			return -EINTR;
+	}
+}
+
+asmlinkage long
+ia32_sigsuspend (unsigned int mask, struct sigscratch *scr)
+{
+	return ia32_rt_sigsuspend((sigset32_t *)&mask, sizeof(mask), scr);
+}
+
+asmlinkage long
+sys32_signal (int sig, unsigned int handler)
+{
+	struct k_sigaction new_sa, old_sa;
+	int ret;
+
+	sigact_set_handler(&new_sa, handler, 0);
+	new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;
+
+	ret = do_sigaction(sig, &new_sa, &old_sa);
+
+	return ret ? ret : IA32_SA_HANDLER(&old_sa);
+}
+
+asmlinkage long
+sys32_rt_sigaction (int sig, struct sigaction32 *act,
+		    struct sigaction32 *oact, unsigned int sigsetsize)
+{
+	struct k_sigaction new_ka, old_ka;
+	unsigned int handler, restorer;
+	int ret;
+
+	/* XXX: Don't preclude handling different sized sigset_t's.  */
+	if (sigsetsize != sizeof(sigset32_t))
+		return -EINVAL;
+
+	if (act) {
+		ret = get_user(handler, &act->sa_handler);
+		ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
+		ret |= get_user(restorer, &act->sa_restorer);
+		ret |= copy_from_user(&new_ka.sa.sa_mask, &act->sa_mask, sizeof(sigset32_t));
+		if (ret)
+			return -EFAULT;
+
+		sigact_set_handler(&new_ka, handler, restorer);
+	}
+
+	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+
+	if (!ret && oact) {
+		ret = put_user(IA32_SA_HANDLER(&old_ka), &oact->sa_handler);
+		ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+		ret |= put_user(IA32_SA_RESTORER(&old_ka), &oact->sa_restorer);
+		ret |= copy_to_user(&oact->sa_mask, &old_ka.sa.sa_mask, sizeof(sigset32_t));
+	}
+	return ret;
+}
+
+
+extern asmlinkage long sys_rt_sigprocmask (int how, sigset_t *set, sigset_t *oset,
+					   size_t sigsetsize);
+
+asmlinkage long
+sys32_rt_sigprocmask (int how, sigset32_t *set, sigset32_t *oset, unsigned int sigsetsize)
+{
+	mm_segment_t old_fs = get_fs();
+	sigset_t s;
+	long ret;
+
+	if (sigsetsize > sizeof(s))
+		return -EINVAL;
+
+	if (set) {
+		memset(&s, 0, sizeof(s));
+		if (copy_from_user(&s.sig, set, sigsetsize))
+			return -EFAULT;
+	}
+	set_fs(KERNEL_DS);
+	ret = sys_rt_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL, sizeof(s));
+	set_fs(old_fs);
+	if (ret)
+		return ret;
+	if (oset) {
+		if (copy_to_user(oset, &s.sig, sigsetsize))
+			return -EFAULT;
+	}
+	return 0;
+}
+
+asmlinkage long
+sys32_sigprocmask (int how, unsigned int *set, unsigned int *oset)
 {
-       int  err = 0;
-       unsigned long flag;
+	return sys32_rt_sigprocmask(how, (sigset32_t *) set, (sigset32_t *) oset, sizeof(*set));
+}
 
-       err |= __put_user((regs->r16 >> 32) & 0xffff , (unsigned int *)&sc->fs);
-       err |= __put_user((regs->r16 >> 48) & 0xffff , (unsigned int *)&sc->gs);
+asmlinkage long
+sys32_rt_sigtimedwait (sigset32_t *uthese, siginfo_t32 *uinfo, struct timespec32 *uts,
+		       unsigned int sigsetsize)
+{
+	extern asmlinkage long sys_rt_sigtimedwait (const sigset_t *, siginfo_t *,
+						    const struct timespec *, size_t);
+	extern int copy_siginfo_to_user32 (siginfo_t32 *, siginfo_t *);
+	mm_segment_t old_fs = get_fs();
+	struct timespec t;
+	siginfo_t info;
+	sigset_t s;
+	int ret;
 
-       err |= __put_user((regs->r16 >> 56) & 0xffff, (unsigned int *)&sc->es);
-       err |= __put_user(regs->r16 & 0xffff, (unsigned int *)&sc->ds);
-       err |= __put_user(regs->r15, &sc->edi);
-       err |= __put_user(regs->r14, &sc->esi);
-       err |= __put_user(regs->r13, &sc->ebp);
-       err |= __put_user(regs->r12, &sc->esp);
-       err |= __put_user(regs->r11, &sc->ebx);
-       err |= __put_user(regs->r10, &sc->edx);
-       err |= __put_user(regs->r9, &sc->ecx);
-       err |= __put_user(regs->r8, &sc->eax);
+	if (copy_from_user(&s.sig, uthese, sizeof(sigset32_t)))
+		return -EFAULT;
+	if (uts) {
+		ret = get_user(t.tv_sec, &uts->tv_sec);
+		ret |= get_user(t.tv_nsec, &uts->tv_nsec);
+		if (ret)
+			return -EFAULT;
+	}
+	set_fs(KERNEL_DS);
+	ret = sys_rt_sigtimedwait(&s, &info, &t, sigsetsize);
+	set_fs(old_fs);
+	if (ret >= 0 && uinfo) {
+		if (copy_siginfo_to_user32(uinfo, &info))
+			return -EFAULT;
+	}
+	return ret;
+}
+
+asmlinkage long
+sys32_rt_sigqueueinfo (int pid, int sig, siginfo_t32 *uinfo)
+{
+	extern asmlinkage long sys_rt_sigqueueinfo (int, int, siginfo_t *);
+	extern int copy_siginfo_from_user32 (siginfo_t *to, siginfo_t32 *from);
+	mm_segment_t old_fs = get_fs();
+	siginfo_t info;
+	int ret;
+
+	if (copy_siginfo_from_user32(&info, uinfo))
+		return -EFAULT;
+	set_fs(KERNEL_DS);
+	ret = sys_rt_sigqueueinfo(pid, sig, &info);
+	set_fs(old_fs);
+	return ret;
+}
+
+asmlinkage long
+sys32_sigaction (int sig, struct old_sigaction32 *act, struct old_sigaction32 *oact)
+{
+	struct k_sigaction new_ka, old_ka;
+	unsigned int handler, restorer;
+	int ret;
+
+	if (act) {
+		old_sigset32_t mask;
+
+		ret = get_user(handler, &act->sa_handler);
+		ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
+		ret |= get_user(restorer, &act->sa_restorer);
+		ret |= get_user(mask, &act->sa_mask);
+		if (ret)
+			return ret;
+
+		sigact_set_handler(&new_ka, handler, restorer);
+		siginitset(&new_ka.sa.sa_mask, mask);
+	}
+
+	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+
+	if (!ret && oact) {
+		ret = put_user(IA32_SA_HANDLER(&old_ka), &oact->sa_handler);
+		ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+		ret |= put_user(IA32_SA_RESTORER(&old_ka), &oact->sa_restorer);
+		ret |= put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
+	}
+
+	return ret;
+}
+
+static int
+setup_sigcontext_ia32 (struct sigcontext_ia32 *sc, struct _fpstate_ia32 *fpstate,
+		       struct pt_regs *regs, unsigned long mask)
+{
+	int  err = 0;
+	unsigned long flag;
+
+	err |= __put_user((regs->r16 >> 32) & 0xffff, (unsigned int *)&sc->fs);
+	err |= __put_user((regs->r16 >> 48) & 0xffff, (unsigned int *)&sc->gs);
+	err |= __put_user((regs->r16 >> 16) & 0xffff, (unsigned int *)&sc->es);
+	err |= __put_user(regs->r16 & 0xffff, (unsigned int *)&sc->ds);
+	err |= __put_user(regs->r15, &sc->edi);
+	err |= __put_user(regs->r14, &sc->esi);
+	err |= __put_user(regs->r13, &sc->ebp);
+	err |= __put_user(regs->r12, &sc->esp);
+	err |= __put_user(regs->r11, &sc->ebx);
+	err |= __put_user(regs->r10, &sc->edx);
+	err |= __put_user(regs->r9, &sc->ecx);
+	err |= __put_user(regs->r8, &sc->eax);
 #if 0
-       err |= __put_user(current->tss.trap_no, &sc->trapno);
-       err |= __put_user(current->tss.error_code, &sc->err);
+	err |= __put_user(current->tss.trap_no, &sc->trapno);
+	err |= __put_user(current->tss.error_code, &sc->err);
 #endif
-       err |= __put_user(regs->cr_iip, &sc->eip);
-       err |= __put_user(regs->r17 & 0xffff, (unsigned int *)&sc->cs);
-       /*
-	*  `eflags' is in an ar register for this context
-	*/
-       asm volatile ("mov %0=ar.eflag ;;" : "=r"(flag));
-       err |= __put_user((unsigned int)flag, &sc->eflags);
-       
-       err |= __put_user(regs->r12, &sc->esp_at_signal);
-       err |= __put_user((regs->r17 >> 16) & 0xffff, (unsigned int *)&sc->ss);
+	err |= __put_user(regs->cr_iip, &sc->eip);
+	err |= __put_user(regs->r17 & 0xffff, (unsigned int *)&sc->cs);
+	/*
+	 *  `eflags' is in an ar register for this context
+	 */
+	asm volatile ("mov %0=ar.eflag ;;" : "=r"(flag));
+	err |= __put_user((unsigned int)flag, &sc->eflags);
+	err |= __put_user(regs->r12, &sc->esp_at_signal);
+	err |= __put_user((regs->r17 >> 16) & 0xffff, (unsigned int *)&sc->ss);
 
 #if 0
-       tmp = save_i387(fpstate);
-       if (tmp < 0)
-         err = 1;
-       else
-         err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
+	tmp = save_i387(fpstate);
+	if (tmp < 0)
+		err = 1;
+	else
+		err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
 
-       /* non-iBCS2 extensions.. */
+	/* non-iBCS2 extensions.. */
 #endif
-       err |= __put_user(mask, &sc->oldmask);
+	err |= __put_user(mask, &sc->oldmask);
 #if 0
-       err |= __put_user(current->tss.cr2, &sc->cr2);
+	err |= __put_user(current->tss.cr2, &sc->cr2);
 #endif
-       
-       return err;
+	return err;
 }
 
 static int
-restore_sigcontext_ia32(struct pt_regs *regs, struct sigcontext_ia32 *sc, int *peax)
+restore_sigcontext_ia32 (struct pt_regs *regs, struct sigcontext_ia32 *sc, int *peax)
 {
-       unsigned int err = 0;
+	unsigned int err = 0;
+
+#define COPY(ia64x, ia32x)	err |= __get_user(regs->ia64x, &sc->ia32x)
 
-#define COPY(ia64x, ia32x)             err |= __get_user(regs->ia64x, &sc->ia32x)
+#define copyseg_gs(tmp)		(regs->r16 |= (unsigned long) tmp << 48)
+#define copyseg_fs(tmp)		(regs->r16 |= (unsigned long) tmp << 32)
+#define copyseg_cs(tmp)		(regs->r17 |= tmp)
+#define copyseg_ss(tmp)		(regs->r17 |= (unsigned long) tmp << 16)
+#define copyseg_es(tmp)		(regs->r16 |= (unsigned long) tmp << 16)
+#define copyseg_ds(tmp)		(regs->r16 |= tmp)
+
+#define COPY_SEG(seg)					\
+	{						\
+		unsigned short tmp;			\
+		err |= __get_user(tmp, &sc->seg);	\
+		copyseg_##seg(tmp);			\
+	}
+#define COPY_SEG_STRICT(seg)				\
+	{						\
+		unsigned short tmp;			\
+		err |= __get_user(tmp, &sc->seg);	\
+		copyseg_##seg(tmp|3);			\
+	}
 
-#define copyseg_gs(tmp)        (regs->r16 |= (unsigned long) tmp << 48)
-#define copyseg_fs(tmp)        (regs->r16 |= (unsigned long) tmp << 32)
-#define copyseg_cs(tmp)        (regs->r17 |= tmp)
-#define copyseg_ss(tmp)        (regs->r17 |= (unsigned long) tmp << 16)
-#define copyseg_es(tmp)        (regs->r16 |= (unsigned long) tmp << 16)
-#define copyseg_ds(tmp)        (regs->r16 |= tmp)
-
-#define COPY_SEG(seg)                                          \
-       { unsigned short tmp;                                   \
-         err |= __get_user(tmp, &sc->seg);                             \
-         copyseg_##seg(tmp); }
-
-#define COPY_SEG_STRICT(seg)                                   \
-       { unsigned short tmp;                                   \
-         err |= __get_user(tmp, &sc->seg);                             \
-         copyseg_##seg(tmp|3); }
-
-       /* To make COPY_SEGs easier, we zero r16, r17 */
-       regs->r16 = 0;
-       regs->r17 = 0;
-
-       COPY_SEG(gs);
-       COPY_SEG(fs);
-       COPY_SEG(es);
-       COPY_SEG(ds);
-       COPY(r15, edi);
-       COPY(r14, esi);
-       COPY(r13, ebp);
-       COPY(r12, esp);
-       COPY(r11, ebx);
-       COPY(r10, edx);
-       COPY(r9, ecx);
-       COPY(cr_iip, eip);
-       COPY_SEG_STRICT(cs);
-       COPY_SEG_STRICT(ss);
-       {
+	/* To make COPY_SEGs easier, we zero r16, r17 */
+	regs->r16 = 0;
+	regs->r17 = 0;
+
+	COPY_SEG(gs);
+	COPY_SEG(fs);
+	COPY_SEG(es);
+	COPY_SEG(ds);
+	COPY(r15, edi);
+	COPY(r14, esi);
+	COPY(r13, ebp);
+	COPY(r12, esp);
+	COPY(r11, ebx);
+	COPY(r10, edx);
+	COPY(r9, ecx);
+	COPY(cr_iip, eip);
+	COPY_SEG_STRICT(cs);
+	COPY_SEG_STRICT(ss);
+	ia32_load_segment_descriptors(current);
+	{
 		unsigned int tmpflags;
 		unsigned long flag;
 
 		/*
-		 *  IA32 `eflags' is not part of `pt_regs', it's
-		 *  in an ar register which is part of the thread
-		 *  context.  Fortunately, we are executing in the
+		 *  IA32 `eflags' is not part of `pt_regs', it's in an ar register which
+		 *  is part of the thread context.  Fortunately, we are executing in the
 		 *  IA32 process's context.
 		 */
 		err |= __get_user(tmpflags, &sc->eflags);
@@ -210,186 +475,191 @@
 		asm volatile ("mov ar.eflag=%0 ;;" :: "r"(flag));
 
 		regs->r1 = -1;	/* disable syscall checks, r1 is orig_eax */
-       }
+	}
 
 #if 0
-       {
-               struct _fpstate * buf;
-               err |= __get_user(buf, &sc->fpstate);
-               if (buf) {
-                       if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
-                               goto badframe;
-                       err |= restore_i387(buf);
-               }
-       }
+	{
+		struct _fpstate * buf;
+		err |= __get_user(buf, &sc->fpstate);
+		if (buf) {
+			if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
+				goto badframe;
+			err |= restore_i387(buf);
+		}
+	}
 #endif
 
-       err |= __get_user(*peax, &sc->eax);
-       return err;
+	err |= __get_user(*peax, &sc->eax);
+	return err;
 
-#if 0       
-badframe:
-       return 1;
+#if 0
+  badframe:
+	return 1;
 #endif
-
 }
 
 /*
  * Determine which stack to use..
  */
 static inline void *
-get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
+get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
 {
-       unsigned long esp;
-       unsigned int xss;
+	unsigned long esp;
 
-       /* Default to using normal stack */
-       esp = regs->r12;
-       xss = regs->r16 >> 16;
-
-       /* This is the X/Open sanctioned signal stack switching.  */
-       if (ka->sa.sa_flags & SA_ONSTACK) {
-               if (! on_sig_stack(esp))
-                       esp = current->sas_ss_sp + current->sas_ss_size;
-       }
-       /* Legacy stack switching not supported */
-       
-       return (void *)((esp - frame_size) & -8ul);
+	/* Default to using normal stack (truncate off sign-extension of bit 31: */
+	esp = (unsigned int) regs->r12;
+
+	/* This is the X/Open sanctioned signal stack switching.  */
+	if (ka->sa.sa_flags & SA_ONSTACK) {
+		if (!on_sig_stack(esp))
+			esp = current->sas_ss_sp + current->sas_ss_size;
+	}
+	/* Legacy stack switching not supported */
+
+	return (void *)((esp - frame_size) & -8ul);
 }
 
 static int
-setup_frame_ia32(int sig, struct k_sigaction *ka, sigset_t *set,
-           struct pt_regs * regs) 
-{      
-       struct sigframe_ia32 *frame;
-       int err = 0;
-
-       frame = get_sigframe(ka, regs, sizeof(*frame));
-
-       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
-               goto give_sigsegv;
-
-       err |= __put_user((current->exec_domain
-                          && current->exec_domain->signal_invmap
-                          && sig < 32
-                          ? (int)(current->exec_domain->signal_invmap[sig])
-                          : sig),
-                         &frame->sig);
-
-       err |= setup_sigcontext_ia32(&frame->sc, &frame->fpstate, regs, set->sig[0]);
-
-       if (_IA32_NSIG_WORDS > 1) {
-               err |= __copy_to_user(frame->extramask, &set->sig[1],
-                                     sizeof(frame->extramask));
-       }
-
-       /* Set up to return from userspace.  If provided, use a stub
-          already in userspace.  */
-       err |= __put_user((long)frame->retcode, &frame->pretcode);
-       /* This is popl %eax ; movl $,%eax ; int $0x80 */
-       err |= __put_user(0xb858, (short *)(frame->retcode+0));
-#define __IA32_NR_sigreturn            119
-       err |= __put_user(__IA32_NR_sigreturn & 0xffff, (short *)(frame->retcode+2));
-       err |= __put_user(__IA32_NR_sigreturn >> 16, (short *)(frame->retcode+4));
-       err |= __put_user(0x80cd, (short *)(frame->retcode+6));
-
-       if (err)
-               goto give_sigsegv;
-
-       /* Set up registers for signal handler */
-       regs->r12 = (unsigned long) frame;
-       regs->cr_iip = (unsigned long) ka->sa.sa_handler;
-
-       set_fs(USER_DS);
-       regs->r16 = (__USER_DS << 16) |  (__USER_DS); /* ES == DS, GS, FS are zero */
-       regs->r17 = (__USER_DS << 16) | __USER_CS;
+setup_frame_ia32 (int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs)
+{
+	struct sigframe_ia32 *frame;
+	int err = 0;
+
+	frame = get_sigframe(ka, regs, sizeof(*frame));
+
+	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+		goto give_sigsegv;
+
+	err |= __put_user((current->exec_domain
+			   && current->exec_domain->signal_invmap
+			   && sig < 32
+			   ? (int)(current->exec_domain->signal_invmap[sig])
+			   : sig),
+			  &frame->sig);
+
+	err |= setup_sigcontext_ia32(&frame->sc, &frame->fpstate, regs, set->sig[0]);
+
+	if (_IA32_NSIG_WORDS > 1)
+		err |= __copy_to_user(frame->extramask, (char *) &set->sig + 4,
+				      sizeof(frame->extramask));
+
+	/* Set up to return from userspace.  If provided, use a stub
+	   already in userspace.  */
+	if (ka->sa.sa_flags & SA_RESTORER) {
+		unsigned int restorer = IA32_SA_RESTORER(ka);
+		err |= __put_user(restorer, &frame->pretcode);
+	} else {
+		err |= __put_user((long)frame->retcode, &frame->pretcode);
+		/* This is popl %eax ; movl $,%eax ; int $0x80 */
+		err |= __put_user(0xb858, (short *)(frame->retcode+0));
+		err |= __put_user(__IA32_NR_sigreturn & 0xffff, (short *)(frame->retcode+2));
+		err |= __put_user(__IA32_NR_sigreturn >> 16, (short *)(frame->retcode+4));
+		err |= __put_user(0x80cd, (short *)(frame->retcode+6));
+	}
+
+	if (err)
+		goto give_sigsegv;
+
+	/* Set up registers for signal handler */
+	regs->r12 = (unsigned long) frame;
+	regs->cr_iip = IA32_SA_HANDLER(ka);
+
+	set_fs(USER_DS);
+	regs->r16 = (__USER_DS << 16) |  (__USER_DS); /* ES == DS, GS, FS are zero */
+	regs->r17 = (__USER_DS << 16) | __USER_CS;
 
 #if 0
-       regs->eflags &= ~TF_MASK;
+	regs->eflags &= ~TF_MASK;
 #endif
 
 #if 0
-       printk("SIG deliver (%s:%d): sig=%d sp=%p pc=%lx ra=%x\n",
+	printk("SIG deliver (%s:%d): sig=%d sp=%p pc=%lx ra=%x\n",
                current->comm, current->pid, sig, (void *) frame, regs->cr_iip, frame->pretcode);
 #endif
 
-       return 1;
+	return 1;
 
-give_sigsegv:
-       if (sig == SIGSEGV)
-               ka->sa.sa_handler = SIG_DFL;
-       force_sig(SIGSEGV, current);
-       return 0;
+  give_sigsegv:
+	if (sig == SIGSEGV)
+		ka->sa.sa_handler = SIG_DFL;
+	force_sig(SIGSEGV, current);
+	return 0;
 }
 
 static int
-setup_rt_frame_ia32(int sig, struct k_sigaction *ka, siginfo_t *info,
-              sigset_t *set, struct pt_regs * regs)
+setup_rt_frame_ia32 (int sig, struct k_sigaction *ka, siginfo_t *info,
+		     sigset_t *set, struct pt_regs * regs)
 {
-       struct rt_sigframe_ia32 *frame;
-       int err = 0;
+	struct rt_sigframe_ia32 *frame;
+	int err = 0;
 
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+	frame = get_sigframe(ka, regs, sizeof(*frame));
 
-       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
-               goto give_sigsegv;
-
-       err |= __put_user((current->exec_domain
-                          && current->exec_domain->signal_invmap
-                          && sig < 32
-                          ? current->exec_domain->signal_invmap[sig]
-                          : sig),
-                         &frame->sig);
-       err |= __put_user((long)&frame->info, &frame->pinfo);
-       err |= __put_user((long)&frame->uc, &frame->puc);
-       err |= copy_siginfo_to_user32(&frame->info, info);
-
-       /* Create the ucontext.  */
-       err |= __put_user(0, &frame->uc.uc_flags);
-       err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->r12),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-       err |= setup_sigcontext_ia32(&frame->uc.uc_mcontext, &frame->fpstate,
-                               regs, set->sig[0]);
-       err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
-       
-       err |= __put_user((long)frame->retcode, &frame->pretcode);
-       /* This is movl $,%eax ; int $0x80 */
-       err |= __put_user(0xb8, (char *)(frame->retcode+0));
-#define __IA32_NR_rt_sigreturn         173
-       err |= __put_user(__IA32_NR_rt_sigreturn, (int *)(frame->retcode+1));
-       err |= __put_user(0x80cd, (short *)(frame->retcode+5));
+	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+		goto give_sigsegv;
+
+	err |= __put_user((current->exec_domain
+			   && current->exec_domain->signal_invmap
+			   && sig < 32
+			   ? current->exec_domain->signal_invmap[sig]
+			   : sig),
+			  &frame->sig);
+	err |= __put_user((long)&frame->info, &frame->pinfo);
+	err |= __put_user((long)&frame->uc, &frame->puc);
+	err |= copy_siginfo_to_user32(&frame->info, info);
+
+	/* Create the ucontext.  */
+	err |= __put_user(0, &frame->uc.uc_flags);
+	err |= __put_user(0, &frame->uc.uc_link);
+	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
+	err |= __put_user(sas_ss_flags(regs->r12), &frame->uc.uc_stack.ss_flags);
+	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+	err |= setup_sigcontext_ia32(&frame->uc.uc_mcontext, &frame->fpstate, regs, set->sig[0]);
+	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+	if (err)
+		goto give_sigsegv;
+
+	/* Set up to return from userspace.  If provided, use a stub
+	   already in userspace.  */
+	if (ka->sa.sa_flags & SA_RESTORER) {
+		unsigned int restorer = IA32_SA_RESTORER(ka);
+		err |= __put_user(restorer, &frame->pretcode);
+	} else {
+		err |= __put_user((long)frame->retcode, &frame->pretcode);
+		/* This is movl $,%eax ; int $0x80 */
+		err |= __put_user(0xb8, (char *)(frame->retcode+0));
+		err |= __put_user(__IA32_NR_rt_sigreturn, (int *)(frame->retcode+1));
+		err |= __put_user(0x80cd, (short *)(frame->retcode+5));
+	}
 
-       if (err)
-               goto give_sigsegv;
+	if (err)
+		goto give_sigsegv;
 
-       /* Set up registers for signal handler */
-       regs->r12 = (unsigned long) frame;
-       regs->cr_iip = (unsigned long) ka->sa.sa_handler;
+	/* Set up registers for signal handler */
+	regs->r12 = (unsigned long) frame;
+	regs->cr_iip = IA32_SA_HANDLER(ka);
 
-       set_fs(USER_DS);
+	set_fs(USER_DS);
 
-       regs->r16 = (__USER_DS << 16) |  (__USER_DS); /* ES == DS, GS, FS are zero */
-       regs->r17 = (__USER_DS << 16) | __USER_CS;
+	regs->r16 = (__USER_DS << 16) |  (__USER_DS); /* ES == DS, GS, FS are zero */
+	regs->r17 = (__USER_DS << 16) | __USER_CS;
 
 #if 0
-       regs->eflags &= ~TF_MASK;
+	regs->eflags &= ~TF_MASK;
 #endif
 
 #if 0
-       printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%x\n",
+	printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%x\n",
                current->comm, current->pid, (void *) frame, regs->cr_iip, frame->pretcode);
 #endif
 
-       return 1;
+	return 1;
 
 give_sigsegv:
-       if (sig == SIGSEGV)
-               ka->sa.sa_handler = SIG_DFL;
-       force_sig(SIGSEGV, current);
-       return 0;
+	if (sig == SIGSEGV)
+		ka->sa.sa_handler = SIG_DFL;
+	force_sig(SIGSEGV, current);
+	return 0;
 }
 
 int
@@ -398,95 +668,78 @@
 {
        /* Set up the stack frame */
        if (ka->sa.sa_flags & SA_SIGINFO)
-               return(setup_rt_frame_ia32(sig, ka, info, set, regs));
+               return setup_rt_frame_ia32(sig, ka, info, set, regs);
        else
-               return(setup_frame_ia32(sig, ka, set, regs));
+               return setup_frame_ia32(sig, ka, set, regs);
 }
 
-asmlinkage int
-sys32_sigreturn(
-int arg0,
-int arg1,
-int arg2,
-int arg3,
-int arg4,
-int arg5,
-int arg6,
-int arg7,
-unsigned long stack)
-{
-       struct pt_regs *regs = (struct pt_regs *) &stack;
-       struct sigframe_ia32 *frame = (struct sigframe_ia32 *)(regs->r12- 8);
-       sigset_t set;
-       int eax;
-
-       if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-               goto badframe;
-
-       if (__get_user(set.sig[0], &frame->sc.oldmask)
-           || (_IA32_NSIG_WORDS > 1
-               && __copy_from_user((((char *) &set.sig) + 4),
-                                   &frame->extramask,
-                                   sizeof(frame->extramask))))
-               goto badframe;
-
-       sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sigmask_lock);
-       current->blocked = (sigset_t) set;
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-       
-       if (restore_sigcontext_ia32(regs, &frame->sc, &eax))
-               goto badframe;
-       return eax;
-
-badframe:
-       force_sig(SIGSEGV, current);
-       return 0;
-}      
-
-asmlinkage int
-sys32_rt_sigreturn(
-int arg0,
-int arg1,
-int arg2,
-int arg3,
-int arg4,
-int arg5,
-int arg6,
-int arg7,
-unsigned long stack)
-{
-       struct pt_regs *regs = (struct pt_regs *) &stack;
-       struct rt_sigframe_ia32 *frame = (struct rt_sigframe_ia32 *)(regs->r12 - 4);
-       sigset_t set;
-       stack_t st;
-       int eax;
-
-       if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-               goto badframe;
-       if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-               goto badframe;
-
-       sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sigmask_lock);
-       current->blocked =  set;
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-       
-       if (restore_sigcontext_ia32(regs, &frame->uc.uc_mcontext, &eax))
-               goto badframe;
-
-       if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
-               goto badframe;
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       do_sigaltstack(&st, NULL, regs->r12);
-
-       return eax;
-
-badframe:
-       force_sig(SIGSEGV, current);
-       return 0;
-}      
+asmlinkage long
+sys32_sigreturn (int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7,
+		 unsigned long stack)
+{
+	struct pt_regs *regs = (struct pt_regs *) &stack;
+	unsigned long esp = (unsigned int) regs->r12;
+	struct sigframe_ia32 *frame = (struct sigframe_ia32 *)(esp - 8);
+	sigset_t set;
+	int eax;
+
+	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+		goto badframe;
+
+	if (__get_user(set.sig[0], &frame->sc.oldmask)
+	    || (_IA32_NSIG_WORDS > 1 && __copy_from_user((char *) &set.sig + 4, &frame->extramask,
+							 sizeof(frame->extramask))))
+		goto badframe;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+	spin_lock_irq(&current->sigmask_lock);
+	current->blocked = (sigset_t) set;
+	recalc_sigpending(current);
+	spin_unlock_irq(&current->sigmask_lock);
+
+	if (restore_sigcontext_ia32(regs, &frame->sc, &eax))
+		goto badframe;
+	return eax;
+
+  badframe:
+	force_sig(SIGSEGV, current);
+	return 0;
+}
 
+asmlinkage long
+sys32_rt_sigreturn (int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7,
+		    unsigned long stack)
+{
+	struct pt_regs *regs = (struct pt_regs *) &stack;
+	unsigned long esp = (unsigned int) regs->r12;
+	struct rt_sigframe_ia32 *frame = (struct rt_sigframe_ia32 *)(esp - 4);
+	sigset_t set;
+	stack_t st;
+	int eax;
+
+	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+		goto badframe;
+	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
+		goto badframe;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+	spin_lock_irq(&current->sigmask_lock);
+	current->blocked =  set;
+	recalc_sigpending(current);
+	spin_unlock_irq(&current->sigmask_lock);
+
+	if (restore_sigcontext_ia32(regs, &frame->uc.uc_mcontext, &eax))
+		goto badframe;
+
+	if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
+		goto badframe;
+	/* It is more difficult to avoid calling this function than to
+	   call it and ignore errors.  */
+	do_sigaltstack(&st, NULL, esp);
+
+	return eax;
+
+  badframe:
+	force_sig(SIGSEGV, current);
+	return 0;
+}
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/ia32_support.c linux/arch/ia64/ia32/ia32_support.c
--- v2.4.14/linux/arch/ia64/ia32/ia32_support.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/ia32/ia32_support.c	Fri Nov  9 14:26:17 2001
@@ -4,15 +4,18 @@
  * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com>
  * Copyright (C) 2000 Asit K. Mallick <asit.k.mallick@intel.com>
  * Copyright (C) 2001 Hewlett-Packard Co
- * Copyright (C) 2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * 06/16/00	A. Mallick	added csd/ssd/tssd for ia32 thread context
  * 02/19/01	D. Mosberger	dropped tssd; it's not needed
+ * 09/14/01	D. Mosberger	fixed memory management for gdt/tss page
+ * 09/29/01	D. Mosberger	added ia32_load_segment_descriptors()
  */
 
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/mm.h>
+#include <linux/personality.h>
 #include <linux/sched.h>
 
 #include <asm/page.h>
@@ -21,10 +24,46 @@
 #include <asm/processor.h>
 #include <asm/ia32.h>
 
-extern unsigned long *ia32_gdt_table, *ia32_tss;
-
 extern void die_if_kernel (char *str, struct pt_regs *regs, long err);
 
+struct exec_domain ia32_exec_domain;
+struct page *ia32_shared_page[(2*IA32_PAGE_SIZE + PAGE_SIZE - 1)/PAGE_SIZE];
+unsigned long *ia32_gdt;
+
+static unsigned long
+load_desc (u16 selector)
+{
+	unsigned long *table, limit, index;
+
+	if (!selector)
+		return 0;
+	if (selector & IA32_SEGSEL_TI) {
+		table = (unsigned long *) IA32_LDT_OFFSET;
+		limit = IA32_LDT_ENTRIES;
+	} else {
+		table = ia32_gdt;
+		limit = IA32_PAGE_SIZE / sizeof(ia32_gdt[0]);
+	}
+	index = selector >> IA32_SEGSEL_INDEX_SHIFT;
+	if (index >= limit)
+		return 0;
+	return IA32_SEG_UNSCRAMBLE(table[index]);
+}
+
+void
+ia32_load_segment_descriptors (struct task_struct *task)
+{
+	struct pt_regs *regs = ia64_task_regs(task);
+
+	/* Setup the segment descriptors */
+	regs->r24 = load_desc(regs->r16 >> 16);		/* ESD */
+	regs->r27 = load_desc(regs->r16 >>  0);		/* DSD */
+	regs->r28 = load_desc(regs->r16 >> 32);		/* FSD */
+	regs->r29 = load_desc(regs->r16 >> 48);		/* GSD */
+	task->thread.csd = load_desc(regs->r17 >>  0);	/* CSD */
+	task->thread.ssd = load_desc(regs->r17 >> 16);	/* SSD */
+}
+
 void
 ia32_save_state (struct task_struct *t)
 {
@@ -46,14 +85,17 @@
 	t->thread.csd = csd;
 	t->thread.ssd = ssd;
 	ia64_set_kr(IA64_KR_IO_BASE, t->thread.old_iob);
+	ia64_set_kr(IA64_KR_TSSD, t->thread.old_k1);
 }
 
 void
 ia32_load_state (struct task_struct *t)
 {
-	unsigned long eflag, fsr, fcr, fir, fdr, csd, ssd;
+	unsigned long eflag, fsr, fcr, fir, fdr, csd, ssd, tssd;
 	struct pt_regs *regs = ia64_task_regs(t);
-	int nr;
+	int nr = smp_processor_id();	/* LDT and TSS depend on CPU number: */
+
+	nr = smp_processor_id();
 
 	eflag = t->thread.eflag;
 	fsr = t->thread.fsr;
@@ -62,6 +104,7 @@
 	fdr = t->thread.fdr;
 	csd = t->thread.csd;
 	ssd = t->thread.ssd;
+	tssd = load_desc(_TSS(nr));					/* TSSD */
 
 	asm volatile ("mov ar.eflag=%0;"
 		      "mov ar.fsr=%1;"
@@ -72,11 +115,12 @@
 		      "mov ar.ssd=%6;"
 		      :: "r"(eflag), "r"(fsr), "r"(fcr), "r"(fir), "r"(fdr), "r"(csd), "r"(ssd));
 	current->thread.old_iob = ia64_get_kr(IA64_KR_IO_BASE);
+	current->thread.old_k1 = ia64_get_kr(IA64_KR_TSSD);
 	ia64_set_kr(IA64_KR_IO_BASE, IA32_IOBASE);
+	ia64_set_kr(IA64_KR_TSSD, tssd);
 
-	/* load TSS and LDT while preserving SS and CS: */
-	nr = smp_processor_id();
 	regs->r17 = (_TSS(nr) << 48) | (_LDT(nr) << 32) | (__u32) regs->r17;
+	regs->r30 = load_desc(_LDT(nr));				/* LDTD */
 }
 
 /*
@@ -85,36 +129,34 @@
 void
 ia32_gdt_init (void)
 {
-	unsigned long gdt_and_tss_page, ldt_size;
+	unsigned long *tss;
+	unsigned long ldt_size;
 	int nr;
 
-	/* allocate two IA-32 pages of memory: */
-	gdt_and_tss_page = __get_free_pages(GFP_KERNEL,
-					    (IA32_PAGE_SHIFT < PAGE_SHIFT)
-					    ? 0 : (IA32_PAGE_SHIFT + 1) - PAGE_SHIFT);
-	ia32_gdt_table = (unsigned long *) gdt_and_tss_page;
-	ia32_tss = (unsigned long *) (gdt_and_tss_page + IA32_PAGE_SIZE);
-
-	/* Zero the gdt and tss */
-	memset((void *) gdt_and_tss_page, 0, 2*IA32_PAGE_SIZE);
+	ia32_shared_page[0] = alloc_page(GFP_KERNEL);
+	ia32_gdt = page_address(ia32_shared_page[0]);
+	tss = ia32_gdt + IA32_PAGE_SIZE/sizeof(ia32_gdt[0]);
+
+	if (IA32_PAGE_SIZE == PAGE_SIZE) {
+		ia32_shared_page[1] = alloc_page(GFP_KERNEL);
+		tss = page_address(ia32_shared_page[1]);
+	}
 
 	/* CS descriptor in IA-32 (scrambled) format */
-	ia32_gdt_table[__USER_CS >> 3] =
-		IA32_SEG_DESCRIPTOR(0, (IA32_PAGE_OFFSET - 1) >> IA32_PAGE_SHIFT,
-				    0xb, 1, 3, 1, 1, 1, 1);
+	ia32_gdt[__USER_CS >> 3] = IA32_SEG_DESCRIPTOR(0, (IA32_PAGE_OFFSET-1) >> IA32_PAGE_SHIFT,
+						       0xb, 1, 3, 1, 1, 1, 1);
 
 	/* DS descriptor in IA-32 (scrambled) format */
-	ia32_gdt_table[__USER_DS >> 3] =
-		IA32_SEG_DESCRIPTOR(0, (IA32_PAGE_OFFSET - 1) >> IA32_PAGE_SHIFT,
-				    0x3, 1, 3, 1, 1, 1, 1);
+	ia32_gdt[__USER_DS >> 3] = IA32_SEG_DESCRIPTOR(0, (IA32_PAGE_OFFSET-1) >> IA32_PAGE_SHIFT,
+						       0x3, 1, 3, 1, 1, 1, 1);
 
 	/* We never change the TSS and LDT descriptors, so we can share them across all CPUs.  */
 	ldt_size = PAGE_ALIGN(IA32_LDT_ENTRIES*IA32_LDT_ENTRY_SIZE);
 	for (nr = 0; nr < NR_CPUS; ++nr) {
-		ia32_gdt_table[_TSS(nr)] = IA32_SEG_DESCRIPTOR(IA32_TSS_OFFSET, 235,
-							       0xb, 0, 3, 1, 1, 1, 0);
-		ia32_gdt_table[_LDT(nr)] = IA32_SEG_DESCRIPTOR(IA32_LDT_OFFSET, ldt_size - 1,
-							       0x2, 0, 3, 1, 1, 1, 0);
+		ia32_gdt[_TSS(nr)] = IA32_SEG_DESCRIPTOR(IA32_TSS_OFFSET, 235,
+							 0xb, 0, 3, 1, 1, 1, 0);
+		ia32_gdt[_LDT(nr)] = IA32_SEG_DESCRIPTOR(IA32_LDT_OFFSET, ldt_size - 1,
+							 0x2, 0, 3, 1, 1, 1, 0);
 	}
 }
 
@@ -133,3 +175,18 @@
 	siginfo.si_code = TRAP_BRKPT;
 	force_sig_info(SIGTRAP, &siginfo, current);
 }
+
+static int __init
+ia32_init (void)
+{
+	ia32_exec_domain.name = "Linux/x86";
+	ia32_exec_domain.handler = NULL;
+	ia32_exec_domain.pers_low = PER_LINUX32;
+	ia32_exec_domain.pers_high = PER_LINUX32;
+	ia32_exec_domain.signal_map = default_exec_domain.signal_map;
+	ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap;
+	register_exec_domain(&ia32_exec_domain);
+	return 0;
+}
+
+__initcall(ia32_init);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/ia32_traps.c linux/arch/ia64/ia32/ia32_traps.c
--- v2.4.14/linux/arch/ia64/ia32/ia32_traps.c	Thu Jan  4 12:50:17 2001
+++ linux/arch/ia64/ia32/ia32_traps.c	Fri Nov  9 14:26:17 2001
@@ -1,7 +1,12 @@
 /*
- * IA32 exceptions handler
+ * IA-32 exception handlers
+ *
+ * Copyright (C) 2000 Asit K. Mallick <asit.k.mallick@intel.com>
+ * Copyright (C) 2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * 06/16/00	A. Mallick	added siginfo for most cases (close to IA32)
+ * 09/29/00	D. Mosberger	added ia32_intercept()
  */
 
 #include <linux/kernel.h>
@@ -9,6 +14,26 @@
 
 #include <asm/ia32.h>
 #include <asm/ptrace.h>
+
+int
+ia32_intercept (struct pt_regs *regs, unsigned long isr)
+{
+	switch ((isr >> 16) & 0xff) {
+	      case 0:	/* Instruction intercept fault */
+	      case 3:	/* Locked Data reference fault */
+	      case 1:	/* Gate intercept trap */
+		return -1;
+
+	      case 2:	/* System flag trap */
+		if (((isr >> 14) & 0x3) >= 2) {
+			/* MOV SS, POP SS instructions */
+			ia64_psr(regs)->id = 1;
+			return 0;
+		} else
+			return -1;
+	}
+	return -1;
+}
 
 int
 ia32_exception (struct pt_regs *regs, unsigned long isr)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/ia32/sys_ia32.c linux/arch/ia64/ia32/sys_ia32.c
--- v2.4.14/linux/arch/ia64/ia32/sys_ia32.c	Mon Aug 27 12:41:39 2001
+++ linux/arch/ia64/ia32/sys_ia32.c	Fri Nov  9 14:26:17 2001
@@ -1,14 +1,13 @@
 /*
- * sys_ia32.c: Conversion between 32bit and 64bit native syscalls. Based on
- *             sys_sparc32
+ * sys_ia32.c: Conversion between 32bit and 64bit native syscalls. Derived from sys_sparc32.c.
  *
  * Copyright (C) 2000		VA Linux Co
  * Copyright (C) 2000		Don Dugger <n0ano@valinux.com>
  * Copyright (C) 1999		Arun Sharma <arun.sharma@intel.com>
  * Copyright (C) 1997,1998	Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  * Copyright (C) 1997		David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 2000		Hewlett-Packard Co.
- * Copyright (C) 2000		David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 2000-2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * These routines maintain argument size conversion between 32bit and 64bit
  * environment.
@@ -53,31 +52,56 @@
 #include <asm/types.h>
 #include <asm/uaccess.h>
 #include <asm/semaphore.h>
-#include <asm/ipc.h>
 
 #include <net/scm.h>
 #include <net/sock.h>
 #include <asm/ia32.h>
 
+#define DEBUG	0
+
+#if DEBUG
+# define DBG(fmt...)	printk(KERN_DEBUG fmt)
+#else
+# define DBG(fmt...)
+#endif
+
 #define A(__x)		((unsigned long)(__x))
 #define AA(__x)		((unsigned long)(__x))
 #define ROUND_UP(x,a)	((__typeof__(x))(((unsigned long)(x) + ((a) - 1)) & ~((a) - 1)))
 #define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
 
+#define OFFSET4K(a)		((a) & 0xfff)
+#define PAGE_START(addr)	((addr) & PAGE_MASK)
+#define PAGE_OFF(addr)		((addr) & ~PAGE_MASK)
+
 extern asmlinkage long sys_execve (char *, char **, char **, struct pt_regs *);
 extern asmlinkage long sys_mprotect (unsigned long, size_t, unsigned long);
+extern asmlinkage long sys_munmap (unsigned long, size_t);
+extern unsigned long arch_get_unmapped_area (struct file *, unsigned long, unsigned long,
+					     unsigned long, unsigned long);
+
+/* forward declaration: */
+asmlinkage long sys32_mprotect (unsigned int, unsigned int, int);
+
+/*
+ * Anything that modifies or inspects ia32 user virtual memory must hold this semaphore
+ * while doing so.
+ */
+/* XXX make per-mm: */
+static DECLARE_MUTEX(ia32_mmap_sem);
 
 static int
 nargs (unsigned int arg, char **ap)
 {
-	int n, err, addr;
+	unsigned int addr;
+	int n, err;
 
 	if (!arg)
 		return 0;
 
 	n = 0;
 	do {
-		err = get_user(addr, (int *)A(arg));
+		err = get_user(addr, (unsigned int *)A(arg));
 		if (err)
 			return err;
 		if (ap)
@@ -94,7 +118,7 @@
 	      int stack)
 {
 	struct pt_regs *regs = (struct pt_regs *)&stack;
-	unsigned long old_map_base, old_task_size;
+	unsigned long old_map_base, old_task_size, tssd;
 	char **av, **ae;
 	int na, ne, len;
 	long r;
@@ -123,15 +147,20 @@
 
 	old_map_base  = current->thread.map_base;
 	old_task_size = current->thread.task_size;
+	tssd = ia64_get_kr(IA64_KR_TSSD);
 
-	/* we may be exec'ing a 64-bit process: reset map base & task-size: */
+	/* we may be exec'ing a 64-bit process: reset map base, task-size, and io-base: */
 	current->thread.map_base  = DEFAULT_MAP_BASE;
 	current->thread.task_size = DEFAULT_TASK_SIZE;
+	ia64_set_kr(IA64_KR_IO_BASE, current->thread.old_iob);
+	ia64_set_kr(IA64_KR_TSSD, current->thread.old_k1);
 
 	set_fs(KERNEL_DS);
 	r = sys_execve(filename, av, ae, regs);
 	if (r < 0) {
-		/* oops, execve failed, switch back to old map base & task-size: */
+		/* oops, execve failed, switch back to old values... */
+		ia64_set_kr(IA64_KR_IO_BASE, IA32_IOBASE);
+		ia64_set_kr(IA64_KR_TSSD, tssd);
 		current->thread.map_base  = old_map_base;
 		current->thread.task_size = old_task_size;
 		set_fs(USER_DS);	/* establish new task-size as the address-limit */
@@ -142,30 +171,33 @@
 }
 
 static inline int
-putstat(struct stat32 *ubuf, struct stat *kbuf)
+putstat (struct stat32 *ubuf, struct stat *kbuf)
 {
 	int err;
 
-	err = put_user (kbuf->st_dev, &ubuf->st_dev);
-	err |= __put_user (kbuf->st_ino, &ubuf->st_ino);
-	err |= __put_user (kbuf->st_mode, &ubuf->st_mode);
-	err |= __put_user (kbuf->st_nlink, &ubuf->st_nlink);
-	err |= __put_user (kbuf->st_uid, &ubuf->st_uid);
-	err |= __put_user (kbuf->st_gid, &ubuf->st_gid);
-	err |= __put_user (kbuf->st_rdev, &ubuf->st_rdev);
-	err |= __put_user (kbuf->st_size, &ubuf->st_size);
-	err |= __put_user (kbuf->st_atime, &ubuf->st_atime);
-	err |= __put_user (kbuf->st_mtime, &ubuf->st_mtime);
-	err |= __put_user (kbuf->st_ctime, &ubuf->st_ctime);
-	err |= __put_user (kbuf->st_blksize, &ubuf->st_blksize);
-	err |= __put_user (kbuf->st_blocks, &ubuf->st_blocks);
+	if (clear_user(ubuf, sizeof(*ubuf)))
+		return 1;
+
+	err  = __put_user(kbuf->st_dev, &ubuf->st_dev);
+	err |= __put_user(kbuf->st_ino, &ubuf->st_ino);
+	err |= __put_user(kbuf->st_mode, &ubuf->st_mode);
+	err |= __put_user(kbuf->st_nlink, &ubuf->st_nlink);
+	err |= __put_user(kbuf->st_uid, &ubuf->st_uid);
+	err |= __put_user(kbuf->st_gid, &ubuf->st_gid);
+	err |= __put_user(kbuf->st_rdev, &ubuf->st_rdev);
+	err |= __put_user(kbuf->st_size, &ubuf->st_size);
+	err |= __put_user(kbuf->st_atime, &ubuf->st_atime);
+	err |= __put_user(kbuf->st_mtime, &ubuf->st_mtime);
+	err |= __put_user(kbuf->st_ctime, &ubuf->st_ctime);
+	err |= __put_user(kbuf->st_blksize, &ubuf->st_blksize);
+	err |= __put_user(kbuf->st_blocks, &ubuf->st_blocks);
 	return err;
 }
 
-extern asmlinkage long sys_newstat(char * filename, struct stat * statbuf);
+extern asmlinkage long sys_newstat (char * filename, struct stat * statbuf);
 
 asmlinkage long
-sys32_newstat(char * filename, struct stat32 *statbuf)
+sys32_newstat (char *filename, struct stat32 *statbuf)
 {
 	int ret;
 	struct stat s;
@@ -173,8 +205,8 @@
 
 	set_fs(KERNEL_DS);
 	ret = sys_newstat(filename, &s);
-	set_fs (old_fs);
-	if (putstat (statbuf, &s))
+	set_fs(old_fs);
+	if (putstat(statbuf, &s))
 		return -EFAULT;
 	return ret;
 }
@@ -182,16 +214,16 @@
 extern asmlinkage long sys_newlstat(char * filename, struct stat * statbuf);
 
 asmlinkage long
-sys32_newlstat(char * filename, struct stat32 *statbuf)
+sys32_newlstat (char *filename, struct stat32 *statbuf)
 {
-	int ret;
-	struct stat s;
 	mm_segment_t old_fs = get_fs();
+	struct stat s;
+	int ret;
 
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_newlstat(filename, &s);
-	set_fs (old_fs);
-	if (putstat (statbuf, &s))
+	set_fs(old_fs);
+	if (putstat(statbuf, &s))
 		return -EFAULT;
 	return ret;
 }
@@ -199,112 +231,249 @@
 extern asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf);
 
 asmlinkage long
-sys32_newfstat(unsigned int fd, struct stat32 *statbuf)
+sys32_newfstat (unsigned int fd, struct stat32 *statbuf)
 {
-	int ret;
-	struct stat s;
 	mm_segment_t old_fs = get_fs();
+	struct stat s;
+	int ret;
 
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_newfstat(fd, &s);
-	set_fs (old_fs);
-	if (putstat (statbuf, &s))
+	set_fs(old_fs);
+	if (putstat(statbuf, &s))
 		return -EFAULT;
 	return ret;
 }
 
-#define OFFSET4K(a)	((a) & 0xfff)
+#if PAGE_SHIFT > IA32_PAGE_SHIFT
 
-unsigned long
-do_mmap_fake(struct file *file, unsigned long addr, unsigned long len,
-	unsigned long prot, unsigned long flags, loff_t off)
+
+static int
+get_page_prot (unsigned long addr)
+{
+	struct vm_area_struct *vma = find_vma(current->mm, addr);
+	int prot = 0;
+
+	if (!vma || vma->vm_start > addr)
+		return 0;
+
+	if (vma->vm_flags & VM_READ)
+		prot |= PROT_READ;
+	if (vma->vm_flags & VM_WRITE)
+		prot |= PROT_WRITE;
+	if (vma->vm_flags & VM_EXEC)
+		prot |= PROT_EXEC;
+	return prot;
+}
+
+/*
+ * Map a subpage by creating an anonymous page that contains the union of the old page and
+ * the subpage.
+ */
+static unsigned long
+mmap_subpage (struct file *file, unsigned long start, unsigned long end, int prot, int flags,
+	      loff_t off)
 {
+	void *page = (void *) get_zeroed_page(GFP_KERNEL);
 	struct inode *inode;
-	void *front, *back;
-	unsigned long baddr;
-	int r;
-	char c;
+	unsigned long ret;
+	int old_prot = get_page_prot(start);
 
-	if (OFFSET4K(addr) || OFFSET4K(off))
-		return -EINVAL;
-	prot |= PROT_WRITE;
-	front = NULL;
-	back = NULL;
-	if ((baddr = (addr & PAGE_MASK)) != addr && get_user(c, (char *)baddr) == 0) {
-		front = kmalloc(addr - baddr, GFP_KERNEL);
-		if (!front)
-			return -ENOMEM;
-		__copy_user(front, (void *)baddr, addr - baddr);
+	DBG("mmap_subpage(file=%p,start=0x%lx,end=0x%lx,prot=%x,flags=%x,off=0x%llx)\n",
+	    file, start, end, prot, flags, off);
+
+	if (!page)
+		return -ENOMEM;
+
+	if (old_prot)
+		copy_from_user(page, (void *) PAGE_START(start), PAGE_SIZE);
+
+	down_write(&current->mm->mmap_sem);
+	{
+		ret = do_mmap(0, PAGE_START(start), PAGE_SIZE, prot | PROT_WRITE,
+			      flags | MAP_FIXED | MAP_ANONYMOUS, 0);
 	}
-	if (addr && ((addr + len) & ~PAGE_MASK) && get_user(c, (char *)(addr + len)) == 0) {
-		back = kmalloc(PAGE_SIZE - ((addr + len) & ~PAGE_MASK), GFP_KERNEL);
-		if (!back) {
-			if (front)
-				kfree(front);
-			return -ENOMEM;
+	up_write(&current->mm->mmap_sem);
+
+	if (IS_ERR((void *) ret))
+		goto out;
+
+	if (old_prot) {
+		/* copy back the old page contents.  */
+		if (PAGE_OFF(start))
+			copy_to_user((void *) PAGE_START(start), page, PAGE_OFF(start));
+		if (PAGE_OFF(end))
+			copy_to_user((void *) end, page + PAGE_OFF(end),
+				     PAGE_SIZE - PAGE_OFF(end));
+	}
+	if (!(flags & MAP_ANONYMOUS)) {
+		/* read the file contents */
+		inode = file->f_dentry->d_inode;
+		if (!inode->i_fop || !file->f_op->read
+		    || ((*file->f_op->read)(file, (char *) start, end - start, &off) < 0))
+		{
+			ret = -EINVAL;
+			goto out;
+		}
+	}
+	if (!(prot & PROT_WRITE))
+		ret = sys_mprotect(PAGE_START(start), PAGE_SIZE, prot | old_prot);
+  out:
+	free_page((unsigned long) page);
+	return ret;
+}
+
+static unsigned long
+emulate_mmap (struct file *file, unsigned long start, unsigned long len, int prot, int flags,
+	      loff_t off)
+{
+	unsigned long tmp, end, pend, pstart, ret, is_congruent, fudge = 0;
+	struct inode *inode;
+	loff_t poff;
+
+	end = start + len;
+	pstart = PAGE_START(start);
+	pend = PAGE_ALIGN(end);
+
+	if (flags & MAP_FIXED) {
+		if (start > pstart) {
+			if (flags & MAP_SHARED)
+				printk(KERN_INFO
+				       "%s(%d): emulate_mmap() can't share head (addr=0x%lx)\n",
+				       current->comm, current->pid, start);
+			ret = mmap_subpage(file, start, min(PAGE_ALIGN(start), end), prot, flags,
+					   off);
+			if (IS_ERR((void *) ret))
+				return ret;
+			pstart += PAGE_SIZE;
+			if (pstart >= pend)
+				return start;	/* done */
+		}
+		if (end < pend) {
+			if (flags & MAP_SHARED)
+				printk(KERN_INFO
+				       "%s(%d): emulate_mmap() can't share tail (end=0x%lx)\n",
+				       current->comm, current->pid, end);
+			ret = mmap_subpage(file, max(start, PAGE_START(end)), end, prot, flags,
+					   (off + len) - PAGE_OFF(end));
+			if (IS_ERR((void *) ret))
+				return ret;
+			pend -= PAGE_SIZE;
+			if (pstart >= pend)
+				return start;	/* done */
+		}
+	} else {
+		/*
+		 * If a start address was specified, use it if the entire rounded out area
+		 * is available.
+		 */
+		if (start && !pstart)
+			fudge = 1;	/* handle case of mapping to range (0,PAGE_SIZE) */
+		tmp = arch_get_unmapped_area(file, pstart - fudge, pend - pstart, 0, flags);
+		if (tmp != pstart) {
+			pstart = tmp;
+			start = pstart + PAGE_OFF(off);	/* make start congruent with off */
+			end = start + len;
+			pend = PAGE_ALIGN(end);
 		}
-		__copy_user(back, (char *)addr + len, PAGE_SIZE - ((addr + len) & ~PAGE_MASK));
 	}
+
+	poff = off + (pstart - start);	/* note: (pstart - start) may be negative */
+	is_congruent = (flags & MAP_ANONYMOUS) || (PAGE_OFF(poff) == 0);
+
+	if ((flags & MAP_SHARED) && !is_congruent)
+		printk(KERN_INFO "%s(%d): emulate_mmap() can't share contents of incongruent mmap "
+		       "(addr=0x%lx,off=0x%llx)\n", current->comm, current->pid, start, off);
+
+	DBG("mmap_body: mapping [0x%lx-0x%lx) %s with poff 0x%llx\n", pstart, pend,
+	    is_congruent ? "congruent" : "not congruent", poff);
+
 	down_write(&current->mm->mmap_sem);
-	r = do_mmap(0, baddr, len + (addr - baddr), prot, flags | MAP_ANONYMOUS, 0);
+	{
+		if (!(flags & MAP_ANONYMOUS) && is_congruent)
+			ret = do_mmap(file, pstart, pend - pstart, prot, flags | MAP_FIXED, poff);
+		else
+			ret = do_mmap(0, pstart, pend - pstart,
+				      prot | ((flags & MAP_ANONYMOUS) ? 0 : PROT_WRITE),
+				      flags | MAP_FIXED | MAP_ANONYMOUS, 0);
+	}
 	up_write(&current->mm->mmap_sem);
-	if (r < 0)
-		return(r);
-	if (addr == 0)
-		addr = r;
-	if (back) {
-		__copy_user((char *)addr + len, back, PAGE_SIZE - ((addr + len) & ~PAGE_MASK));
-		kfree(back);
-	}
-	if (front) {
-		__copy_user((void *)baddr, front, addr - baddr);
-		kfree(front);
-	}
-	if (flags & MAP_ANONYMOUS) {
-		clear_user((char *)addr, len);
-		return(addr);
+
+	if (IS_ERR((void *) ret))
+		return ret;
+
+	if (!is_congruent) {
+		/* read the file contents */
+		inode = file->f_dentry->d_inode;
+		if (!inode->i_fop || !file->f_op->read
+		    || ((*file->f_op->read)(file, (char *) pstart, pend - pstart, &poff) < 0))
+		{
+			sys_munmap(pstart, pend - pstart);
+			return -EINVAL;
+		}
+		if (!(prot & PROT_WRITE) && sys_mprotect(pstart, pend - pstart, prot) < 0)
+			return EINVAL;
 	}
-	if (!file)
-		return -EINVAL;
-	inode = file->f_dentry->d_inode;
-	if (!inode->i_fop)
-		return -EINVAL;
-	if (!file->f_op->read)
-		return -EINVAL;
-	r = file->f_op->read(file, (char *)addr, len, &off);
-	return (r < 0) ? -EINVAL : addr;
+	return start;
 }
 
-long
-ia32_do_mmap (struct file *file, unsigned int addr, unsigned int len, unsigned int prot,
-	      unsigned int flags, unsigned int fd, unsigned int offset)
+#endif /* PAGE_SHIFT > IA32_PAGE_SHIFT */
+
+static inline unsigned int
+get_prot32 (unsigned int prot)
 {
-	long error = -EFAULT;
-	unsigned int poff;
+	if (prot & PROT_WRITE)
+		/* on x86, PROT_WRITE implies PROT_READ which implies PROT_EEC */
+		prot |= PROT_READ | PROT_WRITE | PROT_EXEC;
+	else if (prot & (PROT_READ | PROT_EXEC))
+		/* on x86, there is no distinction between PROT_READ and PROT_EXEC */
+		prot |= (PROT_READ | PROT_EXEC);
 
-	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-	prot |= PROT_EXEC;
+	return prot;
+}
 
-	if ((flags & MAP_FIXED) && ((addr & ~PAGE_MASK) || (offset & ~PAGE_MASK)))
-		error = do_mmap_fake(file, addr, len, prot, flags, (loff_t)offset);
-	else {
-		poff = offset & PAGE_MASK;
-		len += offset - poff;
+unsigned long
+ia32_do_mmap (struct file *file, unsigned long addr, unsigned long len, int prot, int flags,
+	      loff_t offset)
+{
+	DBG("ia32_do_mmap(file=%p,addr=0x%lx,len=0x%lx,prot=%x,flags=%x,offset=0x%llx)\n",
+	    file, addr, len, prot, flags, offset);
+
+	if (file && (!file->f_op || !file->f_op->mmap))
+		return -ENODEV;
+
+	len = IA32_PAGE_ALIGN(len);
+	if (len == 0)
+		return addr;
+
+	if (len > IA32_PAGE_OFFSET || addr > IA32_PAGE_OFFSET - len)
+		return -EINVAL;
+
+	if (OFFSET4K(offset))
+		return -EINVAL;
 
-		down_write(&current->mm->mmap_sem);
-		error = do_mmap_pgoff(file, addr, len, prot, flags, poff >> PAGE_SHIFT);
-		up_write(&current->mm->mmap_sem);
+	prot = get_prot32(prot);
 
-		if (!IS_ERR((void *) error))
-			error += offset - poff;
+#if PAGE_SHIFT > IA32_PAGE_SHIFT
+	down(&ia32_mmap_sem);
+	{
+		addr = emulate_mmap(file, addr, len, prot, flags, offset);
 	}
-	return error;
+	up(&ia32_mmap_sem);
+#else
+	down_write(&current->mm->mmap_sem);
+	{
+		addr = do_mmap(file, addr, len, prot, flags, offset);
+	}
+	up_write(&current->mm->mmap_sem);
+#endif
+	DBG("ia32_do_mmap: returning 0x%lx\n", addr);
+	return addr;
 }
 
 /*
- * Linux/i386 didn't use to be able to handle more than
- * 4 system call parameters, so these system calls used a memory
- * block for parameter passing..
+ * Linux/i386 didn't use to be able to handle more than 4 system call parameters, so these
+ * system calls used a memory block for parameter passing..
  */
 
 struct mmap_arg_struct {
@@ -317,180 +486,166 @@
 };
 
 asmlinkage long
-sys32_mmap(struct mmap_arg_struct *arg)
+sys32_mmap (struct mmap_arg_struct *arg)
 {
 	struct mmap_arg_struct a;
 	struct file *file = NULL;
-	long retval;
+	unsigned long addr;
+	int flags;
 
 	if (copy_from_user(&a, arg, sizeof(a)))
 		return -EFAULT;
 
-	if (PAGE_ALIGN(a.len) == 0)
-		return a.addr;
+	if (OFFSET4K(a.offset))
+		return -EINVAL;
+
+	flags = a.flags;
 
-	if (!(a.flags & MAP_ANONYMOUS)) {
+	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+	if (!(flags & MAP_ANONYMOUS)) {
 		file = fget(a.fd);
 		if (!file)
 			return -EBADF;
 	}
-#ifdef	CONFIG_IA64_PAGE_SIZE_4KB
-	if ((a.offset & ~PAGE_MASK) != 0)
-		return -EINVAL;
 
-	down_write(&current->mm->mmap_sem);
-	retval = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, a.offset >> PAGE_SHIFT);
-	up_write(&current->mm->mmap_sem);
-#else
-	retval = ia32_do_mmap(file, a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
-#endif
+	addr = ia32_do_mmap(file, a.addr, a.len, a.prot, flags, a.offset);
+
 	if (file)
 		fput(file);
-	return retval;
+	return addr;
 }
 
 asmlinkage long
-sys32_mprotect(unsigned long start, size_t len, unsigned long prot)
+sys32_mmap2 (unsigned int addr, unsigned int len, unsigned int prot, unsigned int flags,
+	     unsigned int fd, unsigned int pgoff)
 {
+	struct file *file = NULL;
+	unsigned long retval;
 
-#ifdef	CONFIG_IA64_PAGE_SIZE_4KB
-	return(sys_mprotect(start, len, prot));
-#else	// CONFIG_IA64_PAGE_SIZE_4KB
-	if (prot == 0)
-		return(0);
-	len += start & ~PAGE_MASK;
-	if ((start & ~PAGE_MASK) && (prot & PROT_WRITE))
-		prot |= PROT_EXEC;
-	return(sys_mprotect(start & PAGE_MASK, len & PAGE_MASK, prot));
-#endif	// CONFIG_IA64_PAGE_SIZE_4KB
-}
+	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+	if (!(flags & MAP_ANONYMOUS)) {
+		file = fget(fd);
+		if (!file)
+			return -EBADF;
+	}
 
-asmlinkage long
-sys32_pipe(int *fd)
-{
-	int retval;
-	int fds[2];
+	retval = ia32_do_mmap(file, addr, len, prot, flags,
+			      (unsigned long) pgoff << IA32_PAGE_SHIFT);
 
-	retval = do_pipe(fds);
-	if (retval)
-		goto out;
-	if (copy_to_user(fd, fds, sizeof(fds)))
-		retval = -EFAULT;
-  out:
+	if (file)
+		fput(file);
 	return retval;
 }
 
 asmlinkage long
-sys32_signal (int sig, unsigned int handler)
+sys32_munmap (unsigned int start, unsigned int len)
 {
-	struct k_sigaction new_sa, old_sa;
-	int ret;
+	unsigned int end = start + len;
+	long ret;
+
+#if PAGE_SHIFT <= IA32_PAGE_SHIFT
+	ret = sys_munmap(start, end - start);
+#else
+	if (start > end)
+		return -EINVAL;
+
+	start = PAGE_ALIGN(start);
+	end = PAGE_START(end);
+
+	if (start >= end)
+		return 0;
+
+	down(&ia32_mmap_sem);
+	{
+		ret = sys_munmap(start, end - start);
+	}
+	up(&ia32_mmap_sem);
+#endif
+	return ret;
+}
 
-	new_sa.sa.sa_handler = (__sighandler_t) A(handler);
-	new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;
+#if PAGE_SHIFT > IA32_PAGE_SHIFT
+
+/*
+ * When mprotect()ing a partial page, we set the permission to the union of the old
+ * settings and the new settings.  In other words, it's only possible to make access to a
+ * partial page less restrictive.
+ */
+static long
+mprotect_subpage (unsigned long address, int new_prot)
+{
+	int old_prot;
 
-	ret = do_sigaction(sig, &new_sa, &old_sa);
+	if (new_prot == PROT_NONE)
+		return 0;		/* optimize case where nothing changes... */
 
-	return ret ? ret : (unsigned long)old_sa.sa.sa_handler;
+	old_prot = get_page_prot(address);
+	return sys_mprotect(address, PAGE_SIZE, new_prot | old_prot);
 }
 
+#endif /* PAGE_SHIFT > IA32_PAGE_SHIFT */
+
 asmlinkage long
-sys32_rt_sigaction(int sig, struct sigaction32 *act,
-		   struct sigaction32 *oact,  unsigned int sigsetsize)
+sys32_mprotect (unsigned int start, unsigned int len, int prot)
 {
-	struct k_sigaction new_ka, old_ka;
-	int ret;
-	sigset32_t set32;
+	unsigned long end = start + len;
+#if PAGE_SHIFT > IA32_PAGE_SHIFT
+	long retval = 0;
+#endif
+
+	prot = get_prot32(prot);
 
-	/* XXX: Don't preclude handling different sized sigset_t's.  */
-	if (sigsetsize != sizeof(sigset32_t))
+#if PAGE_SHIFT <= IA32_PAGE_SHIFT
+	return sys_mprotect(start, end - start, prot);
+#else
+	if (OFFSET4K(start))
 		return -EINVAL;
 
-	if (act) {
-		ret = get_user((long)new_ka.sa.sa_handler, &act->sa_handler);
-		ret |= __copy_from_user(&set32, &act->sa_mask,
-					sizeof(sigset32_t));
-		switch (_NSIG_WORDS) {
-		case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
-				| (((long)set32.sig[7]) << 32);
-		case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
-				| (((long)set32.sig[5]) << 32);
-		case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
-				| (((long)set32.sig[3]) << 32);
-		case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
-				| (((long)set32.sig[1]) << 32);
-		}
-		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
+	end = IA32_PAGE_ALIGN(end);
+	if (end < start)
+		return -EINVAL;
 
-		if (ret)
-			return -EFAULT;
-	}
+	down(&ia32_mmap_sem);
+	{
+		if (PAGE_OFF(start)) {
+			/* start address is 4KB aligned but not page aligned. */
+			retval = mprotect_subpage(PAGE_START(start), prot);
+			if (retval < 0)
+				goto out;
 
-	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+			start = PAGE_ALIGN(start);
+			if (start >= end)
+				goto out;	/* retval is already zero... */
+		}
 
-	if (!ret && oact) {
-		switch (_NSIG_WORDS) {
-		case 4:
-			set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
-			set32.sig[6] = old_ka.sa.sa_mask.sig[3];
-		case 3:
-			set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
-			set32.sig[4] = old_ka.sa.sa_mask.sig[2];
-		case 2:
-			set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
-			set32.sig[2] = old_ka.sa.sa_mask.sig[1];
-		case 1:
-			set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
-			set32.sig[0] = old_ka.sa.sa_mask.sig[0];
+		if (PAGE_OFF(end)) {
+			/* end address is 4KB aligned but not page aligned. */
+			retval = mprotect_subpage(PAGE_START(end), prot);
+			if (retval < 0)
+				return retval;
+			end = PAGE_START(end);
 		}
-		ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler);
-		ret |= __copy_to_user(&oact->sa_mask, &set32,
-				      sizeof(sigset32_t));
-		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+		retval = sys_mprotect(start, end - start, prot);
 	}
-
-	return ret;
+  out:
+	up(&ia32_mmap_sem);
+	return retval;
+#endif
 }
 
-
-extern asmlinkage long sys_rt_sigprocmask(int how, sigset_t *set, sigset_t *oset,
-					  size_t sigsetsize);
-
 asmlinkage long
-sys32_rt_sigprocmask(int how, sigset32_t *set, sigset32_t *oset,
-		     unsigned int sigsetsize)
+sys32_pipe (int *fd)
 {
-	sigset_t s;
-	sigset32_t s32;
-	int ret;
-	mm_segment_t old_fs = get_fs();
+	int retval;
+	int fds[2];
 
-	if (set) {
-		if (copy_from_user (&s32, set, sizeof(sigset32_t)))
-			return -EFAULT;
-		switch (_NSIG_WORDS) {
-		case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
-		case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
-		case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
-		case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
-		}
-	}
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL,
-				 sigsetsize);
-	set_fs (old_fs);
-	if (ret) return ret;
-	if (oset) {
-		switch (_NSIG_WORDS) {
-		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-		}
-		if (copy_to_user (oset, &s32, sizeof(sigset32_t)))
-			return -EFAULT;
-	}
-	return 0;
+	retval = do_pipe(fds);
+	if (retval)
+		goto out;
+	if (copy_to_user(fd, fds, sizeof(fds)))
+		retval = -EFAULT;
+  out:
+	return retval;
 }
 
 static inline int
@@ -498,31 +653,34 @@
 {
 	int err;
 
-	err = put_user (kbuf->f_type, &ubuf->f_type);
-	err |= __put_user (kbuf->f_bsize, &ubuf->f_bsize);
-	err |= __put_user (kbuf->f_blocks, &ubuf->f_blocks);
-	err |= __put_user (kbuf->f_bfree, &ubuf->f_bfree);
-	err |= __put_user (kbuf->f_bavail, &ubuf->f_bavail);
-	err |= __put_user (kbuf->f_files, &ubuf->f_files);
-	err |= __put_user (kbuf->f_ffree, &ubuf->f_ffree);
-	err |= __put_user (kbuf->f_namelen, &ubuf->f_namelen);
-	err |= __put_user (kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]);
-	err |= __put_user (kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1]);
+	if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
+		return -EFAULT;
+
+	err = __put_user(kbuf->f_type, &ubuf->f_type);
+	err |= __put_user(kbuf->f_bsize, &ubuf->f_bsize);
+	err |= __put_user(kbuf->f_blocks, &ubuf->f_blocks);
+	err |= __put_user(kbuf->f_bfree, &ubuf->f_bfree);
+	err |= __put_user(kbuf->f_bavail, &ubuf->f_bavail);
+	err |= __put_user(kbuf->f_files, &ubuf->f_files);
+	err |= __put_user(kbuf->f_ffree, &ubuf->f_ffree);
+	err |= __put_user(kbuf->f_namelen, &ubuf->f_namelen);
+	err |= __put_user(kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]);
+	err |= __put_user(kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1]);
 	return err;
 }
 
 extern asmlinkage long sys_statfs(const char * path, struct statfs * buf);
 
 asmlinkage long
-sys32_statfs(const char * path, struct statfs32 *buf)
+sys32_statfs (const char *path, struct statfs32 *buf)
 {
 	int ret;
 	struct statfs s;
 	mm_segment_t old_fs = get_fs();
 
-	set_fs (KERNEL_DS);
-	ret = sys_statfs((const char *)path, &s);
-	set_fs (old_fs);
+	set_fs(KERNEL_DS);
+	ret = sys_statfs(path, &s);
+	set_fs(old_fs);
 	if (put_statfs(buf, &s))
 		return -EFAULT;
 	return ret;
@@ -531,15 +689,15 @@
 extern asmlinkage long sys_fstatfs(unsigned int fd, struct statfs * buf);
 
 asmlinkage long
-sys32_fstatfs(unsigned int fd, struct statfs32 *buf)
+sys32_fstatfs (unsigned int fd, struct statfs32 *buf)
 {
 	int ret;
 	struct statfs s;
 	mm_segment_t old_fs = get_fs();
 
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_fstatfs(fd, &s);
-	set_fs (old_fs);
+	set_fs(old_fs);
 	if (put_statfs(buf, &s))
 		return -EFAULT;
 	return ret;
@@ -557,23 +715,21 @@
 };
 
 static inline long
-get_tv32(struct timeval *o, struct timeval32 *i)
+get_tv32 (struct timeval *o, struct timeval32 *i)
 {
 	return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
-		(__get_user(o->tv_sec, &i->tv_sec) |
-		 __get_user(o->tv_usec, &i->tv_usec)));
+		(__get_user(o->tv_sec, &i->tv_sec) | __get_user(o->tv_usec, &i->tv_usec)));
 }
 
 static inline long
-put_tv32(struct timeval32 *o, struct timeval *i)
+put_tv32 (struct timeval32 *o, struct timeval *i)
 {
 	return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
-		(__put_user(i->tv_sec, &o->tv_sec) |
-		 __put_user(i->tv_usec, &o->tv_usec)));
+		(__put_user(i->tv_sec, &o->tv_sec) | __put_user(i->tv_usec, &o->tv_usec)));
 }
 
 static inline long
-get_it32(struct itimerval *o, struct itimerval32 *i)
+get_it32 (struct itimerval *o, struct itimerval32 *i)
 {
 	return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
 		(__get_user(o->it_interval.tv_sec, &i->it_interval.tv_sec) |
@@ -583,7 +739,7 @@
 }
 
 static inline long
-put_it32(struct itimerval32 *o, struct itimerval *i)
+put_it32 (struct itimerval32 *o, struct itimerval *i)
 {
 	return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
 		(__put_user(i->it_interval.tv_sec, &o->it_interval.tv_sec) |
@@ -592,10 +748,10 @@
 		 __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
 }
 
-extern int do_getitimer(int which, struct itimerval *value);
+extern int do_getitimer (int which, struct itimerval *value);
 
 asmlinkage long
-sys32_getitimer(int which, struct itimerval32 *it)
+sys32_getitimer (int which, struct itimerval32 *it)
 {
 	struct itimerval kit;
 	int error;
@@ -607,10 +763,10 @@
 	return error;
 }
 
-extern int do_setitimer(int which, struct itimerval *, struct itimerval *);
+extern int do_setitimer (int which, struct itimerval *, struct itimerval *);
 
 asmlinkage long
-sys32_setitimer(int which, struct itimerval32 *in, struct itimerval32 *out)
+sys32_setitimer (int which, struct itimerval32 *in, struct itimerval32 *out)
 {
 	struct itimerval kin, kout;
 	int error;
@@ -630,8 +786,9 @@
 	return 0;
 
 }
+
 asmlinkage unsigned long
-sys32_alarm(unsigned int seconds)
+sys32_alarm (unsigned int seconds)
 {
 	struct itimerval it_new, it_old;
 	unsigned int oldalarm;
@@ -660,7 +817,7 @@
 extern asmlinkage long sys_gettimeofday (struct timeval *tv, struct timezone *tz);
 
 asmlinkage long
-ia32_utime(char * filename, struct utimbuf_32 *times32)
+sys32_utime (char *filename, struct utimbuf_32 *times32)
 {
 	mm_segment_t old_fs = get_fs();
 	struct timeval tv[2], *tvp;
@@ -673,20 +830,20 @@
 		if (get_user(tv[1].tv_sec, &times32->mtime))
 			return -EFAULT;
 		tv[1].tv_usec = 0;
-		set_fs (KERNEL_DS);
+		set_fs(KERNEL_DS);
 		tvp = tv;
 	} else
 		tvp = NULL;
 	ret = sys_utimes(filename, tvp);
-	set_fs (old_fs);
+	set_fs(old_fs);
 	return ret;
 }
 
 extern struct timezone sys_tz;
-extern int do_sys_settimeofday(struct timeval *tv, struct timezone *tz);
+extern int do_sys_settimeofday (struct timeval *tv, struct timezone *tz);
 
 asmlinkage long
-sys32_gettimeofday(struct timeval32 *tv, struct timezone *tz)
+sys32_gettimeofday (struct timeval32 *tv, struct timezone *tz)
 {
 	if (tv) {
 		struct timeval ktv;
@@ -702,7 +859,7 @@
 }
 
 asmlinkage long
-sys32_settimeofday(struct timeval32 *tv, struct timezone *tz)
+sys32_settimeofday (struct timeval32 *tv, struct timezone *tz)
 {
 	struct timeval ktv;
 	struct timezone ktz;
@@ -719,20 +876,6 @@
 	return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);
 }
 
-struct linux32_dirent {
-	u32	d_ino;
-	u32	d_off;
-	u16	d_reclen;
-	char	d_name[1];
-};
-
-struct old_linux32_dirent {
-	u32	d_ino;
-	u32	d_offset;
-	u16	d_namlen;
-	char	d_name[1];
-};
-
 struct getdents32_callback {
 	struct linux32_dirent * current_dir;
 	struct linux32_dirent * previous;
@@ -775,7 +918,7 @@
 }
 
 asmlinkage long
-sys32_getdents (unsigned int fd, void * dirent, unsigned int count)
+sys32_getdents (unsigned int fd, struct linux32_dirent *dirent, unsigned int count)
 {
 	struct file * file;
 	struct linux32_dirent * lastdirent;
@@ -787,7 +930,7 @@
 	if (!file)
 		goto out;
 
-	buf.current_dir = (struct linux32_dirent *) dirent;
+	buf.current_dir = dirent;
 	buf.previous = NULL;
 	buf.count = count;
 	buf.error = 0;
@@ -831,7 +974,7 @@
 }
 
 asmlinkage long
-sys32_readdir (unsigned int fd, void * dirent, unsigned int count)
+sys32_readdir (unsigned int fd, void *dirent, unsigned int count)
 {
 	int error;
 	struct file * file;
@@ -866,7 +1009,7 @@
 #define ROUND_UP_TIME(x,y) (((x)+(y)-1)/(y))
 
 asmlinkage long
-sys32_select(int n, fd_set *inp, fd_set *outp, fd_set *exp, struct timeval32 *tvp32)
+sys32_select (int n, fd_set *inp, fd_set *outp, fd_set *exp, struct timeval32 *tvp32)
 {
 	fd_set_bits fds;
 	char *bits;
@@ -878,8 +1021,7 @@
 		time_t sec, usec;
 
 		ret = -EFAULT;
-		if (get_user(sec, &tvp32->tv_sec)
-		    || get_user(usec, &tvp32->tv_usec))
+		if (get_user(sec, &tvp32->tv_sec) || get_user(usec, &tvp32->tv_usec))
 			goto out_nofds;
 
 		ret = -EINVAL;
@@ -933,9 +1075,7 @@
 			usec = timeout % HZ;
 			usec *= (1000000/HZ);
 		}
-		if (put_user(sec, (int *)&tvp32->tv_sec)
-		    || put_user(usec, (int *)&tvp32->tv_usec))
-		{
+		if (put_user(sec, &tvp32->tv_sec) || put_user(usec, &tvp32->tv_usec)) {
 			ret = -EFAULT;
 			goto out;
 		}
@@ -969,50 +1109,43 @@
 };
 
 asmlinkage long
-old_select(struct sel_arg_struct *arg)
+sys32_old_select (struct sel_arg_struct *arg)
 {
 	struct sel_arg_struct a;
 
 	if (copy_from_user(&a, arg, sizeof(a)))
 		return -EFAULT;
-	return sys32_select(a.n, (fd_set *)A(a.inp), (fd_set *)A(a.outp), (fd_set *)A(a.exp),
-			    (struct timeval32 *)A(a.tvp));
+	return sys32_select(a.n, (fd_set *) A(a.inp), (fd_set *) A(a.outp), (fd_set *) A(a.exp),
+			    (struct timeval32 *) A(a.tvp));
 }
 
-struct timespec32 {
-	int	tv_sec;
-	int	tv_nsec;
-};
-
-extern asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp);
+extern asmlinkage long sys_nanosleep (struct timespec *rqtp, struct timespec *rmtp);
 
 asmlinkage long
-sys32_nanosleep(struct timespec32 *rqtp, struct timespec32 *rmtp)
+sys32_nanosleep (struct timespec32 *rqtp, struct timespec32 *rmtp)
 {
 	struct timespec t;
 	int ret;
-	mm_segment_t old_fs = get_fs ();
+	mm_segment_t old_fs = get_fs();
 
-	if (get_user (t.tv_sec, &rqtp->tv_sec) ||
-	    __get_user (t.tv_nsec, &rqtp->tv_nsec))
+	if (get_user (t.tv_sec, &rqtp->tv_sec) || get_user (t.tv_nsec, &rqtp->tv_nsec))
 		return -EFAULT;
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_nanosleep(&t, rmtp ? &t : NULL);
-	set_fs (old_fs);
+	set_fs(old_fs);
 	if (rmtp && ret == -EINTR) {
-		if (__put_user (t.tv_sec, &rmtp->tv_sec) ||
-		    __put_user (t.tv_nsec, &rmtp->tv_nsec))
+		if (put_user(t.tv_sec, &rmtp->tv_sec) || put_user(t.tv_nsec, &rmtp->tv_nsec))
 			return -EFAULT;
 	}
 	return ret;
 }
 
 struct iovec32 { unsigned int iov_base; int iov_len; };
-asmlinkage ssize_t sys_readv(unsigned long,const struct iovec *,unsigned long);
-asmlinkage ssize_t sys_writev(unsigned long,const struct iovec *,unsigned long);
+asmlinkage ssize_t sys_readv (unsigned long,const struct iovec *,unsigned long);
+asmlinkage ssize_t sys_writev (unsigned long,const struct iovec *,unsigned long);
 
 static struct iovec *
-get_iovec32(struct iovec32 *iov32, struct iovec *iov_buf, u32 count, int type)
+get_iovec32 (struct iovec32 *iov32, struct iovec *iov_buf, u32 count, int type)
 {
 	int i;
 	u32 buf, len;
@@ -1022,24 +1155,23 @@
 
 	if (!count)
 		return 0;
-	if(verify_area(VERIFY_READ, iov32, sizeof(struct iovec32)*count))
-		return(struct iovec *)0;
+	if (verify_area(VERIFY_READ, iov32, sizeof(struct iovec32)*count))
+		return NULL;
 	if (count > UIO_MAXIOV)
-		return(struct iovec *)0;
+		return NULL;
 	if (count > UIO_FASTIOV) {
 		iov = kmalloc(count*sizeof(struct iovec), GFP_KERNEL);
 		if (!iov)
-			return((struct iovec *)0);
+			return NULL;
 	} else
 		iov = iov_buf;
 
 	ivp = iov;
 	for (i = 0; i < count; i++) {
-		if (__get_user(len, &iov32->iov_len) ||
-		    __get_user(buf, &iov32->iov_base)) {
+		if (__get_user(len, &iov32->iov_len) || __get_user(buf, &iov32->iov_base)) {
 			if (iov != iov_buf)
 				kfree(iov);
-			return((struct iovec *)0);
+			return NULL;
 		}
 		if (verify_area(type, (void *)A(buf), len)) {
 			if (iov != iov_buf)
@@ -1047,22 +1179,23 @@
 			return((struct iovec *)0);
 		}
 		ivp->iov_base = (void *)A(buf);
-		ivp->iov_len = (__kernel_size_t)len;
+		ivp->iov_len = (__kernel_size_t) len;
 		iov32++;
 		ivp++;
 	}
-	return(iov);
+	return iov;
 }
 
 asmlinkage long
-sys32_readv(int fd, struct iovec32 *vector, u32 count)
+sys32_readv (int fd, struct iovec32 *vector, u32 count)
 {
 	struct iovec iovstack[UIO_FASTIOV];
 	struct iovec *iov;
-	int ret;
+	long ret;
 	mm_segment_t old_fs = get_fs();
 
-	if ((iov = get_iovec32(vector, iovstack, count, VERIFY_WRITE)) == (struct iovec *)0)
+	iov = get_iovec32(vector, iovstack, count, VERIFY_WRITE);
+	if (!iov)
 		return -EFAULT;
 	set_fs(KERNEL_DS);
 	ret = sys_readv(fd, iov, count);
@@ -1073,14 +1206,15 @@
 }
 
 asmlinkage long
-sys32_writev(int fd, struct iovec32 *vector, u32 count)
+sys32_writev (int fd, struct iovec32 *vector, u32 count)
 {
 	struct iovec iovstack[UIO_FASTIOV];
 	struct iovec *iov;
-	int ret;
+	long ret;
 	mm_segment_t old_fs = get_fs();
 
-	if ((iov = get_iovec32(vector, iovstack, count, VERIFY_READ)) == (struct iovec *)0)
+	iov = get_iovec32(vector, iovstack, count, VERIFY_READ);
+	if (!iov)
 		return -EFAULT;
 	set_fs(KERNEL_DS);
 	ret = sys_writev(fd, iov, count);
@@ -1098,45 +1232,66 @@
 	int	rlim_max;
 };
 
-extern asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit *rlim);
+extern asmlinkage long sys_getrlimit (unsigned int resource, struct rlimit *rlim);
 
 asmlinkage long
-sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
+sys32_old_getrlimit (unsigned int resource, struct rlimit32 *rlim)
 {
+	mm_segment_t old_fs = get_fs();
+	struct rlimit r;
+	int ret;
+
+	set_fs(KERNEL_DS);
+	ret = sys_getrlimit(resource, &r);
+	set_fs(old_fs);
+	if (!ret) {
+		ret = put_user(RESOURCE32(r.rlim_cur), &rlim->rlim_cur);
+		ret |= put_user(RESOURCE32(r.rlim_max), &rlim->rlim_max);
+	}
+	return ret;
+}
+
+asmlinkage long
+sys32_getrlimit (unsigned int resource, struct rlimit32 *rlim)
+{
+	mm_segment_t old_fs = get_fs();
 	struct rlimit r;
 	int ret;
-	mm_segment_t old_fs = get_fs ();
 
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_getrlimit(resource, &r);
-	set_fs (old_fs);
+	set_fs(old_fs);
 	if (!ret) {
-		ret = put_user (RESOURCE32(r.rlim_cur), &rlim->rlim_cur);
-		ret |= __put_user (RESOURCE32(r.rlim_max), &rlim->rlim_max);
+		if (r.rlim_cur >= 0xffffffff)
+			r.rlim_cur = 0xffffffff;
+		if (r.rlim_max >= 0xffffffff)
+			r.rlim_max = 0xffffffff;
+		ret = put_user(r.rlim_cur, &rlim->rlim_cur);
+		ret |= put_user(r.rlim_max, &rlim->rlim_max);
 	}
 	return ret;
 }
 
-extern asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit *rlim);
+extern asmlinkage long sys_setrlimit (unsigned int resource, struct rlimit *rlim);
 
 asmlinkage long
-sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
+sys32_setrlimit (unsigned int resource, struct rlimit32 *rlim)
 {
 	struct rlimit r;
 	int ret;
-	mm_segment_t old_fs = get_fs ();
+	mm_segment_t old_fs = get_fs();
 
-	if (resource >= RLIM_NLIMITS) return -EINVAL;
-	if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
-	    __get_user (r.rlim_max, &rlim->rlim_max))
+	if (resource >= RLIM_NLIMITS)
+		return -EINVAL;
+	if (get_user(r.rlim_cur, &rlim->rlim_cur) || get_user(r.rlim_max, &rlim->rlim_max))
 		return -EFAULT;
 	if (r.rlim_cur == RLIM_INFINITY32)
 		r.rlim_cur = RLIM_INFINITY;
 	if (r.rlim_max == RLIM_INFINITY32)
 		r.rlim_max = RLIM_INFINITY;
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_setrlimit(resource, &r);
-	set_fs (old_fs);
+	set_fs(old_fs);
 	return ret;
 }
 
@@ -1154,25 +1309,141 @@
 	unsigned	msg_flags;
 };
 
-static inline int
-shape_msg(struct msghdr *mp, struct msghdr32 *mp32)
-{
-	int ret;
-	unsigned int i;
+struct cmsghdr32 {
+	__kernel_size_t32 cmsg_len;
+	int               cmsg_level;
+	int               cmsg_type;
+};
 
-	if (!access_ok(VERIFY_READ, mp32, sizeof(*mp32)))
-		return(-EFAULT);
-	ret = __get_user(i, &mp32->msg_name);
-	mp->msg_name = (void *)A(i);
-	ret |= __get_user(mp->msg_namelen, &mp32->msg_namelen);
-	ret |= __get_user(i, &mp32->msg_iov);
+/* Bleech... */
+#define __CMSG32_NXTHDR(ctl, len, cmsg, cmsglen) __cmsg32_nxthdr((ctl),(len),(cmsg),(cmsglen))
+#define CMSG32_NXTHDR(mhdr, cmsg, cmsglen)	cmsg32_nxthdr((mhdr), (cmsg), (cmsglen))
+#define CMSG32_ALIGN(len) ( ((len)+sizeof(int)-1) & ~(sizeof(int)-1) )
+#define CMSG32_DATA(cmsg) \
+	((void *)((char *)(cmsg) + CMSG32_ALIGN(sizeof(struct cmsghdr32))))
+#define CMSG32_SPACE(len) \
+	(CMSG32_ALIGN(sizeof(struct cmsghdr32)) + CMSG32_ALIGN(len))
+#define CMSG32_LEN(len) (CMSG32_ALIGN(sizeof(struct cmsghdr32)) + (len))
+#define __CMSG32_FIRSTHDR(ctl,len) \
+	((len) >= sizeof(struct cmsghdr32) ? (struct cmsghdr32 *)(ctl) : (struct cmsghdr32 *)NULL)
+#define CMSG32_FIRSTHDR(msg)	__CMSG32_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
+
+static inline struct cmsghdr32 *
+__cmsg32_nxthdr (void *ctl, __kernel_size_t size, struct cmsghdr32 *cmsg, int cmsg_len)
+{
+	struct cmsghdr32 * ptr;
+
+	ptr = (struct cmsghdr32 *)(((unsigned char *) cmsg) + CMSG32_ALIGN(cmsg_len));
+	if ((unsigned long)((char*)(ptr+1) - (char *) ctl) > size)
+		return NULL;
+	return ptr;
+}
+
+static inline struct cmsghdr32 *
+cmsg32_nxthdr (struct msghdr *msg, struct cmsghdr32 *cmsg, int cmsg_len)
+{
+	return __cmsg32_nxthdr(msg->msg_control, msg->msg_controllen, cmsg, cmsg_len);
+}
+
+static inline int
+get_msghdr32 (struct msghdr *mp, struct msghdr32 *mp32)
+{
+	int ret;
+	unsigned int i;
+
+	if (!access_ok(VERIFY_READ, mp32, sizeof(*mp32)))
+		return -EFAULT;
+	ret = __get_user(i, &mp32->msg_name);
+	mp->msg_name = (void *)A(i);
+	ret |= __get_user(mp->msg_namelen, &mp32->msg_namelen);
+	ret |= __get_user(i, &mp32->msg_iov);
 	mp->msg_iov = (struct iovec *)A(i);
 	ret |= __get_user(mp->msg_iovlen, &mp32->msg_iovlen);
 	ret |= __get_user(i, &mp32->msg_control);
 	mp->msg_control = (void *)A(i);
 	ret |= __get_user(mp->msg_controllen, &mp32->msg_controllen);
 	ret |= __get_user(mp->msg_flags, &mp32->msg_flags);
-	return(ret ? -EFAULT : 0);
+	return ret ? -EFAULT : 0;
+}
+
+/*
+ * There is a lot of hair here because the alignment rules (and thus placement) of cmsg
+ * headers and length are different for 32-bit apps.  -DaveM
+ */
+static int
+get_cmsghdr32 (struct msghdr *kmsg, unsigned char *stackbuf, struct sock *sk, size_t *bufsize)
+{
+	struct cmsghdr *kcmsg, *kcmsg_base;
+	__kernel_size_t kcmlen, tmp;
+	__kernel_size_t32 ucmlen;
+	struct cmsghdr32 *ucmsg;
+	long err;
+
+	kcmlen = 0;
+	kcmsg_base = kcmsg = (struct cmsghdr *)stackbuf;
+	ucmsg = CMSG32_FIRSTHDR(kmsg);
+	while (ucmsg != NULL) {
+		if (get_user(ucmlen, &ucmsg->cmsg_len))
+			return -EFAULT;
+
+		/* Catch bogons. */
+		if (CMSG32_ALIGN(ucmlen) < CMSG32_ALIGN(sizeof(struct cmsghdr32)))
+			return -EINVAL;
+		if ((unsigned long)(((char *)ucmsg - (char *)kmsg->msg_control) + ucmlen)
+		    > kmsg->msg_controllen)
+			return -EINVAL;
+
+		tmp = ((ucmlen - CMSG32_ALIGN(sizeof(*ucmsg))) +
+		       CMSG_ALIGN(sizeof(struct cmsghdr)));
+		kcmlen += tmp;
+		ucmsg = CMSG32_NXTHDR(kmsg, ucmsg, ucmlen);
+	}
+	if (kcmlen == 0)
+		return -EINVAL;
+
+	/*
+	 * The kcmlen holds the 64-bit version of the control length.  It may not be
+	 * modified as we do not stick it into the kmsg until we have successfully copied
+	 * over all of the data from the user.
+	 */
+	if (kcmlen > *bufsize) {
+		*bufsize = kcmlen;
+		kcmsg_base = kcmsg = sock_kmalloc(sk, kcmlen, GFP_KERNEL);
+	}
+	if (kcmsg == NULL)
+		return -ENOBUFS;
+
+	/* Now copy them over neatly. */
+	memset(kcmsg, 0, kcmlen);
+	ucmsg = CMSG32_FIRSTHDR(kmsg);
+	while (ucmsg != NULL) {
+		err = get_user(ucmlen, &ucmsg->cmsg_len);
+		tmp = ((ucmlen - CMSG32_ALIGN(sizeof(*ucmsg))) +
+		       CMSG_ALIGN(sizeof(struct cmsghdr)));
+		kcmsg->cmsg_len = tmp;
+		err |= get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level);
+		err |= get_user(kcmsg->cmsg_type, &ucmsg->cmsg_type);
+
+		/* Copy over the data. */
+		err |= copy_from_user(CMSG_DATA(kcmsg), CMSG32_DATA(ucmsg),
+				      (ucmlen - CMSG32_ALIGN(sizeof(*ucmsg))));
+		if (err)
+			goto out_free_efault;
+
+		/* Advance. */
+		kcmsg = (struct cmsghdr *)((char *)kcmsg + CMSG_ALIGN(tmp));
+		ucmsg = CMSG32_NXTHDR(kmsg, ucmsg, ucmlen);
+	}
+
+	/* Ok, looks like we made it.  Hook it up and return success. */
+	kmsg->msg_control = kcmsg_base;
+	kmsg->msg_controllen = kcmlen;
+	return 0;
+
+out_free_efault:
+	if (kcmsg_base != (struct cmsghdr *)stackbuf)
+		sock_kfree_s(sk, kcmsg_base, kcmlen);
+	return -EFAULT;
 }
 
 /*
@@ -1187,20 +1458,17 @@
  */
 
 static inline int
-verify_iovec32(struct msghdr *m, struct iovec *iov, char *address, int mode)
+verify_iovec32 (struct msghdr *m, struct iovec *iov, char *address, int mode)
 {
 	int size, err, ct;
 	struct iovec32 *iov32;
 
-	if(m->msg_namelen)
-	{
-		if(mode==VERIFY_READ)
-		{
-			err=move_addr_to_kernel(m->msg_name, m->msg_namelen, address);
-			if(err<0)
+	if (m->msg_namelen) {
+		if (mode == VERIFY_READ) {
+			err = move_addr_to_kernel(m->msg_name, m->msg_namelen, address);
+			if (err < 0)
 				goto out;
 		}
-
 		m->msg_name = address;
 	} else
 		m->msg_name = NULL;
@@ -1209,7 +1477,7 @@
 	size = m->msg_iovlen * sizeof(struct iovec32);
 	if (copy_from_user(iov, m->msg_iov, size))
 		goto out;
-	m->msg_iov=iov;
+	m->msg_iov = iov;
 
 	err = 0;
 	iov32 = (struct iovec32 *)iov;
@@ -1222,8 +1490,188 @@
 	return err;
 }
 
-extern __inline__ void
-sockfd_put(struct socket *sock)
+static void
+put_cmsg32(struct msghdr *kmsg, int level, int type, int len, void *data)
+{
+	struct cmsghdr32 *cm = (struct cmsghdr32 *) kmsg->msg_control;
+	struct cmsghdr32 cmhdr;
+	int cmlen = CMSG32_LEN(len);
+
+	if(cm == NULL || kmsg->msg_controllen < sizeof(*cm)) {
+		kmsg->msg_flags |= MSG_CTRUNC;
+		return;
+	}
+
+	if(kmsg->msg_controllen < cmlen) {
+		kmsg->msg_flags |= MSG_CTRUNC;
+		cmlen = kmsg->msg_controllen;
+	}
+	cmhdr.cmsg_level = level;
+	cmhdr.cmsg_type = type;
+	cmhdr.cmsg_len = cmlen;
+
+	if(copy_to_user(cm, &cmhdr, sizeof cmhdr))
+		return;
+	if(copy_to_user(CMSG32_DATA(cm), data,
+			cmlen - sizeof(struct cmsghdr32)))
+		return;
+	cmlen = CMSG32_SPACE(len);
+	kmsg->msg_control += cmlen;
+	kmsg->msg_controllen -= cmlen;
+}
+
+static void
+scm_detach_fds32 (struct msghdr *kmsg, struct scm_cookie *scm)
+{
+	struct cmsghdr32 *cm = (struct cmsghdr32 *) kmsg->msg_control;
+	int fdmax = (kmsg->msg_controllen - sizeof(struct cmsghdr32))
+		/ sizeof(int);
+	int fdnum = scm->fp->count;
+	struct file **fp = scm->fp->fp;
+	int *cmfptr;
+	int err = 0, i;
+
+	if (fdnum < fdmax)
+		fdmax = fdnum;
+
+	for (i = 0, cmfptr = (int *) CMSG32_DATA(cm);
+	     i < fdmax;
+	     i++, cmfptr++) {
+		int new_fd;
+		err = get_unused_fd();
+		if (err < 0)
+			break;
+		new_fd = err;
+		err = put_user(new_fd, cmfptr);
+		if (err) {
+			put_unused_fd(new_fd);
+			break;
+		}
+		/* Bump the usage count and install the file. */
+		get_file(fp[i]);
+		current->files->fd[new_fd] = fp[i];
+	}
+
+	if (i > 0) {
+		int cmlen = CMSG32_LEN(i * sizeof(int));
+		if (!err)
+			err = put_user(SOL_SOCKET, &cm->cmsg_level);
+		if (!err)
+			err = put_user(SCM_RIGHTS, &cm->cmsg_type);
+		if (!err)
+			err = put_user(cmlen, &cm->cmsg_len);
+		if (!err) {
+			cmlen = CMSG32_SPACE(i * sizeof(int));
+			kmsg->msg_control += cmlen;
+			kmsg->msg_controllen -= cmlen;
+		}
+	}
+	if (i < fdnum)
+		kmsg->msg_flags |= MSG_CTRUNC;
+
+	/*
+	 * All of the files that fit in the message have had their
+	 * usage counts incremented, so we just free the list.
+	 */
+	__scm_destroy(scm);
+}
+
+/*
+ * In these cases we (currently) can just copy to data over verbatim because all CMSGs
+ * created by the kernel have well defined types which have the same layout in both the
+ * 32-bit and 64-bit API.  One must add some special cased conversions here if we start
+ * sending control messages with incompatible types.
+ *
+ * SCM_RIGHTS and SCM_CREDENTIALS are done by hand in recvmsg32 right after
+ * we do our work.  The remaining cases are:
+ *
+ * SOL_IP	IP_PKTINFO	struct in_pktinfo	32-bit clean
+ *		IP_TTL		int			32-bit clean
+ *		IP_TOS		__u8			32-bit clean
+ *		IP_RECVOPTS	variable length		32-bit clean
+ *		IP_RETOPTS	variable length		32-bit clean
+ *		(these last two are clean because the types are defined
+ *		 by the IPv4 protocol)
+ *		IP_RECVERR	struct sock_extended_err +
+ *				struct sockaddr_in	32-bit clean
+ * SOL_IPV6	IPV6_RECVERR	struct sock_extended_err +
+ *				struct sockaddr_in6	32-bit clean
+ *		IPV6_PKTINFO	struct in6_pktinfo	32-bit clean
+ *		IPV6_HOPLIMIT	int			32-bit clean
+ *		IPV6_FLOWINFO	u32			32-bit clean
+ *		IPV6_HOPOPTS	ipv6 hop exthdr		32-bit clean
+ *		IPV6_DSTOPTS	ipv6 dst exthdr(s)	32-bit clean
+ *		IPV6_RTHDR	ipv6 routing exthdr	32-bit clean
+ *		IPV6_AUTHHDR	ipv6 auth exthdr	32-bit clean
+ */
+static void
+cmsg32_recvmsg_fixup (struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
+{
+	unsigned char *workbuf, *wp;
+	unsigned long bufsz, space_avail;
+	struct cmsghdr *ucmsg;
+	long err;
+
+	bufsz = ((unsigned long)kmsg->msg_control) - orig_cmsg_uptr;
+	space_avail = kmsg->msg_controllen + bufsz;
+	wp = workbuf = kmalloc(bufsz, GFP_KERNEL);
+	if (workbuf == NULL)
+		goto fail;
+
+	/* To make this more sane we assume the kernel sends back properly
+	 * formatted control messages.  Because of how the kernel will truncate
+	 * the cmsg_len for MSG_TRUNC cases, we need not check that case either.
+	 */
+	ucmsg = (struct cmsghdr *) orig_cmsg_uptr;
+	while (((unsigned long)ucmsg) < ((unsigned long)kmsg->msg_control)) {
+		struct cmsghdr32 *kcmsg32 = (struct cmsghdr32 *) wp;
+		int clen64, clen32;
+
+		/*
+		 * UCMSG is the 64-bit format CMSG entry in user-space.  KCMSG32 is within
+		 * the kernel space temporary buffer we use to convert into a 32-bit style
+		 * CMSG.
+		 */
+		err = get_user(kcmsg32->cmsg_len, &ucmsg->cmsg_len);
+		err |= get_user(kcmsg32->cmsg_level, &ucmsg->cmsg_level);
+		err |= get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
+		if (err)
+			goto fail2;
+
+		clen64 = kcmsg32->cmsg_len;
+		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
+			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
+		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
+			  CMSG32_ALIGN(sizeof(struct cmsghdr32)));
+		kcmsg32->cmsg_len = clen32;
+
+		ucmsg = (struct cmsghdr *) (((char *)ucmsg) + CMSG_ALIGN(clen64));
+		wp = (((char *)kcmsg32) + CMSG32_ALIGN(clen32));
+	}
+
+	/* Copy back fixed up data, and adjust pointers. */
+	bufsz = (wp - workbuf);
+	if (copy_to_user((void *)orig_cmsg_uptr, workbuf, bufsz))
+		goto fail2;
+
+	kmsg->msg_control = (struct cmsghdr *) (((char *)orig_cmsg_uptr) + bufsz);
+	kmsg->msg_controllen = space_avail - bufsz;
+	kfree(workbuf);
+	return;
+
+  fail2:
+	kfree(workbuf);
+  fail:
+	/*
+	 * If we leave the 64-bit format CMSG chunks in there, the application could get
+	 * confused and crash.  So to ensure greater recovery, we report no CMSGs.
+	 */
+	kmsg->msg_controllen += bufsz;
+	kmsg->msg_control = (void *) orig_cmsg_uptr;
+}
+
+static inline void
+sockfd_put (struct socket *sock)
 {
 	fput(sock->file);
 }
@@ -1234,13 +1682,14 @@
 					   24 for IPv6,
 					   about 80 for AX.25 */
 
-extern struct socket *sockfd_lookup(int fd, int *err);
+extern struct socket *sockfd_lookup (int fd, int *err);
 
 /*
  *	BSD sendmsg interface
  */
 
-int sys32_sendmsg(int fd, struct msghdr32 *msg, unsigned flags)
+int
+sys32_sendmsg (int fd, struct msghdr32 *msg, unsigned flags)
 {
 	struct socket *sock;
 	char address[MAX_SOCK_ADDR];
@@ -1248,10 +1697,11 @@
 	unsigned char ctl[sizeof(struct cmsghdr) + 20];	/* 20 is size of ipv6_pktinfo */
 	unsigned char *ctl_buf = ctl;
 	struct msghdr msg_sys;
-	int err, ctl_len, iov_size, total_len;
+	int err, iov_size, total_len;
+	size_t ctl_len;
 
 	err = -EFAULT;
-	if (shape_msg(&msg_sys, msg))
+	if (get_msghdr32(&msg_sys, msg))
 		goto out;
 
 	sock = sockfd_lookup(fd, &err);
@@ -1282,20 +1732,12 @@
 
 	if (msg_sys.msg_controllen > INT_MAX)
 		goto out_freeiov;
-	ctl_len = msg_sys.msg_controllen;
-	if (ctl_len)
-	{
-		if (ctl_len > sizeof(ctl))
-		{
-			err = -ENOBUFS;
-			ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);
-			if (ctl_buf == NULL)
-				goto out_freeiov;
-		}
-		err = -EFAULT;
-		if (copy_from_user(ctl_buf, msg_sys.msg_control, ctl_len))
-			goto out_freectl;
-		msg_sys.msg_control = ctl_buf;
+	if (msg_sys.msg_controllen) {
+		ctl_len = sizeof(ctl);
+		err = get_cmsghdr32(&msg_sys, ctl_buf, sock->sk, &ctl_len);
+		if (err)
+			goto out_freeiov;
+		ctl_buf = msg_sys.msg_control;
 	}
 	msg_sys.msg_flags = flags;
 
@@ -1303,7 +1745,6 @@
 		msg_sys.msg_flags |= MSG_DONTWAIT;
 	err = sock_sendmsg(sock, &msg_sys, total_len);
 
-out_freectl:
 	if (ctl_buf != ctl)
 		sock_kfree_s(sock->sk, ctl_buf, ctl_len);
 out_freeiov:
@@ -1328,6 +1769,7 @@
 	struct msghdr msg_sys;
 	unsigned long cmsg_ptr;
 	int err, iov_size, total_len, len;
+	struct scm_cookie scm;
 
 	/* kernel mode address */
 	char addr[MAX_SOCK_ADDR];
@@ -1336,8 +1778,8 @@
 	struct sockaddr *uaddr;
 	int *uaddr_len;
 
-	err=-EFAULT;
-	if (shape_msg(&msg_sys, msg))
+	err = -EFAULT;
+	if (get_msghdr32(&msg_sys, msg))
 		goto out;
 
 	sock = sockfd_lookup(fd, &err);
@@ -1374,13 +1816,42 @@
 
 	if (sock->file->f_flags & O_NONBLOCK)
 		flags |= MSG_DONTWAIT;
-	err = sock_recvmsg(sock, &msg_sys, total_len, flags);
-	if (err < 0)
-		goto out_freeiov;
-	len = err;
 
-	if (uaddr != NULL) {
-		err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, uaddr_len);
+	memset(&scm, 0, sizeof(scm));
+
+	lock_kernel();
+	{
+		err = sock->ops->recvmsg(sock, &msg_sys, total_len, flags, &scm);
+		if (err < 0)
+			goto out_unlock_freeiov;
+
+		len = err;
+		if (!msg_sys.msg_control) {
+			if (sock->passcred || scm.fp)
+				msg_sys.msg_flags |= MSG_CTRUNC;
+			if (scm.fp)
+				__scm_destroy(&scm);
+		} else {
+			/*
+			 * If recvmsg processing itself placed some control messages into
+			 * user space, it's is using 64-bit CMSG processing, so we need to
+			 * fix it up before we tack on more stuff.
+			 */
+			if ((unsigned long) msg_sys.msg_control != cmsg_ptr)
+				cmsg32_recvmsg_fixup(&msg_sys, cmsg_ptr);
+
+			/* Wheee... */
+			if (sock->passcred)
+				put_cmsg32(&msg_sys, SOL_SOCKET, SCM_CREDENTIALS,
+					   sizeof(scm.creds), &scm.creds);
+			if (scm.fp != NULL)
+				scm_detach_fds32(&msg_sys, &scm);
+		}
+	}
+	unlock_kernel();
+
+	if (uaddr != NULL) {
+		err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, uaddr_len);
 		if (err < 0)
 			goto out_freeiov;
 	}
@@ -1393,20 +1864,23 @@
 		goto out_freeiov;
 	err = len;
 
-out_freeiov:
+  out_freeiov:
 	if (iov != iovstack)
 		sock_kfree_s(sock->sk, iov, iov_size);
-out_put:
+  out_put:
 	sockfd_put(sock);
-out:
+  out:
 	return err;
+
+  out_unlock_freeiov:
+	goto out_freeiov;
 }
 
 /* Argument list sizes for sys_socketcall */
 #define AL(x) ((x) * sizeof(u32))
-static unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
-				AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
-				AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)};
+static const unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
+				    AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
+				    AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)};
 #undef AL
 
 extern asmlinkage long sys_bind(int fd, struct sockaddr *umyaddr, int addrlen);
@@ -1435,7 +1909,8 @@
 extern asmlinkage long sys_shutdown(int fd, int how);
 extern asmlinkage long sys_listen(int fd, int backlog);
 
-asmlinkage long sys32_socketcall(int call, u32 *args)
+asmlinkage long
+sys32_socketcall (int call, u32 *args)
 {
 	int ret;
 	u32 a[6];
@@ -1463,16 +1938,13 @@
 			ret = sys_listen(a0, a1);
 			break;
 		case SYS_ACCEPT:
-			ret = sys_accept(a0, (struct sockaddr *)A(a1),
-					  (int *)A(a[2]));
+			ret = sys_accept(a0, (struct sockaddr *)A(a1), (int *)A(a[2]));
 			break;
 		case SYS_GETSOCKNAME:
-			ret = sys_getsockname(a0, (struct sockaddr *)A(a1),
-					       (int *)A(a[2]));
+			ret = sys_getsockname(a0, (struct sockaddr *)A(a1), (int *)A(a[2]));
 			break;
 		case SYS_GETPEERNAME:
-			ret = sys_getpeername(a0, (struct sockaddr *)A(a1),
-					       (int *)A(a[2]));
+			ret = sys_getpeername(a0, (struct sockaddr *)A(a1), (int *)A(a[2]));
 			break;
 		case SYS_SOCKETPAIR:
 			ret = sys_socketpair(a0, a1, a[2], (int *)A(a[3]));
@@ -1500,12 +1972,10 @@
 			ret = sys_getsockopt(a0, a1, a[2], a[3], a[4]);
 			break;
 		case SYS_SENDMSG:
-			ret = sys32_sendmsg(a0, (struct msghdr32 *)A(a1),
-					     a[2]);
+			ret = sys32_sendmsg(a0, (struct msghdr32 *) A(a1), a[2]);
 			break;
 		case SYS_RECVMSG:
-			ret = sys32_recvmsg(a0, (struct msghdr32 *)A(a1),
-					     a[2]);
+			ret = sys32_recvmsg(a0, (struct msghdr32 *) A(a1), a[2]);
 			break;
 		default:
 			ret = EINVAL;
@@ -1522,15 +1992,28 @@
 
 struct msgbuf32 { s32 mtype; char mtext[1]; };
 
-struct ipc_perm32
-{
-	key_t	  key;
-	__kernel_uid_t32  uid;
-	__kernel_gid_t32  gid;
-	__kernel_uid_t32  cuid;
-	__kernel_gid_t32  cgid;
+struct ipc_perm32 {
+	key_t key;
+	__kernel_uid_t32 uid;
+	__kernel_gid_t32 gid;
+	__kernel_uid_t32 cuid;
+	__kernel_gid_t32 cgid;
+	__kernel_mode_t32 mode;
+	unsigned short seq;
+};
+
+struct ipc64_perm32 {
+	key_t key;
+	__kernel_uid32_t32 uid;
+	__kernel_gid32_t32 gid;
+	__kernel_uid32_t32 cuid;
+	__kernel_gid32_t32 cgid;
 	__kernel_mode_t32 mode;
-	unsigned short  seq;
+	unsigned short __pad1;
+	unsigned short seq;
+	unsigned short __pad2;
+	unsigned int unused1;
+	unsigned int unused2;
 };
 
 struct semid_ds32 {
@@ -1544,8 +2027,18 @@
 	unsigned short  sem_nsems;              /* no. of semaphores in array */
 };
 
-struct msqid_ds32
-{
+struct semid64_ds32 {
+	struct ipc64_perm32 sem_perm;
+	__kernel_time_t32 sem_otime;
+	unsigned int __unused1;
+	__kernel_time_t32 sem_ctime;
+	unsigned int __unused2;
+	unsigned int sem_nsems;
+	unsigned int __unused3;
+	unsigned int __unused4;
+};
+
+struct msqid_ds32 {
 	struct ipc_perm32 msg_perm;
 	u32 msg_first;
 	u32 msg_last;
@@ -1561,110 +2054,206 @@
 	__kernel_ipc_pid_t32 msg_lrpid;
 };
 
+struct msqid64_ds32 {
+	struct ipc64_perm32 msg_perm;
+	__kernel_time_t32 msg_stime;
+	unsigned int __unused1;
+	__kernel_time_t32 msg_rtime;
+	unsigned int __unused2;
+	__kernel_time_t32 msg_ctime;
+	unsigned int __unused3;
+	unsigned int msg_cbytes;
+	unsigned int msg_qnum;
+	unsigned int msg_qbytes;
+	__kernel_pid_t32 msg_lspid;
+	__kernel_pid_t32 msg_lrpid;
+	unsigned int __unused4;
+	unsigned int __unused5;
+};
+
 struct shmid_ds32 {
-	struct ipc_perm32       shm_perm;
-	int                     shm_segsz;
-	__kernel_time_t32       shm_atime;
-	__kernel_time_t32       shm_dtime;
-	__kernel_time_t32       shm_ctime;
-	__kernel_ipc_pid_t32    shm_cpid;
-	__kernel_ipc_pid_t32    shm_lpid;
-	unsigned short          shm_nattch;
+	struct ipc_perm32 shm_perm;
+	int shm_segsz;
+	__kernel_time_t32 shm_atime;
+	__kernel_time_t32 shm_dtime;
+	__kernel_time_t32 shm_ctime;
+	__kernel_ipc_pid_t32 shm_cpid;
+	__kernel_ipc_pid_t32 shm_lpid;
+	unsigned short shm_nattch;
+};
+
+struct shmid64_ds32 {
+	struct ipc64_perm shm_perm;
+	__kernel_size_t32 shm_segsz;
+	__kernel_time_t32 shm_atime;
+	unsigned int __unused1;
+	__kernel_time_t32 shm_dtime;
+	unsigned int __unused2;
+	__kernel_time_t32 shm_ctime;
+	unsigned int __unused3;
+	__kernel_pid_t32 shm_cpid;
+	__kernel_pid_t32 shm_lpid;
+	unsigned int shm_nattch;
+	unsigned int __unused4;
+	unsigned int __unused5;
+};
+
+struct shminfo64_32 {
+	unsigned int shmmax;
+	unsigned int shmmin;
+	unsigned int shmmni;
+	unsigned int shmseg;
+	unsigned int shmall;
+	unsigned int __unused1;
+	unsigned int __unused2;
+	unsigned int __unused3;
+	unsigned int __unused4;
 };
 
+struct shm_info32 {
+	int used_ids;
+	u32 shm_tot, shm_rss, shm_swp;
+	u32 swap_attempts, swap_successes;
+};
+
+struct ipc_kludge {
+	struct msgbuf *msgp;
+	long msgtyp;
+};
+
+#define SEMOP		 1
+#define SEMGET		 2
+#define SEMCTL		 3
+#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 IPCOP_MASK(__x)	(1UL << (__x))
 
 static int
-do_sys32_semctl(int first, int second, int third, void *uptr)
+ipc_parse_version32 (int *cmd)
+{
+	if (*cmd & IPC_64) {
+		*cmd ^= IPC_64;
+		return IPC_64;
+	} else {
+		return IPC_OLD;
+	}
+}
+
+static int
+semctl32 (int first, int second, int third, void *uptr)
 {
 	union semun fourth;
 	u32 pad;
 	int err = 0, err2;
 	struct semid64_ds s;
-	struct semid_ds32 *usp;
 	mm_segment_t old_fs;
+	int version = ipc_parse_version32(&third);
 
 	if (!uptr)
 		return -EINVAL;
 	if (get_user(pad, (u32 *)uptr))
 		return -EFAULT;
-	if(third == SETVAL)
+	if (third == SETVAL)
 		fourth.val = (int)pad;
 	else
 		fourth.__pad = (void *)A(pad);
 	switch (third) {
-
-	case IPC_INFO:
-	case IPC_RMID:
-	case IPC_SET:
-	case SEM_INFO:
-	case GETVAL:
-	case GETPID:
-	case GETNCNT:
-	case GETZCNT:
-	case GETALL:
-	case SETVAL:
-	case SETALL:
-		err = sys_semctl (first, second, third, fourth);
+	      case IPC_INFO:
+	      case IPC_RMID:
+	      case IPC_SET:
+	      case SEM_INFO:
+	      case GETVAL:
+	      case GETPID:
+	      case GETNCNT:
+	      case GETZCNT:
+	      case GETALL:
+	      case SETVAL:
+	      case SETALL:
+		err = sys_semctl(first, second, third, fourth);
 		break;
 
-	case IPC_STAT:
-	case SEM_STAT:
-		usp = (struct semid_ds32 *)A(pad);
+	      case IPC_STAT:
+	      case SEM_STAT:
 		fourth.__pad = &s;
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_semctl (first, second, third, fourth);
-		set_fs (old_fs);
-		err2 = put_user(s.sem_perm.key, &usp->sem_perm.key);
-		err2 |= __put_user(s.sem_perm.uid, &usp->sem_perm.uid);
-		err2 |= __put_user(s.sem_perm.gid, &usp->sem_perm.gid);
-		err2 |= __put_user(s.sem_perm.cuid,
-				   &usp->sem_perm.cuid);
-		err2 |= __put_user (s.sem_perm.cgid,
-				    &usp->sem_perm.cgid);
-		err2 |= __put_user (s.sem_perm.mode,
-				    &usp->sem_perm.mode);
-		err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
-		err2 |= __put_user (s.sem_otime, &usp->sem_otime);
-		err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
-		err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_semctl(first, second, third, fourth);
+		set_fs(old_fs);
+
+		if (version == IPC_64) {
+			struct semid64_ds32 *usp64 = (struct semid64_ds32 *) A(pad);
+
+			if (!access_ok(VERIFY_WRITE, usp64, sizeof(*usp64))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(s.sem_perm.key, &usp64->sem_perm.key);
+			err2 |= __put_user(s.sem_perm.uid, &usp64->sem_perm.uid);
+			err2 |= __put_user(s.sem_perm.gid, &usp64->sem_perm.gid);
+			err2 |= __put_user(s.sem_perm.cuid, &usp64->sem_perm.cuid);
+			err2 |= __put_user(s.sem_perm.cgid, &usp64->sem_perm.cgid);
+			err2 |= __put_user(s.sem_perm.mode, &usp64->sem_perm.mode);
+			err2 |= __put_user(s.sem_perm.seq, &usp64->sem_perm.seq);
+			err2 |= __put_user(s.sem_otime, &usp64->sem_otime);
+			err2 |= __put_user(s.sem_ctime, &usp64->sem_ctime);
+			err2 |= __put_user(s.sem_nsems, &usp64->sem_nsems);
+		} else {
+			struct semid_ds32 *usp32 = (struct semid_ds32 *) A(pad);
+
+			if (!access_ok(VERIFY_WRITE, usp32, sizeof(*usp32))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(s.sem_perm.key, &usp32->sem_perm.key);
+			err2 |= __put_user(s.sem_perm.uid, &usp32->sem_perm.uid);
+			err2 |= __put_user(s.sem_perm.gid, &usp32->sem_perm.gid);
+			err2 |= __put_user(s.sem_perm.cuid, &usp32->sem_perm.cuid);
+			err2 |= __put_user(s.sem_perm.cgid, &usp32->sem_perm.cgid);
+			err2 |= __put_user(s.sem_perm.mode, &usp32->sem_perm.mode);
+			err2 |= __put_user(s.sem_perm.seq, &usp32->sem_perm.seq);
+			err2 |= __put_user(s.sem_otime, &usp32->sem_otime);
+			err2 |= __put_user(s.sem_ctime, &usp32->sem_ctime);
+			err2 |= __put_user(s.sem_nsems, &usp32->sem_nsems);
+		}
 		if (err2)
-			err = -EFAULT;
+		    err = -EFAULT;
 		break;
-
 	}
-
 	return err;
 }
 
 static int
 do_sys32_msgsnd (int first, int second, int third, void *uptr)
 {
-	struct msgbuf *p = kmalloc (second + sizeof (struct msgbuf)
-				    + 4, GFP_USER);
+	struct msgbuf *p = kmalloc(second + sizeof(struct msgbuf) + 4, GFP_USER);
 	struct msgbuf32 *up = (struct msgbuf32 *)uptr;
 	mm_segment_t old_fs;
 	int err;
 
 	if (!p)
 		return -ENOMEM;
-	err = get_user (p->mtype, &up->mtype);
-	err |= __copy_from_user (p->mtext, &up->mtext, second);
+	err = get_user(p->mtype, &up->mtype);
+	err |= copy_from_user(p->mtext, &up->mtext, second);
 	if (err)
 		goto out;
-	old_fs = get_fs ();
-	set_fs (KERNEL_DS);
-	err = sys_msgsnd (first, p, second, third);
-	set_fs (old_fs);
-out:
-	kfree (p);
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	err = sys_msgsnd(first, p, second, third);
+	set_fs(old_fs);
+  out:
+	kfree(p);
 	return err;
 }
 
 static int
-do_sys32_msgrcv (int first, int second, int msgtyp, int third,
-		 int version, void *uptr)
+do_sys32_msgrcv (int first, int second, int msgtyp, int third, int version, void *uptr)
 {
 	struct msgbuf32 *up;
 	struct msgbuf *p;
@@ -1679,185 +2268,281 @@
 		if (!uptr)
 			goto out;
 		err = -EFAULT;
-		if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge)))
+		if (copy_from_user(&ipck, uipck, sizeof(struct ipc_kludge)))
 			goto out;
 		uptr = (void *)A(ipck.msgp);
 		msgtyp = ipck.msgtyp;
 	}
 	err = -ENOMEM;
-	p = kmalloc (second + sizeof (struct msgbuf) + 4, GFP_USER);
+	p = kmalloc(second + sizeof(struct msgbuf) + 4, GFP_USER);
 	if (!p)
 		goto out;
-	old_fs = get_fs ();
-	set_fs (KERNEL_DS);
-	err = sys_msgrcv (first, p, second + 4, msgtyp, third);
-	set_fs (old_fs);
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	err = sys_msgrcv(first, p, second + 4, msgtyp, third);
+	set_fs(old_fs);
 	if (err < 0)
 		goto free_then_out;
 	up = (struct msgbuf32 *)uptr;
-	if (put_user (p->mtype, &up->mtype) ||
-	    __copy_to_user (&up->mtext, p->mtext, err))
+	if (put_user(p->mtype, &up->mtype) || copy_to_user(&up->mtext, p->mtext, err))
 		err = -EFAULT;
 free_then_out:
-	kfree (p);
+	kfree(p);
 out:
 	return err;
 }
 
 static int
-do_sys32_msgctl (int first, int second, void *uptr)
+msgctl32 (int first, int second, void *uptr)
 {
 	int err = -EINVAL, err2;
 	struct msqid_ds m;
 	struct msqid64_ds m64;
-	struct msqid_ds32 *up = (struct msqid_ds32 *)uptr;
+	struct msqid_ds32 *up32 = (struct msqid_ds32 *)uptr;
+	struct msqid64_ds32 *up64 = (struct msqid64_ds32 *)uptr;
 	mm_segment_t old_fs;
+	int version = ipc_parse_version32(&second);
 
 	switch (second) {
-
-	case IPC_INFO:
-	case IPC_RMID:
-	case MSG_INFO:
-		err = sys_msgctl (first, second, (struct msqid_ds *)uptr);
-		break;
-
-	case IPC_SET:
-		err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
-		err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
-		err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
-		err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
+	      case IPC_INFO:
+	      case IPC_RMID:
+	      case MSG_INFO:
+		err = sys_msgctl(first, second, (struct msqid_ds *)uptr);
+		break;
+
+	      case IPC_SET:
+		if (version == IPC_64) {
+			err = get_user(m.msg_perm.uid, &up64->msg_perm.uid);
+			err |= get_user(m.msg_perm.gid, &up64->msg_perm.gid);
+			err |= get_user(m.msg_perm.mode, &up64->msg_perm.mode);
+			err |= get_user(m.msg_qbytes, &up64->msg_qbytes);
+		} else {
+			err = get_user(m.msg_perm.uid, &up32->msg_perm.uid);
+			err |= get_user(m.msg_perm.gid, &up32->msg_perm.gid);
+			err |= get_user(m.msg_perm.mode, &up32->msg_perm.mode);
+			err |= get_user(m.msg_qbytes, &up32->msg_qbytes);
+		}
 		if (err)
 			break;
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_msgctl (first, second, &m);
-		set_fs (old_fs);
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_msgctl(first, second, &m);
+		set_fs(old_fs);
 		break;
 
-	case IPC_STAT:
-	case MSG_STAT:
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_msgctl (first, second, (void *) &m64);
-		set_fs (old_fs);
-		err2 = put_user (m64.msg_perm.key, &up->msg_perm.key);
-		err2 |= __put_user(m64.msg_perm.uid, &up->msg_perm.uid);
-		err2 |= __put_user(m64.msg_perm.gid, &up->msg_perm.gid);
-		err2 |= __put_user(m64.msg_perm.cuid, &up->msg_perm.cuid);
-		err2 |= __put_user(m64.msg_perm.cgid, &up->msg_perm.cgid);
-		err2 |= __put_user(m64.msg_perm.mode, &up->msg_perm.mode);
-		err2 |= __put_user(m64.msg_perm.seq, &up->msg_perm.seq);
-		err2 |= __put_user(m64.msg_stime, &up->msg_stime);
-		err2 |= __put_user(m64.msg_rtime, &up->msg_rtime);
-		err2 |= __put_user(m64.msg_ctime, &up->msg_ctime);
-		err2 |= __put_user(m64.msg_cbytes, &up->msg_cbytes);
-		err2 |= __put_user(m64.msg_qnum, &up->msg_qnum);
-		err2 |= __put_user(m64.msg_qbytes, &up->msg_qbytes);
-		err2 |= __put_user(m64.msg_lspid, &up->msg_lspid);
-		err2 |= __put_user(m64.msg_lrpid, &up->msg_lrpid);
-		if (err2)
-			err = -EFAULT;
-		break;
+	      case IPC_STAT:
+	      case MSG_STAT:
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_msgctl(first, second, (void *) &m64);
+		set_fs(old_fs);
 
+		if (version == IPC_64) {
+			if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(m64.msg_perm.key, &up64->msg_perm.key);
+			err2 |= __put_user(m64.msg_perm.uid, &up64->msg_perm.uid);
+			err2 |= __put_user(m64.msg_perm.gid, &up64->msg_perm.gid);
+			err2 |= __put_user(m64.msg_perm.cuid, &up64->msg_perm.cuid);
+			err2 |= __put_user(m64.msg_perm.cgid, &up64->msg_perm.cgid);
+			err2 |= __put_user(m64.msg_perm.mode, &up64->msg_perm.mode);
+			err2 |= __put_user(m64.msg_perm.seq, &up64->msg_perm.seq);
+			err2 |= __put_user(m64.msg_stime, &up64->msg_stime);
+			err2 |= __put_user(m64.msg_rtime, &up64->msg_rtime);
+			err2 |= __put_user(m64.msg_ctime, &up64->msg_ctime);
+			err2 |= __put_user(m64.msg_cbytes, &up64->msg_cbytes);
+			err2 |= __put_user(m64.msg_qnum, &up64->msg_qnum);
+			err2 |= __put_user(m64.msg_qbytes, &up64->msg_qbytes);
+			err2 |= __put_user(m64.msg_lspid, &up64->msg_lspid);
+			err2 |= __put_user(m64.msg_lrpid, &up64->msg_lrpid);
+			if (err2)
+				err = -EFAULT;
+		} else {
+			if (!access_ok(VERIFY_WRITE, up32, sizeof(*up32))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(m64.msg_perm.key, &up32->msg_perm.key);
+			err2 |= __put_user(m64.msg_perm.uid, &up32->msg_perm.uid);
+			err2 |= __put_user(m64.msg_perm.gid, &up32->msg_perm.gid);
+			err2 |= __put_user(m64.msg_perm.cuid, &up32->msg_perm.cuid);
+			err2 |= __put_user(m64.msg_perm.cgid, &up32->msg_perm.cgid);
+			err2 |= __put_user(m64.msg_perm.mode, &up32->msg_perm.mode);
+			err2 |= __put_user(m64.msg_perm.seq, &up32->msg_perm.seq);
+			err2 |= __put_user(m64.msg_stime, &up32->msg_stime);
+			err2 |= __put_user(m64.msg_rtime, &up32->msg_rtime);
+			err2 |= __put_user(m64.msg_ctime, &up32->msg_ctime);
+			err2 |= __put_user(m64.msg_cbytes, &up32->msg_cbytes);
+			err2 |= __put_user(m64.msg_qnum, &up32->msg_qnum);
+			err2 |= __put_user(m64.msg_qbytes, &up32->msg_qbytes);
+			err2 |= __put_user(m64.msg_lspid, &up32->msg_lspid);
+			err2 |= __put_user(m64.msg_lrpid, &up32->msg_lrpid);
+			if (err2)
+				err = -EFAULT;
+		}
+		break;
 	}
-
 	return err;
 }
 
 static int
-do_sys32_shmat (int first, int second, int third, int version, void *uptr)
+shmat32 (int first, int second, int third, int version, void *uptr)
 {
 	unsigned long raddr;
 	u32 *uaddr = (u32 *)A((u32)third);
 	int err;
 
 	if (version == 1)
-		return -EINVAL;
-	err = sys_shmat (first, uptr, second, &raddr);
+		return -EINVAL;	/* iBCS2 emulator entry point: unsupported */
+	err = sys_shmat(first, uptr, second, &raddr);
 	if (err)
 		return err;
 	return put_user(raddr, uaddr);
 }
 
 static int
-do_sys32_shmctl (int first, int second, void *uptr)
+shmctl32 (int first, int second, void *uptr)
 {
 	int err = -EFAULT, err2;
 	struct shmid_ds s;
 	struct shmid64_ds s64;
-	struct shmid_ds32 *up = (struct shmid_ds32 *)uptr;
+	struct shmid_ds32 *up32 = (struct shmid_ds32 *)uptr;
+	struct shmid64_ds32 *up64 = (struct shmid64_ds32 *)uptr;
 	mm_segment_t old_fs;
-	struct shm_info32 {
-		int used_ids;
-		u32 shm_tot, shm_rss, shm_swp;
-		u32 swap_attempts, swap_successes;
-	} *uip = (struct shm_info32 *)uptr;
+	struct shm_info32 *uip = (struct shm_info32 *)uptr;
 	struct shm_info si;
+	int version = ipc_parse_version32(&second);
+	struct shminfo64 smi;
+	struct shminfo *usi32 = (struct shminfo *) uptr;
+	struct shminfo64_32 *usi64 = (struct shminfo64_32 *) uptr;
 
 	switch (second) {
+	      case IPC_INFO:
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_shmctl(first, second, (struct shmid_ds *)&smi);
+		set_fs(old_fs);
+
+		if (version == IPC_64) {
+			if (!access_ok(VERIFY_WRITE, usi64, sizeof(*usi64))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(smi.shmmax, &usi64->shmmax);
+			err2 |= __put_user(smi.shmmin, &usi64->shmmin);
+			err2 |= __put_user(smi.shmmni, &usi64->shmmni);
+			err2 |= __put_user(smi.shmseg, &usi64->shmseg);
+			err2 |= __put_user(smi.shmall, &usi64->shmall);
+		} else {
+			if (!access_ok(VERIFY_WRITE, usi32, sizeof(*usi32))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(smi.shmmax, &usi32->shmmax);
+			err2 |= __put_user(smi.shmmin, &usi32->shmmin);
+			err2 |= __put_user(smi.shmmni, &usi32->shmmni);
+			err2 |= __put_user(smi.shmseg, &usi32->shmseg);
+			err2 |= __put_user(smi.shmall, &usi32->shmall);
+		}
+		if (err2)
+			err = -EFAULT;
+		break;
 
-	case IPC_INFO:
-	case IPC_RMID:
-	case SHM_LOCK:
-	case SHM_UNLOCK:
-		err = sys_shmctl (first, second, (struct shmid_ds *)uptr);
+	      case IPC_RMID:
+	      case SHM_LOCK:
+	      case SHM_UNLOCK:
+		err = sys_shmctl(first, second, (struct shmid_ds *)uptr);
 		break;
-	case IPC_SET:
-		err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
-		err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
-		err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
+
+	      case IPC_SET:
+		if (version == IPC_64) {
+			err = get_user(s.shm_perm.uid, &up64->shm_perm.uid);
+			err |= get_user(s.shm_perm.gid, &up64->shm_perm.gid);
+			err |= get_user(s.shm_perm.mode, &up64->shm_perm.mode);
+		} else {
+			err = get_user(s.shm_perm.uid, &up32->shm_perm.uid);
+			err |= get_user(s.shm_perm.gid, &up32->shm_perm.gid);
+			err |= get_user(s.shm_perm.mode, &up32->shm_perm.mode);
+		}
 		if (err)
 			break;
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_shmctl (first, second, &s);
-		set_fs (old_fs);
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_shmctl(first, second, &s);
+		set_fs(old_fs);
 		break;
 
-	case IPC_STAT:
-	case SHM_STAT:
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_shmctl (first, second, (void *) &s64);
-		set_fs (old_fs);
+	      case IPC_STAT:
+	      case SHM_STAT:
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_shmctl(first, second, (void *) &s64);
+		set_fs(old_fs);
 		if (err < 0)
 			break;
-		err2 = put_user (s64.shm_perm.key, &up->shm_perm.key);
-		err2 |= __put_user (s64.shm_perm.uid, &up->shm_perm.uid);
-		err2 |= __put_user (s64.shm_perm.gid, &up->shm_perm.gid);
-		err2 |= __put_user (s64.shm_perm.cuid,
-				    &up->shm_perm.cuid);
-		err2 |= __put_user (s64.shm_perm.cgid,
-				    &up->shm_perm.cgid);
-		err2 |= __put_user (s64.shm_perm.mode,
-				    &up->shm_perm.mode);
-		err2 |= __put_user (s64.shm_perm.seq, &up->shm_perm.seq);
-		err2 |= __put_user (s64.shm_atime, &up->shm_atime);
-		err2 |= __put_user (s64.shm_dtime, &up->shm_dtime);
-		err2 |= __put_user (s64.shm_ctime, &up->shm_ctime);
-		err2 |= __put_user (s64.shm_segsz, &up->shm_segsz);
-		err2 |= __put_user (s64.shm_nattch, &up->shm_nattch);
-		err2 |= __put_user (s64.shm_cpid, &up->shm_cpid);
-		err2 |= __put_user (s64.shm_lpid, &up->shm_lpid);
+		if (version == IPC_64) {
+			if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(s64.shm_perm.key, &up64->shm_perm.key);
+			err2 |= __put_user(s64.shm_perm.uid, &up64->shm_perm.uid);
+			err2 |= __put_user(s64.shm_perm.gid, &up64->shm_perm.gid);
+			err2 |= __put_user(s64.shm_perm.cuid, &up64->shm_perm.cuid);
+			err2 |= __put_user(s64.shm_perm.cgid, &up64->shm_perm.cgid);
+			err2 |= __put_user(s64.shm_perm.mode, &up64->shm_perm.mode);
+			err2 |= __put_user(s64.shm_perm.seq, &up64->shm_perm.seq);
+			err2 |= __put_user(s64.shm_atime, &up64->shm_atime);
+			err2 |= __put_user(s64.shm_dtime, &up64->shm_dtime);
+			err2 |= __put_user(s64.shm_ctime, &up64->shm_ctime);
+			err2 |= __put_user(s64.shm_segsz, &up64->shm_segsz);
+			err2 |= __put_user(s64.shm_nattch, &up64->shm_nattch);
+			err2 |= __put_user(s64.shm_cpid, &up64->shm_cpid);
+			err2 |= __put_user(s64.shm_lpid, &up64->shm_lpid);
+		} else {
+			if (!access_ok(VERIFY_WRITE, up32, sizeof(*up32))) {
+				err = -EFAULT;
+				break;
+			}
+			err2 = __put_user(s64.shm_perm.key, &up32->shm_perm.key);
+			err2 |= __put_user(s64.shm_perm.uid, &up32->shm_perm.uid);
+			err2 |= __put_user(s64.shm_perm.gid, &up32->shm_perm.gid);
+			err2 |= __put_user(s64.shm_perm.cuid, &up32->shm_perm.cuid);
+			err2 |= __put_user(s64.shm_perm.cgid, &up32->shm_perm.cgid);
+			err2 |= __put_user(s64.shm_perm.mode, &up32->shm_perm.mode);
+			err2 |= __put_user(s64.shm_perm.seq, &up32->shm_perm.seq);
+			err2 |= __put_user(s64.shm_atime, &up32->shm_atime);
+			err2 |= __put_user(s64.shm_dtime, &up32->shm_dtime);
+			err2 |= __put_user(s64.shm_ctime, &up32->shm_ctime);
+			err2 |= __put_user(s64.shm_segsz, &up32->shm_segsz);
+			err2 |= __put_user(s64.shm_nattch, &up32->shm_nattch);
+			err2 |= __put_user(s64.shm_cpid, &up32->shm_cpid);
+			err2 |= __put_user(s64.shm_lpid, &up32->shm_lpid);
+		}
 		if (err2)
 			err = -EFAULT;
 		break;
 
-	case SHM_INFO:
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_shmctl (first, second, (void *)&si);
-		set_fs (old_fs);
+	      case SHM_INFO:
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		err = sys_shmctl(first, second, (void *)&si);
+		set_fs(old_fs);
 		if (err < 0)
 			break;
-		err2 = put_user (si.used_ids, &uip->used_ids);
-		err2 |= __put_user (si.shm_tot, &uip->shm_tot);
-		err2 |= __put_user (si.shm_rss, &uip->shm_rss);
-		err2 |= __put_user (si.shm_swp, &uip->shm_swp);
-		err2 |= __put_user (si.swap_attempts,
-				    &uip->swap_attempts);
-		err2 |= __put_user (si.swap_successes,
-				    &uip->swap_successes);
+
+		if (!access_ok(VERIFY_WRITE, uip, sizeof(*uip))) {
+			err = -EFAULT;
+			break;
+		}
+		err2 = __put_user(si.used_ids, &uip->used_ids);
+		err2 |= __put_user(si.shm_tot, &uip->shm_tot);
+		err2 |= __put_user(si.shm_rss, &uip->shm_rss);
+		err2 |= __put_user(si.shm_swp, &uip->shm_swp);
+		err2 |= __put_user(si.swap_attempts, &uip->swap_attempts);
+		err2 |= __put_user(si.swap_successes, &uip->swap_successes);
 		if (err2)
 			err = -EFAULT;
 		break;
@@ -1869,59 +2554,42 @@
 asmlinkage long
 sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
 {
-	int version, err;
+	int version;
 
 	version = call >> 16; /* hack for backward compatibility */
 	call &= 0xffff;
 
 	switch (call) {
-
-	case SEMOP:
+	      case SEMOP:
 		/* struct sembuf is the same on 32 and 64bit :)) */
-		err = sys_semop (first, (struct sembuf *)AA(ptr),
-				 second);
-		break;
-	case SEMGET:
-		err = sys_semget (first, second, third);
-		break;
-	case SEMCTL:
-		err = do_sys32_semctl (first, second, third,
-				       (void *)AA(ptr));
-		break;
-
-	case MSGSND:
-		err = do_sys32_msgsnd (first, second, third,
-				       (void *)AA(ptr));
-		break;
-	case MSGRCV:
-		err = do_sys32_msgrcv (first, second, fifth, third,
-				       version, (void *)AA(ptr));
-		break;
-	case MSGGET:
-		err = sys_msgget ((key_t) first, second);
-		break;
-	case MSGCTL:
-		err = do_sys32_msgctl (first, second, (void *)AA(ptr));
-		break;
+		return sys_semop(first, (struct sembuf *)AA(ptr), second);
+	      case SEMGET:
+		return sys_semget(first, second, third);
+	      case SEMCTL:
+		return semctl32(first, second, third, (void *)AA(ptr));
+
+	      case MSGSND:
+		return do_sys32_msgsnd(first, second, third, (void *)AA(ptr));
+	      case MSGRCV:
+		return do_sys32_msgrcv(first, second, fifth, third, version, (void *)AA(ptr));
+	      case MSGGET:
+		return sys_msgget((key_t) first, second);
+	      case MSGCTL:
+		return msgctl32(first, second, (void *)AA(ptr));
+
+	      case SHMAT:
+		return shmat32(first, second, third, version, (void *)AA(ptr));
+		break;
+	      case SHMDT:
+		return sys_shmdt((char *)AA(ptr));
+	      case SHMGET:
+		return sys_shmget(first, second, third);
+	      case SHMCTL:
+		return shmctl32(first, second, (void *)AA(ptr));
 
-	case SHMAT:
-		err = do_sys32_shmat (first, second, third, version, (void *)AA(ptr));
-		break;
-	case SHMDT:
-		err = sys_shmdt ((char *)AA(ptr));
-		break;
-	case SHMGET:
-		err = sys_shmget (first, second, third);
-		break;
-	case SHMCTL:
-		err = do_sys32_shmctl (first, second, (void *)AA(ptr));
-		break;
-	default:
-		err = -EINVAL;
-		break;
+	      default:
+		return -EINVAL;
 	}
-
-	return err;
 }
 
 /*
@@ -1929,7 +2597,8 @@
  * sys_gettimeofday().  IA64 did this but i386 Linux did not
  * so we have to implement this system call here.
  */
-asmlinkage long sys32_time(int * tloc)
+asmlinkage long
+sys32_time (int *tloc)
 {
 	int i;
 
@@ -1937,7 +2606,7 @@
 	   stuff it to user space. No side effects */
 	i = CURRENT_TIME;
 	if (tloc) {
-		if (put_user(i,tloc))
+		if (put_user(i, tloc))
 			i = -EFAULT;
 	}
 	return i;
@@ -1967,7 +2636,10 @@
 {
 	int err;
 
-	err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
+	if (!access_ok(VERIFY_WRITE, ru, sizeof(*ru)))
+		return -EFAULT;
+
+	err = __put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
 	err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);
 	err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);
 	err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);
@@ -1989,8 +2661,7 @@
 }
 
 asmlinkage long
-sys32_wait4(__kernel_pid_t32 pid, unsigned int *stat_addr, int options,
-	    struct rusage32 *ru)
+sys32_wait4 (int pid, unsigned int *stat_addr, int options, struct rusage32 *ru)
 {
 	if (!ru)
 		return sys_wait4(pid, stat_addr, options, NULL);
@@ -2000,37 +2671,38 @@
 		unsigned int status;
 		mm_segment_t old_fs = get_fs();
 
-		set_fs (KERNEL_DS);
+		set_fs(KERNEL_DS);
 		ret = sys_wait4(pid, stat_addr ? &status : NULL, options, &r);
-		set_fs (old_fs);
-		if (put_rusage (ru, &r)) return -EFAULT;
-		if (stat_addr && put_user (status, stat_addr))
+		set_fs(old_fs);
+		if (put_rusage(ru, &r))
+			return -EFAULT;
+		if (stat_addr && put_user(status, stat_addr))
 			return -EFAULT;
 		return ret;
 	}
 }
 
 asmlinkage long
-sys32_waitpid(__kernel_pid_t32 pid, unsigned int *stat_addr, int options)
+sys32_waitpid (int pid, unsigned int *stat_addr, int options)
 {
 	return sys32_wait4(pid, stat_addr, options, NULL);
 }
 
 
-extern asmlinkage long
-sys_getrusage(int who, struct rusage *ru);
+extern asmlinkage long sys_getrusage (int who, struct rusage *ru);
 
 asmlinkage long
-sys32_getrusage(int who, struct rusage32 *ru)
+sys32_getrusage (int who, struct rusage32 *ru)
 {
 	struct rusage r;
 	int ret;
 	mm_segment_t old_fs = get_fs();
 
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_getrusage(who, &r);
-	set_fs (old_fs);
-	if (put_rusage (ru, &r)) return -EFAULT;
+	set_fs(old_fs);
+	if (put_rusage (ru, &r))
+		return -EFAULT;
 	return ret;
 }
 
@@ -2041,41 +2713,41 @@
 	__kernel_clock_t32 tms_cstime;
 };
 
-extern asmlinkage long sys_times(struct tms * tbuf);
+extern asmlinkage long sys_times (struct tms * tbuf);
 
 asmlinkage long
-sys32_times(struct tms32 *tbuf)
+sys32_times (struct tms32 *tbuf)
 {
+	mm_segment_t old_fs = get_fs();
 	struct tms t;
 	long ret;
-	mm_segment_t old_fs = get_fs ();
 	int err;
 
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	ret = sys_times(tbuf ? &t : NULL);
-	set_fs (old_fs);
+	set_fs(old_fs);
 	if (tbuf) {
 		err = put_user (IA32_TICK(t.tms_utime), &tbuf->tms_utime);
-		err |= __put_user (IA32_TICK(t.tms_stime), &tbuf->tms_stime);
-		err |= __put_user (IA32_TICK(t.tms_cutime), &tbuf->tms_cutime);
-		err |= __put_user (IA32_TICK(t.tms_cstime), &tbuf->tms_cstime);
+		err |= put_user (IA32_TICK(t.tms_stime), &tbuf->tms_stime);
+		err |= put_user (IA32_TICK(t.tms_cutime), &tbuf->tms_cutime);
+		err |= put_user (IA32_TICK(t.tms_cstime), &tbuf->tms_cstime);
 		if (err)
 			ret = -EFAULT;
 	}
 	return IA32_TICK(ret);
 }
 
-unsigned int
+static unsigned int
 ia32_peek (struct pt_regs *regs, struct task_struct *child, unsigned long addr, unsigned int *val)
 {
 	size_t copied;
 	unsigned int ret;
 
 	copied = access_process_vm(child, addr, val, sizeof(*val), 0);
-	return(copied != sizeof(ret) ? -EIO : 0);
+	return (copied != sizeof(ret)) ? -EIO : 0;
 }
 
-unsigned int
+static unsigned int
 ia32_poke (struct pt_regs *regs, struct task_struct *child, unsigned long addr, unsigned int val)
 {
 
@@ -2105,135 +2777,87 @@
 #define PT_UESP	15
 #define PT_SS	16
 
-unsigned int
-getreg(struct task_struct *child, int regno)
+static unsigned int
+getreg (struct task_struct *child, int regno)
 {
 	struct pt_regs *child_regs;
 
 	child_regs = ia64_task_regs(child);
 	switch (regno / sizeof(int)) {
-
-	case PT_EBX:
-		return(child_regs->r11);
-	case PT_ECX:
-		return(child_regs->r9);
-	case PT_EDX:
-		return(child_regs->r10);
-	case PT_ESI:
-		return(child_regs->r14);
-	case PT_EDI:
-		return(child_regs->r15);
-	case PT_EBP:
-		return(child_regs->r13);
-	case PT_EAX:
-	case PT_ORIG_EAX:
-		return(child_regs->r8);
-	case PT_EIP:
-		return(child_regs->cr_iip);
-	case PT_UESP:
-		return(child_regs->r12);
-	case PT_EFL:
-		return(child->thread.eflag);
-	case PT_DS:
-	case PT_ES:
-	case PT_FS:
-	case PT_GS:
-	case PT_SS:
-		return((unsigned int)__USER_DS);
-	case PT_CS:
-		return((unsigned int)__USER_CS);
-	default:
-		printk(KERN_ERR "getregs:unknown register %d\n", regno);
+	      case PT_EBX: return child_regs->r11;
+	      case PT_ECX: return child_regs->r9;
+	      case PT_EDX: return child_regs->r10;
+	      case PT_ESI: return child_regs->r14;
+	      case PT_EDI: return child_regs->r15;
+	      case PT_EBP: return child_regs->r13;
+	      case PT_EAX: return child_regs->r8;
+	      case PT_ORIG_EAX: return child_regs->r1; /* see dispatch_to_ia32_handler() */
+	      case PT_EIP: return child_regs->cr_iip;
+	      case PT_UESP: return child_regs->r12;
+	      case PT_EFL: return child->thread.eflag;
+	      case PT_DS: case PT_ES: case PT_FS: case PT_GS: case PT_SS:
+		return __USER_DS;
+	      case PT_CS: return __USER_CS;
+	      default:
+		printk(KERN_ERR "ia32.getreg(): unknown register %d\n", regno);
 		break;
-
 	}
-	return(0);
+	return 0;
 }
 
-void
-putreg(struct task_struct *child, int regno, unsigned int value)
+static void
+putreg (struct task_struct *child, int regno, unsigned int value)
 {
 	struct pt_regs *child_regs;
 
 	child_regs = ia64_task_regs(child);
 	switch (regno / sizeof(int)) {
-
-	case PT_EBX:
-		child_regs->r11 = value;
-		break;
-	case PT_ECX:
-		child_regs->r9 = value;
-		break;
-	case PT_EDX:
-		child_regs->r10 = value;
-		break;
-	case PT_ESI:
-		child_regs->r14 = value;
-		break;
-	case PT_EDI:
-		child_regs->r15 = value;
-		break;
-	case PT_EBP:
-		child_regs->r13 = value;
-		break;
-	case PT_EAX:
-	case PT_ORIG_EAX:
-		child_regs->r8 = value;
-		break;
-	case PT_EIP:
-		child_regs->cr_iip = value;
-		break;
-	case PT_UESP:
-		child_regs->r12 = value;
-		break;
-	case PT_EFL:
-		child->thread.eflag = value;
-		break;
-	case PT_DS:
-	case PT_ES:
-	case PT_FS:
-	case PT_GS:
-	case PT_SS:
+	      case PT_EBX: child_regs->r11 = value; break;
+	      case PT_ECX: child_regs->r9 = value; break;
+	      case PT_EDX: child_regs->r10 = value; break;
+	      case PT_ESI: child_regs->r14 = value; break;
+	      case PT_EDI: child_regs->r15 = value; break;
+	      case PT_EBP: child_regs->r13 = value; break;
+	      case PT_EAX: child_regs->r8 = value; break;
+	      case PT_ORIG_EAX: child_regs->r1 = value; break;
+	      case PT_EIP: child_regs->cr_iip = value; break;
+	      case PT_UESP: child_regs->r12 = value; break;
+	      case PT_EFL: child->thread.eflag = value; break;
+	      case PT_DS: case PT_ES: case PT_FS: case PT_GS: case PT_SS:
 		if (value != __USER_DS)
-			printk(KERN_ERR "setregs:try to set invalid segment register %d = %x\n",
+			printk(KERN_ERR
+			       "ia32.putreg: attempt to set invalid segment register %d = %x\n",
 			       regno, value);
 		break;
-	case PT_CS:
+	      case PT_CS:
 		if (value != __USER_CS)
-			printk(KERN_ERR "setregs:try to set invalid segment register %d = %x\n",
+			printk(KERN_ERR
+			       "ia32.putreg: attempt to to set invalid segment register %d = %x\n",
 			       regno, value);
 		break;
-	default:
-		printk(KERN_ERR "getregs:unknown register %d\n", regno);
+	      default:
+		printk(KERN_ERR "ia32.putreg: unknown register %d\n", regno);
 		break;
-
 	}
 }
 
 static inline void
-ia32f2ia64f(void *dst, void *src)
+ia32f2ia64f (void *dst, void *src)
 {
-
-	__asm__ ("ldfe f6=[%1] ;;\n\t"
-		 "stf.spill [%0]=f6"
-		:
-		: "r"(dst), "r"(src));
+	asm volatile ("ldfe f6=[%1];; stf.spill [%0]=f6" :: "r"(dst), "r"(src) : "memory");
 	return;
 }
 
 static inline void
-ia64f2ia32f(void *dst, void *src)
+ia64f2ia32f (void *dst, void *src)
 {
-
-	__asm__ ("ldf.fill f6=[%1] ;;\n\t"
-		 "stfe [%0]=f6"
-		:
-		: "r"(dst),  "r"(src));
+	asm volatile ("ldf.fill f6=[%1];; stfe [%0]=f6" :: "r"(dst),  "r"(src) : "memory");
 	return;
 }
 
-void
-put_fpreg(int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp, int tos)
+static void
+put_fpreg (int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp,
+	   int tos)
 {
 	struct _fpreg_ia32 *f;
 	char buf[32];
@@ -2242,62 +2866,59 @@
 	if ((regno += tos) >= 8)
 		regno -= 8;
 	switch (regno) {
-
-	case 0:
+	      case 0:
 		ia64f2ia32f(f, &ptp->f8);
 		break;
-	case 1:
+	      case 1:
 		ia64f2ia32f(f, &ptp->f9);
 		break;
-	case 2:
-	case 3:
-	case 4:
-	case 5:
-	case 6:
-	case 7:
+	      case 2:
+	      case 3:
+	      case 4:
+	      case 5:
+	      case 6:
+	      case 7:
 		ia64f2ia32f(f, &swp->f10 + (regno - 2));
 		break;
-
 	}
-	__copy_to_user(reg, f, sizeof(*reg));
+	copy_to_user(reg, f, sizeof(*reg));
 }
 
-void
-get_fpreg(int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp, int tos)
+static void
+get_fpreg (int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp,
+	   int tos)
 {
 
 	if ((regno += tos) >= 8)
 		regno -= 8;
 	switch (regno) {
-
-	case 0:
-		__copy_from_user(&ptp->f8, reg, sizeof(*reg));
+	      case 0:
+		copy_from_user(&ptp->f8, reg, sizeof(*reg));
 		break;
-	case 1:
-		__copy_from_user(&ptp->f9, reg, sizeof(*reg));
+	      case 1:
+		copy_from_user(&ptp->f9, reg, sizeof(*reg));
 		break;
-	case 2:
-	case 3:
-	case 4:
-	case 5:
-	case 6:
-	case 7:
-		__copy_from_user(&swp->f10 + (regno - 2), reg, sizeof(*reg));
+	      case 2:
+	      case 3:
+	      case 4:
+	      case 5:
+	      case 6:
+	      case 7:
+		copy_from_user(&swp->f10 + (regno - 2), reg, sizeof(*reg));
 		break;
-
 	}
 	return;
 }
 
-int
-save_ia32_fpstate(struct task_struct *tsk, struct _fpstate_ia32 *save)
+static int
+save_ia32_fpstate (struct task_struct *tsk, struct _fpstate_ia32 *save)
 {
 	struct switch_stack *swp;
 	struct pt_regs *ptp;
 	int i, tos;
 
 	if (!access_ok(VERIFY_WRITE, save, sizeof(*save)))
-		return(-EIO);
+		return -EIO;
 	__put_user(tsk->thread.fcr, &save->cw);
 	__put_user(tsk->thread.fsr, &save->sw);
 	__put_user(tsk->thread.fsr >> 32, &save->tag);
@@ -2313,11 +2934,11 @@
 	tos = (tsk->thread.fsr >> 11) & 3;
 	for (i = 0; i < 8; i++)
 		put_fpreg(i, &save->_st[i], ptp, swp, tos);
-	return(0);
+	return 0;
 }
 
-int
-restore_ia32_fpstate(struct task_struct *tsk, struct _fpstate_ia32 *save)
+static int
+restore_ia32_fpstate (struct task_struct *tsk, struct _fpstate_ia32 *save)
 {
 	struct switch_stack *swp;
 	struct pt_regs *ptp;
@@ -2340,10 +2961,11 @@
 	tos = (tsk->thread.fsr >> 11) & 3;
 	for (i = 0; i < 8; i++)
 		get_fpreg(i, &save->_st[i], ptp, swp, tos);
-	return(ret ? -EFAULT : 0);
+	return ret ? -EFAULT : 0;
 }
 
-asmlinkage long sys_ptrace(long, pid_t, unsigned long, unsigned long, long, long, long, long, long);
+extern asmlinkage long sys_ptrace (long, pid_t, unsigned long, unsigned long, long, long, long,
+				   long, long);
 
 /*
  *  Note that the IA32 version of `ptrace' calls the IA64 routine for
@@ -2358,13 +2980,12 @@
 {
 	struct pt_regs *regs = (struct pt_regs *) &stack;
 	struct task_struct *child;
+	unsigned int value, tmp;
 	long i, ret;
-	unsigned int value;
 
 	lock_kernel();
 	if (request == PTRACE_TRACEME) {
-		ret = sys_ptrace(request, pid, addr, data,
-				arg4, arg5, arg6, arg7, stack);
+		ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
 		goto out;
 	}
 
@@ -2379,8 +3000,7 @@
 		goto out;
 
 	if (request == PTRACE_ATTACH) {
-		ret = sys_ptrace(request, pid, addr, data,
-				arg4, arg5, arg6, arg7, stack);
+		ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
 		goto out;
 	}
 	ret = -ESRCH;
@@ -2398,21 +3018,32 @@
 	      case PTRACE_PEEKDATA:	/* read word at location addr */
 		ret = ia32_peek(regs, child, addr, &value);
 		if (ret == 0)
-			ret = put_user(value, (unsigned int *)A(data));
+			ret = put_user(value, (unsigned int *) A(data));
 		else
 			ret = -EIO;
 		goto out;
 
 	      case PTRACE_POKETEXT:
 	      case PTRACE_POKEDATA:	/* write the word at location addr */
-		ret = ia32_poke(regs, child, addr, (unsigned int)data);
+		ret = ia32_poke(regs, child, addr, data);
 		goto out;
 
 	      case PTRACE_PEEKUSR:	/* read word at addr in USER area */
-		ret = 0;
+		ret = -EIO;
+		if ((addr & 3) || addr > 17*sizeof(int))
+			break;
+
+		tmp = getreg(child, addr);
+		if (!put_user(tmp, (unsigned int *) A(data)))
+			ret = 0;
 		break;
 
 	      case PTRACE_POKEUSR:	/* write word at addr in USER area */
+		ret = -EIO;
+		if ((addr & 3) || addr > 17*sizeof(int))
+			break;
+
+		putreg(child, addr, data);
 		ret = 0;
 		break;
 
@@ -2421,28 +3052,25 @@
 			ret = -EIO;
 			break;
 		}
-		for ( i = 0; i < 17*sizeof(int); i += sizeof(int) ) {
-			__put_user(getreg(child, i), (unsigned int *) A(data));
+		for (i = 0; i < 17*sizeof(int); i += sizeof(int) ) {
+			put_user(getreg(child, i), (unsigned int *) A(data));
 			data += sizeof(int);
 		}
 		ret = 0;
 		break;
 
 	      case IA32_PTRACE_SETREGS:
-	      {
-		unsigned int tmp;
 		if (!access_ok(VERIFY_READ, (int *) A(data), 17*sizeof(int))) {
 			ret = -EIO;
 			break;
 		}
-		for ( i = 0; i < 17*sizeof(int); i += sizeof(int) ) {
-			__get_user(tmp, (unsigned int *) A(data));
+		for (i = 0; i < 17*sizeof(int); i += sizeof(int) ) {
+			get_user(tmp, (unsigned int *) A(data));
 			putreg(child, i, tmp);
 			data += sizeof(int);
 		}
 		ret = 0;
 		break;
-	      }
 
 	      case IA32_PTRACE_GETFPREGS:
 		ret = save_ia32_fpstate(child, (struct _fpstate_ia32 *) A(data));
@@ -2457,10 +3085,8 @@
 	      case PTRACE_KILL:
 	      case PTRACE_SINGLESTEP:	/* execute chile for one instruction */
 	      case PTRACE_DETACH:	/* detach a process */
-		unlock_kernel();
-		ret = sys_ptrace(request, pid, addr, data,
-				arg4, arg5, arg6, arg7, stack);
-		return(ret);
+		ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
+		break;
 
 	      default:
 		ret = -EIO;
@@ -2477,7 +3103,10 @@
 {
 	int err;
 
-	err = get_user(kfl->l_type, &ufl->l_type);
+	if (!access_ok(VERIFY_READ, ufl, sizeof(*ufl)))
+		return -EFAULT;
+
+	err = __get_user(kfl->l_type, &ufl->l_type);
 	err |= __get_user(kfl->l_whence, &ufl->l_whence);
 	err |= __get_user(kfl->l_start, &ufl->l_start);
 	err |= __get_user(kfl->l_len, &ufl->l_len);
@@ -2490,6 +3119,9 @@
 {
 	int err;
 
+	if (!access_ok(VERIFY_WRITE, ufl, sizeof(*ufl)))
+		return -EFAULT;
+
 	err = __put_user(kfl->l_type, &ufl->l_type);
 	err |= __put_user(kfl->l_whence, &ufl->l_whence);
 	err |= __put_user(kfl->l_start, &ufl->l_start);
@@ -2498,71 +3130,43 @@
 	return err;
 }
 
-extern asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd,
-				 unsigned long arg);
+extern asmlinkage long sys_fcntl (unsigned int fd, unsigned int cmd, unsigned long arg);
 
 asmlinkage long
-sys32_fcntl(unsigned int fd, unsigned int cmd, int arg)
+sys32_fcntl (unsigned int fd, unsigned int cmd, unsigned int arg)
 {
-	struct flock f;
 	mm_segment_t old_fs;
+	struct flock f;
 	long ret;
 
 	switch (cmd) {
-	case F_GETLK:
-	case F_SETLK:
-	case F_SETLKW:
-		if(get_flock32(&f, (struct flock32 *)((long)arg)))
+	      case F_GETLK:
+	      case F_SETLK:
+	      case F_SETLKW:
+		if (get_flock32(&f, (struct flock32 *) A(arg)))
 			return -EFAULT;
 		old_fs = get_fs();
 		set_fs(KERNEL_DS);
-		ret = sys_fcntl(fd, cmd, (unsigned long)&f);
+		ret = sys_fcntl(fd, cmd, (unsigned long) &f);
 		set_fs(old_fs);
-		if(cmd == F_GETLK && put_flock32(&f, (struct flock32 *)((long)arg)))
+		if (cmd == F_GETLK && put_flock32(&f, (struct flock32 *) A(arg)))
 			return -EFAULT;
 		return ret;
-	default:
+
+	      default:
 		/*
 		 *  `sys_fcntl' lies about arg, for the F_SETOWN
 		 *  sub-function arg can have a negative value.
 		 */
-		return sys_fcntl(fd, cmd, (unsigned long)((long)arg));
-	}
-}
-
-asmlinkage long
-sys32_sigaction (int sig, struct old_sigaction32 *act, struct old_sigaction32 *oact)
-{
-	struct k_sigaction new_ka, old_ka;
-	int ret;
-
-	if (act) {
-		old_sigset32_t mask;
-
-		ret = get_user((long)new_ka.sa.sa_handler, &act->sa_handler);
-		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-		ret |= __get_user(mask, &act->sa_mask);
-		if (ret)
-			return ret;
-		siginitset(&new_ka.sa.sa_mask, mask);
-	}
-
-	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-	if (!ret && oact) {
-		ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler);
-		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-		ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
+		return sys_fcntl(fd, cmd, arg);
 	}
-
-	return ret;
 }
 
 asmlinkage long sys_ni_syscall(void);
 
 asmlinkage long
-sys32_ni_syscall(int dummy0, int dummy1, int dummy2, int dummy3,
-	int dummy4, int dummy5, int dummy6, int dummy7, int stack)
+sys32_ni_syscall (int dummy0, int dummy1, int dummy2, int dummy3, int dummy4, int dummy5,
+		  int dummy6, int dummy7, int stack)
 {
 	struct pt_regs *regs = (struct pt_regs *)&stack;
 
@@ -2577,7 +3181,7 @@
 #define IOLEN	((65536 / 4) * 4096)
 
 asmlinkage long
-sys_iopl (int level)
+sys32_iopl (int level)
 {
 	extern unsigned long ia64_iobase;
 	int fd;
@@ -2612,9 +3216,8 @@
 	up_write(&current->mm->mmap_sem);
 
 	if (addr >= 0) {
-		ia64_set_kr(IA64_KR_IO_BASE, addr);
 		old = (old & ~0x3000) | (level << 12);
-		__asm__ __volatile__("mov ar.eflag=%0 ;;" :: "r"(old));
+		asm volatile ("mov ar.eflag=%0;;" :: "r"(old));
 	}
 
 	fput(file);
@@ -2623,7 +3226,7 @@
 }
 
 asmlinkage long
-sys_ioperm (unsigned int from, unsigned int num, int on)
+sys32_ioperm (unsigned int from, unsigned int num, int on)
 {
 
 	/*
@@ -2636,7 +3239,7 @@
 	 * XXX proper ioperm() support should be emulated by
 	 *	manipulating the page protections...
 	 */
-	return sys_iopl(3);
+	return sys32_iopl(3);
 }
 
 typedef struct {
@@ -2646,10 +3249,8 @@
 } ia32_stack_t;
 
 asmlinkage long
-sys32_sigaltstack (const ia32_stack_t *uss32, ia32_stack_t *uoss32,
-long arg2, long arg3, long arg4,
-long arg5, long arg6, long arg7,
-long stack)
+sys32_sigaltstack (ia32_stack_t *uss32, ia32_stack_t *uoss32,
+		   long arg2, long arg3, long arg4, long arg5, long arg6, long arg7, long stack)
 {
 	struct pt_regs *pt = (struct pt_regs *) &stack;
 	stack_t uss, uoss;
@@ -2658,8 +3259,8 @@
 	mm_segment_t old_fs = get_fs();
 
 	if (uss32)
-		if (copy_from_user(&buf32, (void *)A(uss32), sizeof(ia32_stack_t)))
-			return(-EFAULT);
+		if (copy_from_user(&buf32, uss32, sizeof(ia32_stack_t)))
+			return -EFAULT;
 	uss.ss_sp = (void *) (long) buf32.ss_sp;
 	uss.ss_flags = buf32.ss_flags;
 	uss.ss_size = buf32.ss_size;
@@ -2672,34 +3273,34 @@
 		buf32.ss_sp = (long) uoss.ss_sp;
 		buf32.ss_flags = uoss.ss_flags;
 		buf32.ss_size = uoss.ss_size;
-		if (copy_to_user((void*)A(uoss32), &buf32, sizeof(ia32_stack_t)))
-			return(-EFAULT);
+		if (copy_to_user(uoss32, &buf32, sizeof(ia32_stack_t)))
+			return -EFAULT;
 	}
-	return(ret);
+	return ret;
 }
 
 asmlinkage int
-sys_pause (void)
+sys32_pause (void)
 {
 	current->state = TASK_INTERRUPTIBLE;
 	schedule();
 	return -ERESTARTNOHAND;
 }
 
-asmlinkage long sys_msync(unsigned long start, size_t len, int flags);
+asmlinkage long sys_msync (unsigned long start, size_t len, int flags);
 
 asmlinkage int
-sys32_msync(unsigned int start, unsigned int len, int flags)
+sys32_msync (unsigned int start, unsigned int len, int flags)
 {
 	unsigned int addr;
 
 	if (OFFSET4K(start))
 		return -EINVAL;
-	addr = start & PAGE_MASK;
-	return(sys_msync(addr, len + (start - addr), flags));
+	addr = PAGE_START(start);
+	return sys_msync(addr, len + (start - addr), flags);
 }
 
-struct sysctl_ia32 {
+struct sysctl32 {
 	unsigned int	name;
 	int		nlen;
 	unsigned int	oldval;
@@ -2712,16 +3313,16 @@
 extern asmlinkage long sys_sysctl(struct __sysctl_args *args);
 
 asmlinkage long
-sys32_sysctl(struct sysctl_ia32 *args32)
+sys32_sysctl (struct sysctl32 *args)
 {
-	struct sysctl_ia32 a32;
+	struct sysctl32 a32;
 	mm_segment_t old_fs = get_fs ();
 	void *oldvalp, *newvalp;
 	size_t oldlen;
 	int *namep;
 	long ret;
 
-	if (copy_from_user(&a32, args32, sizeof (a32)))
+	if (copy_from_user(&a32, args, sizeof(a32)))
 		return -EFAULT;
 
 	/*
@@ -2754,7 +3355,7 @@
 }
 
 asmlinkage long
-sys32_newuname(struct new_utsname * name)
+sys32_newuname (struct new_utsname *name)
 {
 	extern asmlinkage long sys_newuname(struct new_utsname * name);
 	int ret = sys_newuname(name);
@@ -2765,10 +3366,10 @@
 	return ret;
 }
 
-extern asmlinkage long sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
+extern asmlinkage long sys_getresuid (uid_t *ruid, uid_t *euid, uid_t *suid);
 
 asmlinkage long
-sys32_getresuid (u16 *ruid, u16 *euid, u16 *suid)
+sys32_getresuid16 (u16 *ruid, u16 *euid, u16 *suid)
 {
 	uid_t a, b, c;
 	int ret;
@@ -2786,7 +3387,7 @@
 extern asmlinkage long sys_getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid);
 
 asmlinkage long
-sys32_getresgid(u16 *rgid, u16 *egid, u16 *sgid)
+sys32_getresgid16 (u16 *rgid, u16 *egid, u16 *sgid)
 {
 	gid_t a, b, c;
 	int ret;
@@ -2796,15 +3397,13 @@
 	ret = sys_getresgid(&a, &b, &c);
 	set_fs(old_fs);
 
-	if (!ret) {
-		ret  = put_user(a, rgid);
-		ret |= put_user(b, egid);
-		ret |= put_user(c, sgid);
-	}
-	return ret;
+	if (ret)
+		return ret;
+
+	return put_user(a, rgid) | put_user(b, egid) | put_user(c, sgid);
 }
 
-int
+asmlinkage long
 sys32_lseek (unsigned int fd, int offset, unsigned int whence)
 {
 	extern off_t sys_lseek (unsigned int fd, off_t offset, unsigned int origin);
@@ -2813,36 +3412,272 @@
 	return sys_lseek(fd, offset, whence);
 }
 
-#ifdef	NOTYET  /* UNTESTED FOR IA64 FROM HERE DOWN */
+extern asmlinkage long sys_getgroups (int gidsetsize, gid_t *grouplist);
 
-/* In order to reduce some races, while at the same time doing additional
- * checking and hopefully speeding things up, we copy filenames to the
- * kernel data space before using them..
- *
- * POSIX.1 2.4: an empty pathname is invalid (ENOENT).
- */
-static inline int
-do_getname32(const char *filename, char *page)
+asmlinkage long
+sys32_getgroups16 (int gidsetsize, short *grouplist)
 {
-	int retval;
+	mm_segment_t old_fs = get_fs();
+	gid_t gl[NGROUPS];
+	int ret, i;
 
-	/* 32bit pointer will be always far below TASK_SIZE :)) */
-	retval = strncpy_from_user((char *)page, (char *)filename, PAGE_SIZE);
-	if (retval > 0) {
-		if (retval < PAGE_SIZE)
-			return 0;
-		return -ENAMETOOLONG;
-	} else if (!retval)
-		retval = -ENOENT;
-	return retval;
+	set_fs(KERNEL_DS);
+	ret = sys_getgroups(gidsetsize, gl);
+	set_fs(old_fs);
+
+	if (gidsetsize && ret > 0 && ret <= NGROUPS)
+		for (i = 0; i < ret; i++, grouplist++)
+			if (put_user(gl[i], grouplist))
+				return -EFAULT;
+	return ret;
 }
 
-char *
-getname32(const char *filename)
+extern asmlinkage long sys_setgroups (int gidsetsize, gid_t *grouplist);
+
+asmlinkage long
+sys32_setgroups16 (int gidsetsize, short *grouplist)
 {
-	char *tmp, *result;
+	mm_segment_t old_fs = get_fs();
+	gid_t gl[NGROUPS];
+	int ret, i;
 
-	result = ERR_PTR(-ENOMEM);
+	if ((unsigned) gidsetsize > NGROUPS)
+		return -EINVAL;
+	for (i = 0; i < gidsetsize; i++, grouplist++)
+		if (get_user(gl[i], grouplist))
+			return -EFAULT;
+	set_fs(KERNEL_DS);
+	ret = sys_setgroups(gidsetsize, gl);
+	set_fs(old_fs);
+	return ret;
+}
+
+/*
+ * Unfortunately, the x86 compiler aligns variables of type "long long" to a 4 byte boundary
+ * only, which means that the x86 version of "struct flock64" doesn't match the ia64 version
+ * of struct flock.
+ */
+
+static inline long
+ia32_put_flock (struct flock *l, unsigned long addr)
+{
+	return (put_user(l->l_type, (short *) addr)
+		| put_user(l->l_whence, (short *) (addr + 2))
+		| put_user(l->l_start, (long *) (addr + 4))
+		| put_user(l->l_len, (long *) (addr + 12))
+		| put_user(l->l_pid, (int *) (addr + 20)));
+}
+
+static inline long
+ia32_get_flock (struct flock *l, unsigned long addr)
+{
+	unsigned int start_lo, start_hi, len_lo, len_hi;
+	int err = (get_user(l->l_type, (short *) addr)
+		   | get_user(l->l_whence, (short *) (addr + 2))
+		   | get_user(start_lo, (int *) (addr + 4))
+		   | get_user(start_hi, (int *) (addr + 8))
+		   | get_user(len_lo, (int *) (addr + 12))
+		   | get_user(len_hi, (int *) (addr + 16))
+		   | get_user(l->l_pid, (int *) (addr + 20)));
+	l->l_start = ((unsigned long) start_hi << 32) | start_lo;
+	l->l_len = ((unsigned long) len_hi << 32) | len_lo;
+	return err;
+}
+
+asmlinkage long
+sys32_fcntl64 (unsigned int fd, unsigned int cmd, unsigned int arg)
+{
+	mm_segment_t old_fs;
+	struct flock f;
+	long ret;
+
+	switch (cmd) {
+	      case F_GETLK64:
+	      case F_SETLK64:
+	      case F_SETLKW64:
+		if (ia32_get_flock(&f, arg))
+			return -EFAULT;
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		ret = sys_fcntl(fd, cmd, (unsigned long) &f);
+		set_fs(old_fs);
+		if (cmd == F_GETLK && ia32_put_flock(&f, arg))
+			return -EFAULT;
+		break;
+
+	      default:
+		ret = sys32_fcntl(fd, cmd, arg);
+		break;
+	}
+	return ret;
+}
+
+asmlinkage long
+sys32_truncate64 (unsigned int path, unsigned int len_lo, unsigned int len_hi)
+{
+	extern asmlinkage long sys_truncate (const char *path, unsigned long length);
+
+	return sys_truncate((const char *) A(path), ((unsigned long) len_hi << 32) | len_lo);
+}
+
+asmlinkage long
+sys32_ftruncate64 (int fd, unsigned int len_lo, unsigned int len_hi)
+{
+	extern asmlinkage long sys_ftruncate (int fd, unsigned long length);
+
+	return sys_ftruncate(fd, ((unsigned long) len_hi << 32) | len_lo);
+}
+
+static int
+putstat64 (struct stat64 *ubuf, struct stat *kbuf)
+{
+	int err;
+
+	if (clear_user(ubuf, sizeof(*ubuf)))
+		return 1;
+
+	err  = __put_user(kbuf->st_dev, &ubuf->st_dev);
+	err |= __put_user(kbuf->st_ino, &ubuf->__st_ino);
+	err |= __put_user(kbuf->st_ino, &ubuf->st_ino_lo);
+	err |= __put_user(kbuf->st_ino >> 32, &ubuf->st_ino_hi);
+	err |= __put_user(kbuf->st_mode, &ubuf->st_mode);
+	err |= __put_user(kbuf->st_nlink, &ubuf->st_nlink);
+	err |= __put_user(kbuf->st_uid, &ubuf->st_uid);
+	err |= __put_user(kbuf->st_gid, &ubuf->st_gid);
+	err |= __put_user(kbuf->st_rdev, &ubuf->st_rdev);
+	err |= __put_user(kbuf->st_size, &ubuf->st_size_lo);
+	err |= __put_user((kbuf->st_size >> 32), &ubuf->st_size_hi);
+	err |= __put_user(kbuf->st_atime, &ubuf->st_atime);
+	err |= __put_user(kbuf->st_mtime, &ubuf->st_mtime);
+	err |= __put_user(kbuf->st_ctime, &ubuf->st_ctime);
+	err |= __put_user(kbuf->st_blksize, &ubuf->st_blksize);
+	err |= __put_user(kbuf->st_blocks, &ubuf->st_blocks);
+	return err;
+}
+
+asmlinkage long
+sys32_stat64 (char *filename, struct stat64 *statbuf)
+{
+	mm_segment_t old_fs = get_fs();
+	struct stat s;
+	long ret;
+
+	set_fs(KERNEL_DS);
+	ret = sys_newstat(filename, &s);
+	set_fs(old_fs);
+	if (putstat64(statbuf, &s))
+		return -EFAULT;
+	return ret;
+}
+
+asmlinkage long
+sys32_lstat64 (char *filename, struct stat64 *statbuf)
+{
+	mm_segment_t old_fs = get_fs();
+	struct stat s;
+	long ret;
+
+	set_fs(KERNEL_DS);
+	ret = sys_newlstat(filename, &s);
+	set_fs(old_fs);
+	if (putstat64(statbuf, &s))
+		return -EFAULT;
+	return ret;
+}
+
+asmlinkage long
+sys32_fstat64 (unsigned int fd, struct stat64 *statbuf)
+{
+	mm_segment_t old_fs = get_fs();
+	struct stat s;
+	long ret;
+
+	set_fs(KERNEL_DS);
+	ret = sys_newfstat(fd, &s);
+	set_fs(old_fs);
+	if (putstat64(statbuf, &s))
+		return -EFAULT;
+	return ret;
+}
+
+asmlinkage long
+sys32_sigpending (unsigned int *set)
+{
+	return do_sigpending(set, sizeof(*set));
+}
+
+struct sysinfo32 {
+	s32 uptime;
+	u32 loads[3];
+	u32 totalram;
+	u32 freeram;
+	u32 sharedram;
+	u32 bufferram;
+	u32 totalswap;
+	u32 freeswap;
+	unsigned short procs;
+	char _f[22];
+};
+
+asmlinkage long
+sys32_sysinfo (struct sysinfo32 *info)
+{
+	extern asmlinkage long sys_sysinfo (struct sysinfo *);
+	mm_segment_t old_fs = get_fs();
+	struct sysinfo s;
+	long ret, err;
+
+	set_fs(KERNEL_DS);
+	ret = sys_sysinfo(&s);
+	set_fs(old_fs);
+
+	if (!access_ok(VERIFY_WRITE, info, sizeof(*info)))
+		return -EFAULT;
+
+	err  = __put_user(s.uptime, &info->uptime);
+	err |= __put_user(s.loads[0], &info->loads[0]);
+	err |= __put_user(s.loads[1], &info->loads[1]);
+	err |= __put_user(s.loads[2], &info->loads[2]);
+	err |= __put_user(s.totalram, &info->totalram);
+	err |= __put_user(s.freeram, &info->freeram);
+	err |= __put_user(s.sharedram, &info->sharedram);
+	err |= __put_user(s.bufferram, &info->bufferram);
+	err |= __put_user(s.totalswap, &info->totalswap);
+	err |= __put_user(s.freeswap, &info->freeswap);
+	err |= __put_user(s.procs, &info->procs);
+	if (err)
+		return -EFAULT;
+	return ret;
+}
+
+/* In order to reduce some races, while at the same time doing additional
+ * checking and hopefully speeding things up, we copy filenames to the
+ * kernel data space before using them..
+ *
+ * POSIX.1 2.4: an empty pathname is invalid (ENOENT).
+ */
+static inline int
+do_getname32 (const char *filename, char *page)
+{
+	int retval;
+
+	/* 32bit pointer will be always far below TASK_SIZE :)) */
+	retval = strncpy_from_user((char *)page, (char *)filename, PAGE_SIZE);
+	if (retval > 0) {
+		if (retval < PAGE_SIZE)
+			return 0;
+		return -ENAMETOOLONG;
+	} else if (!retval)
+		retval = -ENOENT;
+	return retval;
+}
+
+static char *
+getname32 (const char *filename)
+{
+	char *tmp, *result;
+
+	result = ERR_PTR(-ENOMEM);
 	tmp = (char *)__get_free_page(GFP_KERNEL);
 	if (tmp)  {
 		int retval = do_getname32(filename, tmp);
@@ -2856,178 +3691,132 @@
 	return result;
 }
 
-/* 32-bit timeval and related flotsam.  */
-
-extern asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int on);
-
-asmlinkage long
-sys32_ioperm(u32 from, u32 num, int on)
-{
-	return sys_ioperm((unsigned long)from, (unsigned long)num, on);
-}
-
 struct dqblk32 {
-    __u32 dqb_bhardlimit;
-    __u32 dqb_bsoftlimit;
-    __u32 dqb_curblocks;
-    __u32 dqb_ihardlimit;
-    __u32 dqb_isoftlimit;
-    __u32 dqb_curinodes;
-    __kernel_time_t32 dqb_btime;
-    __kernel_time_t32 dqb_itime;
+	__u32 dqb_bhardlimit;
+	__u32 dqb_bsoftlimit;
+	__u32 dqb_curblocks;
+	__u32 dqb_ihardlimit;
+	__u32 dqb_isoftlimit;
+	__u32 dqb_curinodes;
+	__kernel_time_t32 dqb_btime;
+	__kernel_time_t32 dqb_itime;
 };
 
-extern asmlinkage long sys_quotactl(int cmd, const char *special, int id,
-				   caddr_t addr);
-
 asmlinkage long
-sys32_quotactl(int cmd, const char *special, int id, unsigned long addr)
+sys32_quotactl (int cmd, unsigned int special, int id, struct dqblk32 *addr)
 {
+	extern asmlinkage long sys_quotactl (int, const char *, int, caddr_t);
 	int cmds = cmd >> SUBCMDSHIFT;
-	int err;
-	struct dqblk d;
 	mm_segment_t old_fs;
+	struct dqblk d;
 	char *spec;
+	long err;
 
 	switch (cmds) {
-	case Q_GETQUOTA:
+	      case Q_GETQUOTA:
 		break;
-	case Q_SETQUOTA:
-	case Q_SETUSE:
-	case Q_SETQLIM:
-		if (copy_from_user (&d, (struct dqblk32 *)addr,
-				    sizeof (struct dqblk32)))
+	      case Q_SETQUOTA:
+	      case Q_SETUSE:
+	      case Q_SETQLIM:
+		if (copy_from_user (&d, addr, sizeof(struct dqblk32)))
 			return -EFAULT;
 		d.dqb_itime = ((struct dqblk32 *)&d)->dqb_itime;
 		d.dqb_btime = ((struct dqblk32 *)&d)->dqb_btime;
 		break;
-	default:
-		return sys_quotactl(cmd, special,
-				    id, (caddr_t)addr);
+	      default:
+		return sys_quotactl(cmd, (void *) A(special), id, (caddr_t) addr);
 	}
-	spec = getname32 (special);
+	spec = getname32((void *) A(special));
 	err = PTR_ERR(spec);
-	if (IS_ERR(spec)) return err;
+	if (IS_ERR(spec))
+		return err;
 	old_fs = get_fs ();
-	set_fs (KERNEL_DS);
+	set_fs(KERNEL_DS);
 	err = sys_quotactl(cmd, (const char *)spec, id, (caddr_t)&d);
-	set_fs (old_fs);
-	putname (spec);
+	set_fs(old_fs);
+	putname(spec);
 	if (cmds == Q_GETQUOTA) {
 		__kernel_time_t b = d.dqb_btime, i = d.dqb_itime;
 		((struct dqblk32 *)&d)->dqb_itime = i;
 		((struct dqblk32 *)&d)->dqb_btime = b;
-		if (copy_to_user ((struct dqblk32 *)addr, &d,
-				  sizeof (struct dqblk32)))
+		if (copy_to_user(addr, &d, sizeof(struct dqblk32)))
 			return -EFAULT;
 	}
 	return err;
 }
 
-extern asmlinkage long sys_utime(char * filename, struct utimbuf * times);
-
-struct utimbuf32 {
-	__kernel_time_t32 actime, modtime;
-};
-
 asmlinkage long
-sys32_utime(char * filename, struct utimbuf32 *times)
+sys32_sched_rr_get_interval (pid_t pid, struct timespec32 *interval)
 {
-	struct utimbuf t;
-	mm_segment_t old_fs;
-	int ret;
-	char *filenam;
+	extern asmlinkage long sys_sched_rr_get_interval (pid_t, struct timespec *);
+	mm_segment_t old_fs = get_fs();
+	struct timespec t;
+	long ret;
 
-	if (!times)
-		return sys_utime(filename, NULL);
-	if (get_user (t.actime, &times->actime) ||
-	    __get_user (t.modtime, &times->modtime))
-		return -EFAULT;
-	filenam = getname32 (filename);
-	ret = PTR_ERR(filenam);
-	if (!IS_ERR(filenam)) {
-		old_fs = get_fs();
-		set_fs (KERNEL_DS);
-		ret = sys_utime(filenam, &t);
-		set_fs (old_fs);
-		putname (filenam);
-	}
+	set_fs(KERNEL_DS);
+	ret = sys_sched_rr_get_interval(pid, &t);
+	set_fs(old_fs);
+	if (put_user (t.tv_sec, &interval->tv_sec) || put_user (t.tv_nsec, &interval->tv_nsec))
+		return -EFAULT;
 	return ret;
 }
 
-/*
- * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
- * 64-bit unsigned longs.
- */
-
-static inline int
-get_fd_set32(unsigned long n, unsigned long *fdset, u32 *ufdset)
+asmlinkage long
+sys32_pread (unsigned int fd, void *buf, unsigned int count, u32 pos_lo, u32 pos_hi)
 {
-	if (ufdset) {
-		unsigned long odd;
-
-		if (verify_area(VERIFY_WRITE, ufdset, n*sizeof(u32)))
-			return -EFAULT;
+	extern asmlinkage long sys_pread (unsigned int, char *, size_t, loff_t);
+	return sys_pread(fd, buf, count, ((unsigned long) pos_hi << 32) | pos_lo);
+}
 
-		odd = n & 1UL;
-		n &= ~1UL;
-		while (n) {
-			unsigned long h, l;
-			__get_user(l, ufdset);
-			__get_user(h, ufdset+1);
-			ufdset += 2;
-			*fdset++ = h << 32 | l;
-			n -= 2;
-		}
-		if (odd)
-			__get_user(*fdset, ufdset);
-	} else {
-		/* Tricky, must clear full unsigned long in the
-		 * kernel fdset at the end, this makes sure that
-		 * actually happens.
-		 */
-		memset(fdset, 0, ((n + 1) & ~1)*sizeof(u32));
-	}
-	return 0;
+asmlinkage long
+sys32_pwrite (unsigned int fd, void *buf, unsigned int count, u32 pos_lo, u32 pos_hi)
+{
+	extern asmlinkage long sys_pwrite (unsigned int, const char *, size_t, loff_t);
+	return sys_pwrite(fd, buf, count, ((unsigned long) pos_hi << 32) | pos_lo);
 }
 
-static inline void
-set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset)
+asmlinkage long
+sys32_sendfile (int out_fd, int in_fd, int *offset, unsigned int count)
 {
-	unsigned long odd;
+	extern asmlinkage long sys_sendfile (int, int, off_t *, size_t);
+	mm_segment_t old_fs = get_fs();
+	long ret;
+	off_t of;
 
-	if (!ufdset)
-		return;
+	if (offset && get_user(of, offset))
+		return -EFAULT;
 
-	odd = n & 1UL;
-	n &= ~1UL;
-	while (n) {
-		unsigned long h, l;
-		l = *fdset++;
-		h = l >> 32;
-		__put_user(l, ufdset);
-		__put_user(h, ufdset+1);
-		ufdset += 2;
-		n -= 2;
-	}
-	if (odd)
-		__put_user(*fdset, ufdset);
-}
+	set_fs(KERNEL_DS);
+	ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
+	set_fs(old_fs);
+
+	if (!ret && offset && put_user(of, offset))
+		return -EFAULT;
 
-extern asmlinkage long sys_sysfs(int option, unsigned long arg1,
-				unsigned long arg2);
+	return ret;
+}
 
 asmlinkage long
-sys32_sysfs(int option, u32 arg1, u32 arg2)
+sys32_personality (unsigned int personality)
 {
-	return sys_sysfs(option, arg1, arg2);
+	extern asmlinkage long sys_personality (unsigned long);
+	long ret;
+
+	if (current->personality == PER_LINUX32 && personality == PER_LINUX)
+		personality = PER_LINUX32;
+	ret = sys_personality(personality);
+	if (ret == PER_LINUX32)
+		ret = PER_LINUX;
+	return ret;
 }
 
+#ifdef	NOTYET  /* UNTESTED FOR IA64 FROM HERE DOWN */
+
 struct ncp_mount_data32 {
 	int version;
 	unsigned int ncp_fd;
 	__kernel_uid_t32 mounted_uid;
-	__kernel_pid_t32 wdog_pid;
+	int wdog_pid;
 	unsigned char mounted_vol[NCP_VOLNAME_LEN + 1];
 	unsigned int time_out;
 	unsigned int retry_count;
@@ -3061,1485 +3850,169 @@
 	__kernel_uid_t32 uid;
 	__kernel_gid_t32 gid;
 	__kernel_mode_t32 file_mode;
-	__kernel_mode_t32 dir_mode;
-};
-
-static void *
-do_smb_super_data_conv(void *raw_data)
-{
-	struct smb_mount_data *s = (struct smb_mount_data *)raw_data;
-	struct smb_mount_data32 *s32 = (struct smb_mount_data32 *)raw_data;
-
-	s->version = s32->version;
-	s->mounted_uid = s32->mounted_uid;
-	s->uid = s32->uid;
-	s->gid = s32->gid;
-	s->file_mode = s32->file_mode;
-	s->dir_mode = s32->dir_mode;
-	return raw_data;
-}
-
-static int
-copy_mount_stuff_to_kernel(const void *user, unsigned long *kernel)
-{
-	int i;
-	unsigned long page;
-	struct vm_area_struct *vma;
-
-	*kernel = 0;
-	if(!user)
-		return 0;
-	vma = find_vma(current->mm, (unsigned long)user);
-	if(!vma || (unsigned long)user < vma->vm_start)
-		return -EFAULT;
-	if(!(vma->vm_flags & VM_READ))
-		return -EFAULT;
-	i = vma->vm_end - (unsigned long) user;
-	if(PAGE_SIZE <= (unsigned long) i)
-		i = PAGE_SIZE - 1;
-	if(!(page = __get_free_page(GFP_KERNEL)))
-		return -ENOMEM;
-	if(copy_from_user((void *) page, user, i)) {
-		free_page(page);
-		return -EFAULT;
-	}
-	*kernel = page;
-	return 0;
-}
-
-extern asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,
-				unsigned long new_flags, void *data);
-
-#define SMBFS_NAME	"smbfs"
-#define NCPFS_NAME	"ncpfs"
-
-asmlinkage long
-sys32_mount(char *dev_name, char *dir_name, char *type,
-	    unsigned long new_flags, u32 data)
-{
-	unsigned long type_page;
-	int err, is_smb, is_ncp;
-
-	if(!capable(CAP_SYS_ADMIN))
-		return -EPERM;
-	is_smb = is_ncp = 0;
-	err = copy_mount_stuff_to_kernel((const void *)type, &type_page);
-	if(err)
-		return err;
-	if(type_page) {
-		is_smb = !strcmp((char *)type_page, SMBFS_NAME);
-		is_ncp = !strcmp((char *)type_page, NCPFS_NAME);
-	}
-	if(!is_smb && !is_ncp) {
-		if(type_page)
-			free_page(type_page);
-		return sys_mount(dev_name, dir_name, type, new_flags,
-				 (void *)AA(data));
-	} else {
-		unsigned long dev_page, dir_page, data_page;
-
-		err = copy_mount_stuff_to_kernel((const void *)dev_name,
-						 &dev_page);
-		if(err)
-			goto out;
-		err = copy_mount_stuff_to_kernel((const void *)dir_name,
-						 &dir_page);
-		if(err)
-			goto dev_out;
-		err = copy_mount_stuff_to_kernel((const void *)AA(data),
-						 &data_page);
-		if(err)
-			goto dir_out;
-		if(is_ncp)
-			do_ncp_super_data_conv((void *)data_page);
-		else if(is_smb)
-			do_smb_super_data_conv((void *)data_page);
-		else
-			panic("The problem is here...");
-		err = do_mount((char *)dev_page, (char *)dir_page,
-				(char *)type_page, new_flags,
-				(void *)data_page);
-		if(data_page)
-			free_page(data_page);
-	dir_out:
-		if(dir_page)
-			free_page(dir_page);
-	dev_out:
-		if(dev_page)
-			free_page(dev_page);
-	out:
-		if(type_page)
-			free_page(type_page);
-		return err;
-	}
-}
-
-struct sysinfo32 {
-	s32 uptime;
-	u32 loads[3];
-	u32 totalram;
-	u32 freeram;
-	u32 sharedram;
-	u32 bufferram;
-	u32 totalswap;
-	u32 freeswap;
-	unsigned short procs;
-	char _f[22];
-};
-
-extern asmlinkage long sys_sysinfo(struct sysinfo *info);
-
-asmlinkage long
-sys32_sysinfo(struct sysinfo32 *info)
-{
-	struct sysinfo s;
-	int ret, err;
-	mm_segment_t old_fs = get_fs ();
-
-	set_fs (KERNEL_DS);
-	ret = sys_sysinfo(&s);
-	set_fs (old_fs);
-	err = put_user (s.uptime, &info->uptime);
-	err |= __put_user (s.loads[0], &info->loads[0]);
-	err |= __put_user (s.loads[1], &info->loads[1]);
-	err |= __put_user (s.loads[2], &info->loads[2]);
-	err |= __put_user (s.totalram, &info->totalram);
-	err |= __put_user (s.freeram, &info->freeram);
-	err |= __put_user (s.sharedram, &info->sharedram);
-	err |= __put_user (s.bufferram, &info->bufferram);
-	err |= __put_user (s.totalswap, &info->totalswap);
-	err |= __put_user (s.freeswap, &info->freeswap);
-	err |= __put_user (s.procs, &info->procs);
-	if (err)
-		return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage long sys_sched_rr_get_interval(pid_t pid,
-						struct timespec *interval);
-
-asmlinkage long
-sys32_sched_rr_get_interval(__kernel_pid_t32 pid, struct timespec32 *interval)
-{
-	struct timespec t;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-
-	set_fs (KERNEL_DS);
-	ret = sys_sched_rr_get_interval(pid, &t);
-	set_fs (old_fs);
-	if (put_user (t.tv_sec, &interval->tv_sec) ||
-	    __put_user (t.tv_nsec, &interval->tv_nsec))
-		return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage long sys_sigprocmask(int how, old_sigset_t *set,
-				      old_sigset_t *oset);
-
-asmlinkage long
-sys32_sigprocmask(int how, old_sigset_t32 *set, old_sigset_t32 *oset)
-{
-	old_sigset_t s;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-
-	if (set && get_user (s, set)) return -EFAULT;
-	set_fs (KERNEL_DS);
-	ret = sys_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL);
-	set_fs (old_fs);
-	if (ret) return ret;
-	if (oset && put_user (s, oset)) return -EFAULT;
-	return 0;
-}
-
-extern asmlinkage long sys_sigpending(old_sigset_t *set);
-
-asmlinkage long
-sys32_sigpending(old_sigset_t32 *set)
-{
-	old_sigset_t s;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-
-	set_fs (KERNEL_DS);
-	ret = sys_sigpending(&s);
-	set_fs (old_fs);
-	if (put_user (s, set)) return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage long sys_rt_sigpending(sigset_t *set, size_t sigsetsize);
-
-asmlinkage long
-sys32_rt_sigpending(sigset_t32 *set, __kernel_size_t32 sigsetsize)
-{
-	sigset_t s;
-	sigset_t32 s32;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigpending(&s, sigsetsize);
-	set_fs (old_fs);
-	if (!ret) {
-		switch (_NSIG_WORDS) {
-		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-		}
-		if (copy_to_user (set, &s32, sizeof(sigset_t32)))
-			return -EFAULT;
-	}
-	return ret;
-}
-
-siginfo_t32 *
-siginfo64to32(siginfo_t32 *d, siginfo_t *s)
-{
-	memset(d, 0, sizeof(siginfo_t32));
-	d->si_signo = s->si_signo;
-	d->si_errno = s->si_errno;
-	d->si_code = s->si_code;
-	if (s->si_signo >= SIGRTMIN) {
-		d->si_pid = s->si_pid;
-		d->si_uid = s->si_uid;
-		/* XXX: Ouch, how to find this out??? */
-		d->si_int = s->si_int;
-	} else switch (s->si_signo) {
-	/* XXX: What about POSIX1.b timers */
-	case SIGCHLD:
-		d->si_pid = s->si_pid;
-		d->si_status = s->si_status;
-		d->si_utime = s->si_utime;
-		d->si_stime = s->si_stime;
-		break;
-	case SIGSEGV:
-	case SIGBUS:
-	case SIGFPE:
-	case SIGILL:
-		d->si_addr = (long)(s->si_addr);
-		/* XXX: Do we need to translate this from ia64 to ia32 traps? */
-		d->si_trapno = s->si_trapno;
-		break;
-	case SIGPOLL:
-		d->si_band = s->si_band;
-		d->si_fd = s->si_fd;
-		break;
-	default:
-		d->si_pid = s->si_pid;
-		d->si_uid = s->si_uid;
-		break;
-	}
-	return d;
-}
-
-siginfo_t *
-siginfo32to64(siginfo_t *d, siginfo_t32 *s)
-{
-	d->si_signo = s->si_signo;
-	d->si_errno = s->si_errno;
-	d->si_code = s->si_code;
-	if (s->si_signo >= SIGRTMIN) {
-		d->si_pid = s->si_pid;
-		d->si_uid = s->si_uid;
-		/* XXX: Ouch, how to find this out??? */
-		d->si_int = s->si_int;
-	} else switch (s->si_signo) {
-	/* XXX: What about POSIX1.b timers */
-	case SIGCHLD:
-		d->si_pid = s->si_pid;
-		d->si_status = s->si_status;
-		d->si_utime = s->si_utime;
-		d->si_stime = s->si_stime;
-		break;
-	case SIGSEGV:
-	case SIGBUS:
-	case SIGFPE:
-	case SIGILL:
-		d->si_addr = (void *)A(s->si_addr);
-		/* XXX: Do we need to translate this from ia32 to ia64 traps? */
-		d->si_trapno = s->si_trapno;
-		break;
-	case SIGPOLL:
-		d->si_band = s->si_band;
-		d->si_fd = s->si_fd;
-		break;
-	default:
-		d->si_pid = s->si_pid;
-		d->si_uid = s->si_uid;
-		break;
-	}
-	return d;
-}
-
-extern asmlinkage long
-sys_rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo,
-		    const struct timespec *uts, size_t sigsetsize);
-
-asmlinkage long
-sys32_rt_sigtimedwait(sigset_t32 *uthese, siginfo_t32 *uinfo,
-		      struct timespec32 *uts, __kernel_size_t32 sigsetsize)
-{
-	sigset_t s;
-	sigset_t32 s32;
-	struct timespec t;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	siginfo_t info;
-	siginfo_t32 info32;
-
-	if (copy_from_user (&s32, uthese, sizeof(sigset_t32)))
-		return -EFAULT;
-	switch (_NSIG_WORDS) {
-	case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
-	case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
-	case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
-	case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
-	}
-	if (uts) {
-		ret = get_user (t.tv_sec, &uts->tv_sec);
-		ret |= __get_user (t.tv_nsec, &uts->tv_nsec);
-		if (ret)
-			return -EFAULT;
-	}
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigtimedwait(&s, &info, &t, sigsetsize);
-	set_fs (old_fs);
-	if (ret >= 0 && uinfo) {
-		if (copy_to_user (uinfo, siginfo64to32(&info32, &info),
-				  sizeof(siginfo_t32)))
-			return -EFAULT;
-	}
-	return ret;
-}
-
-extern asmlinkage long
-sys_rt_sigqueueinfo(int pid, int sig, siginfo_t *uinfo);
-
-asmlinkage long
-sys32_rt_sigqueueinfo(int pid, int sig, siginfo_t32 *uinfo)
-{
-	siginfo_t info;
-	siginfo_t32 info32;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-
-	if (copy_from_user (&info32, uinfo, sizeof(siginfo_t32)))
-		return -EFAULT;
-	/* XXX: Is this correct? */
-	siginfo32to64(&info, &info32);
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigqueueinfo(pid, sig, &info);
-	set_fs (old_fs);
-	return ret;
-}
-
-extern asmlinkage long sys_setreuid(uid_t ruid, uid_t euid);
-
-asmlinkage long sys32_setreuid(__kernel_uid_t32 ruid, __kernel_uid_t32 euid)
-{
-	uid_t sruid, seuid;
-
-	sruid = (ruid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)ruid);
-	seuid = (euid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)euid);
-	return sys_setreuid(sruid, seuid);
-}
-
-extern asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid);
-
-asmlinkage long
-sys32_setresuid(__kernel_uid_t32 ruid, __kernel_uid_t32 euid,
-		__kernel_uid_t32 suid)
-{
-	uid_t sruid, seuid, ssuid;
-
-	sruid = (ruid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)ruid);
-	seuid = (euid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)euid);
-	ssuid = (suid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)suid);
-	return sys_setresuid(sruid, seuid, ssuid);
-}
-
-extern asmlinkage long sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
-
-asmlinkage long
-sys32_getresuid(__kernel_uid_t32 *ruid, __kernel_uid_t32 *euid,
-		__kernel_uid_t32 *suid)
-{
-	uid_t a, b, c;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-
-	set_fs (KERNEL_DS);
-	ret = sys_getresuid(&a, &b, &c);
-	set_fs (old_fs);
-	if (put_user (a, ruid) || put_user (b, euid) || put_user (c, suid))
-		return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage long sys_setregid(gid_t rgid, gid_t egid);
-
-asmlinkage long
-sys32_setregid(__kernel_gid_t32 rgid, __kernel_gid_t32 egid)
-{
-	gid_t srgid, segid;
-
-	srgid = (rgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)rgid);
-	segid = (egid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)egid);
-	return sys_setregid(srgid, segid);
-}
-
-extern asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid);
-
-asmlinkage long
-sys32_setresgid(__kernel_gid_t32 rgid, __kernel_gid_t32 egid,
-		__kernel_gid_t32 sgid)
-{
-	gid_t srgid, segid, ssgid;
-
-	srgid = (rgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)rgid);
-	segid = (egid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)egid);
-	ssgid = (sgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)sgid);
-	return sys_setresgid(srgid, segid, ssgid);
-}
-
-extern asmlinkage long sys_getgroups(int gidsetsize, gid_t *grouplist);
-
-asmlinkage long
-sys32_getgroups(int gidsetsize, __kernel_gid_t32 *grouplist)
-{
-	gid_t gl[NGROUPS];
-	int ret, i;
-	mm_segment_t old_fs = get_fs ();
-
-	set_fs (KERNEL_DS);
-	ret = sys_getgroups(gidsetsize, gl);
-	set_fs (old_fs);
-	if (gidsetsize && ret > 0 && ret <= NGROUPS)
-		for (i = 0; i < ret; i++, grouplist++)
-			if (__put_user (gl[i], grouplist))
-				return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage long sys_setgroups(int gidsetsize, gid_t *grouplist);
-
-asmlinkage long
-sys32_setgroups(int gidsetsize, __kernel_gid_t32 *grouplist)
-{
-	gid_t gl[NGROUPS];
-	int ret, i;
-	mm_segment_t old_fs = get_fs ();
-
-	if ((unsigned) gidsetsize > NGROUPS)
-		return -EINVAL;
-	for (i = 0; i < gidsetsize; i++, grouplist++)
-		if (__get_user (gl[i], grouplist))
-			return -EFAULT;
-	set_fs (KERNEL_DS);
-	ret = sys_setgroups(gidsetsize, gl);
-	set_fs (old_fs);
-	return ret;
-}
-
-
-/* XXX These as well... */
-extern __inline__ struct socket *
-socki_lookup(struct inode *inode)
-{
-	return &inode->u.socket_i;
-}
-
-extern __inline__ struct socket *
-sockfd_lookup(int fd, int *err)
-{
-	struct file *file;
-	struct inode *inode;
-
-	if (!(file = fget(fd)))
-	{
-		*err = -EBADF;
-		return NULL;
-	}
-
-	inode = file->f_dentry->d_inode;
-	if (!inode->i_sock || !socki_lookup(inode))
-	{
-		*err = -ENOTSOCK;
-		fput(file);
-		return NULL;
-	}
-
-	return socki_lookup(inode);
-}
-
-struct msghdr32 {
-	u32               msg_name;
-	int               msg_namelen;
-	u32               msg_iov;
-	__kernel_size_t32 msg_iovlen;
-	u32               msg_control;
-	__kernel_size_t32 msg_controllen;
-	unsigned          msg_flags;
-};
-
-struct cmsghdr32 {
-	__kernel_size_t32 cmsg_len;
-	int               cmsg_level;
-	int               cmsg_type;
-};
-
-/* Bleech... */
-#define __CMSG32_NXTHDR(ctl, len, cmsg, cmsglen) \
-	__cmsg32_nxthdr((ctl),(len),(cmsg),(cmsglen))
-#define CMSG32_NXTHDR(mhdr, cmsg, cmsglen) \
-	cmsg32_nxthdr((mhdr), (cmsg), (cmsglen))
-
-#define CMSG32_ALIGN(len) ( ((len)+sizeof(int)-1) & ~(sizeof(int)-1) )
-
-#define CMSG32_DATA(cmsg) \
-	((void *)((char *)(cmsg) + CMSG32_ALIGN(sizeof(struct cmsghdr32))))
-#define CMSG32_SPACE(len) \
-	(CMSG32_ALIGN(sizeof(struct cmsghdr32)) + CMSG32_ALIGN(len))
-#define CMSG32_LEN(len) (CMSG32_ALIGN(sizeof(struct cmsghdr32)) + (len))
-
-#define __CMSG32_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr32) ? \
-				    (struct cmsghdr32 *)(ctl) : \
-				    (struct cmsghdr32 *)NULL)
-#define CMSG32_FIRSTHDR(msg) \
-	__CMSG32_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
-
-__inline__ struct cmsghdr32 *
-__cmsg32_nxthdr(void *__ctl, __kernel_size_t __size,
-		struct cmsghdr32 *__cmsg, int __cmsg_len)
-{
-	struct cmsghdr32 * __ptr;
-
-	__ptr = (struct cmsghdr32 *)(((unsigned char *) __cmsg) +
-				     CMSG32_ALIGN(__cmsg_len));
-	if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
-		return NULL;
-
-	return __ptr;
-}
-
-__inline__ struct cmsghdr32 *
-cmsg32_nxthdr (struct msghdr *__msg, struct cmsghdr32 *__cmsg, int __cmsg_len)
-{
-	return __cmsg32_nxthdr(__msg->msg_control, __msg->msg_controllen,
-			       __cmsg, __cmsg_len);
-}
-
-static inline int
-iov_from_user32_to_kern(struct iovec *kiov, struct iovec32 *uiov32, int niov)
-{
-	int tot_len = 0;
-
-	while(niov > 0) {
-		u32 len, buf;
-
-		if(get_user(len, &uiov32->iov_len) ||
-		   get_user(buf, &uiov32->iov_base)) {
-			tot_len = -EFAULT;
-			break;
-		}
-		tot_len += len;
-		kiov->iov_base = (void *)A(buf);
-		kiov->iov_len = (__kernel_size_t) len;
-		uiov32++;
-		kiov++;
-		niov--;
-	}
-	return tot_len;
-}
-
-static inline int
-msghdr_from_user32_to_kern(struct msghdr *kmsg, struct msghdr32 *umsg)
-{
-	u32 tmp1, tmp2, tmp3;
-	int err;
-
-	err = get_user(tmp1, &umsg->msg_name);
-	err |= __get_user(tmp2, &umsg->msg_iov);
-	err |= __get_user(tmp3, &umsg->msg_control);
-	if (err)
-		return -EFAULT;
-
-	kmsg->msg_name = (void *)A(tmp1);
-	kmsg->msg_iov = (struct iovec *)A(tmp2);
-	kmsg->msg_control = (void *)A(tmp3);
-
-	err = get_user(kmsg->msg_namelen, &umsg->msg_namelen);
-	err |= get_user(kmsg->msg_iovlen, &umsg->msg_iovlen);
-	err |= get_user(kmsg->msg_controllen, &umsg->msg_controllen);
-	err |= get_user(kmsg->msg_flags, &umsg->msg_flags);
-
-	return err;
-}
-
-/* I've named the args so it is easy to tell whose space the pointers are in. */
-static int
-verify_iovec32(struct msghdr *kern_msg, struct iovec *kern_iov,
-	       char *kern_address, int mode)
-{
-	int tot_len;
-
-	if(kern_msg->msg_namelen) {
-		if(mode==VERIFY_READ) {
-			int err = move_addr_to_kernel(kern_msg->msg_name,
-						      kern_msg->msg_namelen,
-						      kern_address);
-			if(err < 0)
-				return err;
-		}
-		kern_msg->msg_name = kern_address;
-	} else
-		kern_msg->msg_name = NULL;
-
-	if(kern_msg->msg_iovlen > UIO_FASTIOV) {
-		kern_iov = kmalloc(kern_msg->msg_iovlen * sizeof(struct iovec),
-				   GFP_KERNEL);
-		if(!kern_iov)
-			return -ENOMEM;
-	}
-
-	tot_len = iov_from_user32_to_kern(kern_iov,
-					  (struct iovec32 *)kern_msg->msg_iov,
-					  kern_msg->msg_iovlen);
-	if(tot_len >= 0)
-		kern_msg->msg_iov = kern_iov;
-	else if(kern_msg->msg_iovlen > UIO_FASTIOV)
-		kfree(kern_iov);
-
-	return tot_len;
-}
-
-/* There is a lot of hair here because the alignment rules (and
- * thus placement) of cmsg headers and length are different for
- * 32-bit apps.  -DaveM
- */
-static int
-cmsghdr_from_user32_to_kern(struct msghdr *kmsg, unsigned char *stackbuf,
-			    int stackbuf_size)
-{
-	struct cmsghdr32 *ucmsg;
-	struct cmsghdr *kcmsg, *kcmsg_base;
-	__kernel_size_t32 ucmlen;
-	__kernel_size_t kcmlen, tmp;
-
-	kcmlen = 0;
-	kcmsg_base = kcmsg = (struct cmsghdr *)stackbuf;
-	ucmsg = CMSG32_FIRSTHDR(kmsg);
-	while(ucmsg != NULL) {
-		if(get_user(ucmlen, &ucmsg->cmsg_len))
-			return -EFAULT;
-
-		/* Catch bogons. */
-		if(CMSG32_ALIGN(ucmlen) <
-		   CMSG32_ALIGN(sizeof(struct cmsghdr32)))
-			return -EINVAL;
-		if((unsigned long)(((char *)ucmsg - (char *)kmsg->msg_control)
-				   + ucmlen) > kmsg->msg_controllen)
-			return -EINVAL;
-
-		tmp = ((ucmlen - CMSG32_ALIGN(sizeof(*ucmsg))) +
-		       CMSG_ALIGN(sizeof(struct cmsghdr)));
-		kcmlen += tmp;
-		ucmsg = CMSG32_NXTHDR(kmsg, ucmsg, ucmlen);
-	}
-	if(kcmlen == 0)
-		return -EINVAL;
-
-	/* The kcmlen holds the 64-bit version of the control length.
-	 * It may not be modified as we do not stick it into the kmsg
-	 * until we have successfully copied over all of the data
-	 * from the user.
-	 */
-	if(kcmlen > stackbuf_size)
-		kcmsg_base = kcmsg = kmalloc(kcmlen, GFP_KERNEL);
-	if(kcmsg == NULL)
-		return -ENOBUFS;
-
-	/* Now copy them over neatly. */
-	memset(kcmsg, 0, kcmlen);
-	ucmsg = CMSG32_FIRSTHDR(kmsg);
-	while(ucmsg != NULL) {
-		__get_user(ucmlen, &ucmsg->cmsg_len);
-		tmp = ((ucmlen - CMSG32_ALIGN(sizeof(*ucmsg))) +
-		       CMSG_ALIGN(sizeof(struct cmsghdr)));
-		kcmsg->cmsg_len = tmp;
-		__get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level);
-		__get_user(kcmsg->cmsg_type, &ucmsg->cmsg_type);
-
-		/* Copy over the data. */
-		if(copy_from_user(CMSG_DATA(kcmsg),
-				  CMSG32_DATA(ucmsg),
-				  (ucmlen - CMSG32_ALIGN(sizeof(*ucmsg)))))
-			goto out_free_efault;
-
-		/* Advance. */
-		kcmsg = (struct cmsghdr *)((char *)kcmsg + CMSG_ALIGN(tmp));
-		ucmsg = CMSG32_NXTHDR(kmsg, ucmsg, ucmlen);
-	}
-
-	/* Ok, looks like we made it.  Hook it up and return success. */
-	kmsg->msg_control = kcmsg_base;
-	kmsg->msg_controllen = kcmlen;
-	return 0;
-
-out_free_efault:
-	if(kcmsg_base != (struct cmsghdr *)stackbuf)
-		kfree(kcmsg_base);
-	return -EFAULT;
-}
-
-static void
-put_cmsg32(struct msghdr *kmsg, int level, int type, int len, void *data)
-{
-	struct cmsghdr32 *cm = (struct cmsghdr32 *) kmsg->msg_control;
-	struct cmsghdr32 cmhdr;
-	int cmlen = CMSG32_LEN(len);
-
-	if(cm == NULL || kmsg->msg_controllen < sizeof(*cm)) {
-		kmsg->msg_flags |= MSG_CTRUNC;
-		return;
-	}
-
-	if(kmsg->msg_controllen < cmlen) {
-		kmsg->msg_flags |= MSG_CTRUNC;
-		cmlen = kmsg->msg_controllen;
-	}
-	cmhdr.cmsg_level = level;
-	cmhdr.cmsg_type = type;
-	cmhdr.cmsg_len = cmlen;
-
-	if(copy_to_user(cm, &cmhdr, sizeof cmhdr))
-		return;
-	if(copy_to_user(CMSG32_DATA(cm), data,
-			cmlen - sizeof(struct cmsghdr32)))
-		return;
-	cmlen = CMSG32_SPACE(len);
-	kmsg->msg_control += cmlen;
-	kmsg->msg_controllen -= cmlen;
-}
-
-static void scm_detach_fds32(struct msghdr *kmsg, struct scm_cookie *scm)
-{
-	struct cmsghdr32 *cm = (struct cmsghdr32 *) kmsg->msg_control;
-	int fdmax = (kmsg->msg_controllen - sizeof(struct cmsghdr32))
-		/ sizeof(int);
-	int fdnum = scm->fp->count;
-	struct file **fp = scm->fp->fp;
-	int *cmfptr;
-	int err = 0, i;
-
-	if (fdnum < fdmax)
-		fdmax = fdnum;
-
-	for (i = 0, cmfptr = (int *) CMSG32_DATA(cm);
-	     i < fdmax;
-	     i++, cmfptr++) {
-		int new_fd;
-		err = get_unused_fd();
-		if (err < 0)
-			break;
-		new_fd = err;
-		err = put_user(new_fd, cmfptr);
-		if (err) {
-			put_unused_fd(new_fd);
-			break;
-		}
-		/* Bump the usage count and install the file. */
-		fp[i]->f_count++;
-		current->files->fd[new_fd] = fp[i];
-	}
-
-	if (i > 0) {
-		int cmlen = CMSG32_LEN(i * sizeof(int));
-		if (!err)
-			err = put_user(SOL_SOCKET, &cm->cmsg_level);
-		if (!err)
-			err = put_user(SCM_RIGHTS, &cm->cmsg_type);
-		if (!err)
-			err = put_user(cmlen, &cm->cmsg_len);
-		if (!err) {
-			cmlen = CMSG32_SPACE(i * sizeof(int));
-			kmsg->msg_control += cmlen;
-			kmsg->msg_controllen -= cmlen;
-		}
-	}
-	if (i < fdnum)
-		kmsg->msg_flags |= MSG_CTRUNC;
-
-	/*
-	 * All of the files that fit in the message have had their
-	 * usage counts incremented, so we just free the list.
-	 */
-	__scm_destroy(scm);
-}
-
-/* In these cases we (currently) can just copy to data over verbatim
- * because all CMSGs created by the kernel have well defined types which
- * have the same layout in both the 32-bit and 64-bit API.  One must add
- * some special cased conversions here if we start sending control messages
- * with incompatible types.
- *
- * SCM_RIGHTS and SCM_CREDENTIALS are done by hand in recvmsg32 right after
- * we do our work.  The remaining cases are:
- *
- * SOL_IP	IP_PKTINFO	struct in_pktinfo	32-bit clean
- *		IP_TTL		int			32-bit clean
- *		IP_TOS		__u8			32-bit clean
- *		IP_RECVOPTS	variable length		32-bit clean
- *		IP_RETOPTS	variable length		32-bit clean
- *		(these last two are clean because the types are defined
- *		 by the IPv4 protocol)
- *		IP_RECVERR	struct sock_extended_err +
- *				struct sockaddr_in	32-bit clean
- * SOL_IPV6	IPV6_RECVERR	struct sock_extended_err +
- *				struct sockaddr_in6	32-bit clean
- *		IPV6_PKTINFO	struct in6_pktinfo	32-bit clean
- *		IPV6_HOPLIMIT	int			32-bit clean
- *		IPV6_FLOWINFO	u32			32-bit clean
- *		IPV6_HOPOPTS	ipv6 hop exthdr		32-bit clean
- *		IPV6_DSTOPTS	ipv6 dst exthdr(s)	32-bit clean
- *		IPV6_RTHDR	ipv6 routing exthdr	32-bit clean
- *		IPV6_AUTHHDR	ipv6 auth exthdr	32-bit clean
- */
-static void
-cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-{
-	unsigned char *workbuf, *wp;
-	unsigned long bufsz, space_avail;
-	struct cmsghdr *ucmsg;
-
-	bufsz = ((unsigned long)kmsg->msg_control) - orig_cmsg_uptr;
-	space_avail = kmsg->msg_controllen + bufsz;
-	wp = workbuf = kmalloc(bufsz, GFP_KERNEL);
-	if(workbuf == NULL)
-		goto fail;
-
-	/* To make this more sane we assume the kernel sends back properly
-	 * formatted control messages.  Because of how the kernel will truncate
-	 * the cmsg_len for MSG_TRUNC cases, we need not check that case either.
-	 */
-	ucmsg = (struct cmsghdr *) orig_cmsg_uptr;
-	while(((unsigned long)ucmsg) < ((unsigned long)kmsg->msg_control)) {
-		struct cmsghdr32 *kcmsg32 = (struct cmsghdr32 *) wp;
-		int clen64, clen32;
-
-		/* UCMSG is the 64-bit format CMSG entry in user-space.
-		 * KCMSG32 is within the kernel space temporary buffer
-		 * we use to convert into a 32-bit style CMSG.
-		 */
-		__get_user(kcmsg32->cmsg_len, &ucmsg->cmsg_len);
-		__get_user(kcmsg32->cmsg_level, &ucmsg->cmsg_level);
-		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-
-		clen64 = kcmsg32->cmsg_len;
-		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-			  CMSG32_ALIGN(sizeof(struct cmsghdr32)));
-		kcmsg32->cmsg_len = clen32;
-
-		ucmsg = (struct cmsghdr *) (((char *)ucmsg) +
-					    CMSG_ALIGN(clen64));
-		wp = (((char *)kcmsg32) + CMSG32_ALIGN(clen32));
-	}
-
-	/* Copy back fixed up data, and adjust pointers. */
-	bufsz = (wp - workbuf);
-	copy_to_user((void *)orig_cmsg_uptr, workbuf, bufsz);
-
-	kmsg->msg_control = (struct cmsghdr *)
-		(((char *)orig_cmsg_uptr) + bufsz);
-	kmsg->msg_controllen = space_avail - bufsz;
-
-	kfree(workbuf);
-	return;
-
-fail:
-	/* If we leave the 64-bit format CMSG chunks in there,
-	 * the application could get confused and crash.  So to
-	 * ensure greater recovery, we report no CMSGs.
-	 */
-	kmsg->msg_controllen += bufsz;
-	kmsg->msg_control = (void *) orig_cmsg_uptr;
-}
-
-asmlinkage long
-sys32_sendmsg(int fd, struct msghdr32 *user_msg, unsigned user_flags)
-{
-	struct socket *sock;
-	char address[MAX_SOCK_ADDR];
-	struct iovec iov[UIO_FASTIOV];
-	unsigned char ctl[sizeof(struct cmsghdr) + 20];
-	unsigned char *ctl_buf = ctl;
-	struct msghdr kern_msg;
-	int err, total_len;
-
-	if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
-		return -EFAULT;
-	if(kern_msg.msg_iovlen > UIO_MAXIOV)
-		return -EINVAL;
-	err = verify_iovec32(&kern_msg, iov, address, VERIFY_READ);
-	if (err < 0)
-		goto out;
-	total_len = err;
-
-	if(kern_msg.msg_controllen) {
-		err = cmsghdr_from_user32_to_kern(&kern_msg, ctl, sizeof(ctl));
-		if(err)
-			goto out_freeiov;
-		ctl_buf = kern_msg.msg_control;
-	}
-	kern_msg.msg_flags = user_flags;
-
-	sock = sockfd_lookup(fd, &err);
-	if (sock != NULL) {
-		if (sock->file->f_flags & O_NONBLOCK)
-			kern_msg.msg_flags |= MSG_DONTWAIT;
-		err = sock_sendmsg(sock, &kern_msg, total_len);
-		sockfd_put(sock);
-	}
-
-	/* N.B. Use kfree here, as kern_msg.msg_controllen might change? */
-	if(ctl_buf != ctl)
-		kfree(ctl_buf);
-out_freeiov:
-	if(kern_msg.msg_iov != iov)
-		kfree(kern_msg.msg_iov);
-out:
-	return err;
-}
-
-asmlinkage long
-sys32_recvmsg(int fd, struct msghdr32 *user_msg, unsigned int user_flags)
-{
-	struct iovec iovstack[UIO_FASTIOV];
-	struct msghdr kern_msg;
-	char addr[MAX_SOCK_ADDR];
-	struct socket *sock;
-	struct iovec *iov = iovstack;
-	struct sockaddr *uaddr;
-	int *uaddr_len;
-	unsigned long cmsg_ptr;
-	int err, total_len, len = 0;
-
-	if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
-		return -EFAULT;
-	if(kern_msg.msg_iovlen > UIO_MAXIOV)
-		return -EINVAL;
-
-	uaddr = kern_msg.msg_name;
-	uaddr_len = &user_msg->msg_namelen;
-	err = verify_iovec32(&kern_msg, iov, addr, VERIFY_WRITE);
-	if (err < 0)
-		goto out;
-	total_len = err;
-
-	cmsg_ptr = (unsigned long) kern_msg.msg_control;
-	kern_msg.msg_flags = 0;
-
-	sock = sockfd_lookup(fd, &err);
-	if (sock != NULL) {
-		struct scm_cookie scm;
-
-		if (sock->file->f_flags & O_NONBLOCK)
-			user_flags |= MSG_DONTWAIT;
-		memset(&scm, 0, sizeof(scm));
-		lock_kernel();
-		err = sock->ops->recvmsg(sock, &kern_msg, total_len,
-					 user_flags, &scm);
-		if(err >= 0) {
-			len = err;
-			if(!kern_msg.msg_control) {
-				if(sock->passcred || scm.fp)
-					kern_msg.msg_flags |= MSG_CTRUNC;
-				if(scm.fp)
-					__scm_destroy(&scm);
-			} else {
-				/* If recvmsg processing itself placed some
-				 * control messages into user space, it's is
-				 * using 64-bit CMSG processing, so we need
-				 * to fix it up before we tack on more stuff.
-				 */
-				if((unsigned long) kern_msg.msg_control
-				   != cmsg_ptr)
-					cmsg32_recvmsg_fixup(&kern_msg,
-							     cmsg_ptr);
-
-				/* Wheee... */
-				if(sock->passcred)
-					put_cmsg32(&kern_msg,
-						   SOL_SOCKET, SCM_CREDENTIALS,
-						   sizeof(scm.creds),
-						   &scm.creds);
-				if(scm.fp != NULL)
-					scm_detach_fds32(&kern_msg, &scm);
-			}
-		}
-		unlock_kernel();
-		sockfd_put(sock);
-	}
-
-	if(uaddr != NULL && err >= 0)
-		err = move_addr_to_user(addr, kern_msg.msg_namelen, uaddr,
-					uaddr_len);
-	if(cmsg_ptr != 0 && err >= 0) {
-		unsigned long ucmsg_ptr = ((unsigned long)kern_msg.msg_control);
-		__kernel_size_t32 uclen = (__kernel_size_t32) (ucmsg_ptr
-							       - cmsg_ptr);
-		err |= __put_user(uclen, &user_msg->msg_controllen);
-	}
-	if(err >= 0)
-		err = __put_user(kern_msg.msg_flags, &user_msg->msg_flags);
-	if(kern_msg.msg_iov != iov)
-		kfree(kern_msg.msg_iov);
-out:
-	if(err < 0)
-		return err;
-	return len;
-}
-
-extern void check_pending(int signum);
-
-#ifdef CONFIG_MODULES
-
-extern asmlinkage unsigned long sys_create_module(const char *name_user,
-						  size_t size);
-
-asmlinkage unsigned long
-sys32_create_module(const char *name_user, __kernel_size_t32 size)
-{
-	return sys_create_module(name_user, (size_t)size);
-}
-
-extern asmlinkage long sys_init_module(const char *name_user,
-				      struct module *mod_user);
-
-/* Hey, when you're trying to init module, take time and prepare us a nice 64bit
- * module structure, even if from 32bit modutils... Why to pollute kernel... :))
- */
-asmlinkage long
-sys32_init_module(const char *name_user, struct module *mod_user)
-{
-	return sys_init_module(name_user, mod_user);
-}
-
-extern asmlinkage long sys_delete_module(const char *name_user);
-
-asmlinkage long
-sys32_delete_module(const char *name_user)
-{
-	return sys_delete_module(name_user);
-}
-
-struct module_info32 {
-	u32 addr;
-	u32 size;
-	u32 flags;
-	s32 usecount;
-};
-
-/* Query various bits about modules.  */
-
-static inline long
-get_mod_name(const char *user_name, char **buf)
-{
-	unsigned long page;
-	long retval;
-
-	if ((unsigned long)user_name >= TASK_SIZE
-	    && !segment_eq(get_fs (), KERNEL_DS))
-		return -EFAULT;
-
-	page = __get_free_page(GFP_KERNEL);
-	if (!page)
-		return -ENOMEM;
-
-	retval = strncpy_from_user((char *)page, user_name, PAGE_SIZE);
-	if (retval > 0) {
-		if (retval < PAGE_SIZE) {
-			*buf = (char *)page;
-			return retval;
-		}
-		retval = -ENAMETOOLONG;
-	} else if (!retval)
-		retval = -EINVAL;
-
-	free_page(page);
-	return retval;
-}
-
-static inline void
-put_mod_name(char *buf)
-{
-	free_page((unsigned long)buf);
-}
-
-static __inline__ struct module *
-find_module(const char *name)
-{
-	struct module *mod;
-
-	for (mod = module_list; mod ; mod = mod->next) {
-		if (mod->flags & MOD_DELETED)
-			continue;
-		if (!strcmp(mod->name, name))
-			break;
-	}
-
-	return mod;
-}
-
-static int
-qm_modules(char *buf, size_t bufsize, __kernel_size_t32 *ret)
-{
-	struct module *mod;
-	size_t nmod, space, len;
-
-	nmod = space = 0;
-
-	for (mod = module_list; mod->next != NULL; mod = mod->next, ++nmod) {
-		len = strlen(mod->name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-		if (copy_to_user(buf, mod->name, len))
-			return -EFAULT;
-		buf += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(nmod, ret))
-		return -EFAULT;
-	else
-		return 0;
-
-calc_space_needed:
-	space += len;
-	while ((mod = mod->next)->next != NULL)
-		space += strlen(mod->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static int
-qm_deps(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret)
-{
-	size_t i, space, len;
-
-	if (mod->next == NULL)
-		return -EINVAL;
-	if ((mod->flags & (MOD_RUNNING | MOD_DELETED)) != MOD_RUNNING)
-		if (put_user(0, ret))
-			return -EFAULT;
-		else
-			return 0;
-
-	space = 0;
-	for (i = 0; i < mod->ndeps; ++i) {
-		const char *dep_name = mod->deps[i].dep->name;
-
-		len = strlen(dep_name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-		if (copy_to_user(buf, dep_name, len))
-			return -EFAULT;
-		buf += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(i, ret))
-		return -EFAULT;
-	else
-		return 0;
-
-calc_space_needed:
-	space += len;
-	while (++i < mod->ndeps)
-		space += strlen(mod->deps[i].dep->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static int
-qm_refs(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret)
-{
-	size_t nrefs, space, len;
-	struct module_ref *ref;
-
-	if (mod->next == NULL)
-		return -EINVAL;
-	if ((mod->flags & (MOD_RUNNING | MOD_DELETED)) != MOD_RUNNING)
-		if (put_user(0, ret))
-			return -EFAULT;
-		else
-			return 0;
-
-	space = 0;
-	for (nrefs = 0, ref = mod->refs; ref ; ++nrefs, ref = ref->next_ref) {
-		const char *ref_name = ref->ref->name;
-
-		len = strlen(ref_name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-		if (copy_to_user(buf, ref_name, len))
-			return -EFAULT;
-		buf += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(nrefs, ret))
-		return -EFAULT;
-	else
-		return 0;
-
-calc_space_needed:
-	space += len;
-	while ((ref = ref->next_ref) != NULL)
-		space += strlen(ref->ref->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static inline int
-qm_symbols(struct module *mod, char *buf, size_t bufsize,
-	   __kernel_size_t32 *ret)
-{
-	size_t i, space, len;
-	struct module_symbol *s;
-	char *strings;
-	unsigned *vals;
-
-	if ((mod->flags & (MOD_RUNNING | MOD_DELETED)) != MOD_RUNNING)
-		if (put_user(0, ret))
-			return -EFAULT;
-		else
-			return 0;
-
-	space = mod->nsyms * 2*sizeof(u32);
-
-	i = len = 0;
-	s = mod->syms;
-
-	if (space > bufsize)
-		goto calc_space_needed;
-
-	if (!access_ok(VERIFY_WRITE, buf, space))
-		return -EFAULT;
-
-	bufsize -= space;
-	vals = (unsigned *)buf;
-	strings = buf+space;
-
-	for (; i < mod->nsyms ; ++i, ++s, vals += 2) {
-		len = strlen(s->name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-
-		if (copy_to_user(strings, s->name, len)
-		    || __put_user(s->value, vals+0)
-		    || __put_user(space, vals+1))
-			return -EFAULT;
-
-		strings += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(i, ret))
-		return -EFAULT;
-	else
-		return 0;
+	__kernel_mode_t32 dir_mode;
+};
 
-calc_space_needed:
-	for (; i < mod->nsyms; ++i, ++s)
-		space += strlen(s->name)+1;
+static void *
+do_smb_super_data_conv(void *raw_data)
+{
+	struct smb_mount_data *s = (struct smb_mount_data *)raw_data;
+	struct smb_mount_data32 *s32 = (struct smb_mount_data32 *)raw_data;
 
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
+	s->version = s32->version;
+	s->mounted_uid = s32->mounted_uid;
+	s->uid = s32->uid;
+	s->gid = s32->gid;
+	s->file_mode = s32->file_mode;
+	s->dir_mode = s32->dir_mode;
+	return raw_data;
 }
 
-static inline int
-qm_info(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret)
+static int
+copy_mount_stuff_to_kernel(const void *user, unsigned long *kernel)
 {
-	int error = 0;
-
-	if (mod->next == NULL)
-		return -EINVAL;
-
-	if (sizeof(struct module_info32) <= bufsize) {
-		struct module_info32 info;
-		info.addr = (unsigned long)mod;
-		info.size = mod->size;
-		info.flags = mod->flags;
-		info.usecount =
-			((mod_member_present(mod, can_unload)
-			  && mod->can_unload)
-			 ? -1 : atomic_read(&mod->uc.usecount));
-
-		if (copy_to_user(buf, &info, sizeof(struct module_info32)))
-			return -EFAULT;
-	} else
-		error = -ENOSPC;
+	int i;
+	unsigned long page;
+	struct vm_area_struct *vma;
 
-	if (put_user(sizeof(struct module_info32), ret))
+	*kernel = 0;
+	if(!user)
+		return 0;
+	vma = find_vma(current->mm, (unsigned long)user);
+	if(!vma || (unsigned long)user < vma->vm_start)
 		return -EFAULT;
-
-	return error;
+	if(!(vma->vm_flags & VM_READ))
+		return -EFAULT;
+	i = vma->vm_end - (unsigned long) user;
+	if(PAGE_SIZE <= (unsigned long) i)
+		i = PAGE_SIZE - 1;
+	if(!(page = __get_free_page(GFP_KERNEL)))
+		return -ENOMEM;
+	if(copy_from_user((void *) page, user, i)) {
+		free_page(page);
+		return -EFAULT;
+	}
+	*kernel = page;
+	return 0;
 }
 
+extern asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,
+				unsigned long new_flags, void *data);
+
+#define SMBFS_NAME	"smbfs"
+#define NCPFS_NAME	"ncpfs"
+
 asmlinkage long
-sys32_query_module(char *name_user, int which, char *buf,
-		   __kernel_size_t32 bufsize, u32 ret)
+sys32_mount(char *dev_name, char *dir_name, char *type,
+	    unsigned long new_flags, u32 data)
 {
-	struct module *mod;
-	int err;
+	unsigned long type_page;
+	int err, is_smb, is_ncp;
 
-	lock_kernel();
-	if (name_user == 0) {
-		/* This finds "kernel_module" which is not exported. */
-		for(mod = module_list; mod->next != NULL; mod = mod->next)
-			;
+	if(!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+	is_smb = is_ncp = 0;
+	err = copy_mount_stuff_to_kernel((const void *)type, &type_page);
+	if(err)
+		return err;
+	if(type_page) {
+		is_smb = !strcmp((char *)type_page, SMBFS_NAME);
+		is_ncp = !strcmp((char *)type_page, NCPFS_NAME);
+	}
+	if(!is_smb && !is_ncp) {
+		if(type_page)
+			free_page(type_page);
+		return sys_mount(dev_name, dir_name, type, new_flags,
+				 (void *)AA(data));
 	} else {
-		long namelen;
-		char *name;
+		unsigned long dev_page, dir_page, data_page;
 
-		if ((namelen = get_mod_name(name_user, &name)) < 0) {
-			err = namelen;
-			goto out;
-		}
-		err = -ENOENT;
-		if (namelen == 0) {
-			/* This finds "kernel_module" which is not exported. */
-			for(mod = module_list;
-			    mod->next != NULL;
-			    mod = mod->next) ;
-		} else if ((mod = find_module(name)) == NULL) {
-			put_mod_name(name);
+		err = copy_mount_stuff_to_kernel((const void *)dev_name,
+						 &dev_page);
+		if(err)
 			goto out;
-		}
-		put_mod_name(name);
-	}
-
-	switch (which)
-	{
-	case 0:
-		err = 0;
-		break;
-	case QM_MODULES:
-		err = qm_modules(buf, bufsize, (__kernel_size_t32 *)AA(ret));
-		break;
-	case QM_DEPS:
-		err = qm_deps(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret));
-		break;
-	case QM_REFS:
-		err = qm_refs(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret));
-		break;
-	case QM_SYMBOLS:
-		err = qm_symbols(mod, buf, bufsize,
-				 (__kernel_size_t32 *)AA(ret));
-		break;
-	case QM_INFO:
-		err = qm_info(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret));
-		break;
-	default:
-		err = -EINVAL;
-		break;
+		err = copy_mount_stuff_to_kernel((const void *)dir_name,
+						 &dir_page);
+		if(err)
+			goto dev_out;
+		err = copy_mount_stuff_to_kernel((const void *)AA(data),
+						 &data_page);
+		if(err)
+			goto dir_out;
+		if(is_ncp)
+			do_ncp_super_data_conv((void *)data_page);
+		else if(is_smb)
+			do_smb_super_data_conv((void *)data_page);
+		else
+			panic("The problem is here...");
+		err = do_mount((char *)dev_page, (char *)dir_page,
+				(char *)type_page, new_flags,
+				(void *)data_page);
+		if(data_page)
+			free_page(data_page);
+	dir_out:
+		if(dir_page)
+			free_page(dir_page);
+	dev_out:
+		if(dev_page)
+			free_page(dev_page);
+	out:
+		if(type_page)
+			free_page(type_page);
+		return err;
 	}
-out:
-	unlock_kernel();
-	return err;
 }
 
-struct kernel_sym32 {
-	u32 value;
-	char name[60];
-};
-
-extern asmlinkage long sys_get_kernel_syms(struct kernel_sym *table);
+extern asmlinkage long sys_setreuid(uid_t ruid, uid_t euid);
 
-asmlinkage long
-sys32_get_kernel_syms(struct kernel_sym32 *table)
+asmlinkage long sys32_setreuid(__kernel_uid_t32 ruid, __kernel_uid_t32 euid)
 {
-	int len, i;
-	struct kernel_sym *tbl;
-	mm_segment_t old_fs;
+	uid_t sruid, seuid;
 
-	len = sys_get_kernel_syms(NULL);
-	if (!table) return len;
-	tbl = kmalloc (len * sizeof (struct kernel_sym), GFP_KERNEL);
-	if (!tbl) return -ENOMEM;
-	old_fs = get_fs();
-	set_fs (KERNEL_DS);
-	sys_get_kernel_syms(tbl);
-	set_fs (old_fs);
-	for (i = 0; i < len; i++, table += sizeof (struct kernel_sym32)) {
-		if (put_user (tbl[i].value, &table->value) ||
-		    copy_to_user (table->name, tbl[i].name, 60))
-			break;
-	}
-	kfree (tbl);
-	return i;
+	sruid = (ruid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)ruid);
+	seuid = (euid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)euid);
+	return sys_setreuid(sruid, seuid);
 }
 
-#else /* CONFIG_MODULES */
-
-asmlinkage unsigned long
-sys32_create_module(const char *name_user, size_t size)
-{
-	return -ENOSYS;
-}
+extern asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid);
 
 asmlinkage long
-sys32_init_module(const char *name_user, struct module *mod_user)
+sys32_setresuid(__kernel_uid_t32 ruid, __kernel_uid_t32 euid,
+		__kernel_uid_t32 suid)
 {
-	return -ENOSYS;
-}
+	uid_t sruid, seuid, ssuid;
 
-asmlinkage long
-sys32_delete_module(const char *name_user)
-{
-	return -ENOSYS;
+	sruid = (ruid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)ruid);
+	seuid = (euid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)euid);
+	ssuid = (suid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)suid);
+	return sys_setresuid(sruid, seuid, ssuid);
 }
 
+extern asmlinkage long sys_setregid(gid_t rgid, gid_t egid);
+
 asmlinkage long
-sys32_query_module(const char *name_user, int which, char *buf, size_t bufsize,
-		 size_t *ret)
+sys32_setregid(__kernel_gid_t32 rgid, __kernel_gid_t32 egid)
 {
-	/* Let the program know about the new interface.  Not that
-	   it'll do them much good.  */
-	if (which == 0)
-		return 0;
+	gid_t srgid, segid;
 
-	return -ENOSYS;
+	srgid = (rgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)rgid);
+	segid = (egid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)egid);
+	return sys_setregid(srgid, segid);
 }
 
+extern asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid);
+
 asmlinkage long
-sys32_get_kernel_syms(struct kernel_sym *table)
+sys32_setresgid(__kernel_gid_t32 rgid, __kernel_gid_t32 egid,
+		__kernel_gid_t32 sgid)
 {
-	return -ENOSYS;
-}
+	gid_t srgid, segid, ssgid;
 
-#endif  /* CONFIG_MODULES */
+	srgid = (rgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)rgid);
+	segid = (egid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)egid);
+	ssgid = (sgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)sgid);
+	return sys_setresgid(srgid, segid, ssgid);
+}
 
 /* Stuff for NFS server syscalls... */
 struct nfsctl_svc32 {
@@ -4820,154 +4293,6 @@
 	return err;
 }
 
-asmlinkage long sys_utimes(char *, struct timeval *);
-
-asmlinkage long
-sys32_utimes(char *filename, struct timeval32 *tvs)
-{
-	char *kfilename;
-	struct timeval ktvs[2];
-	mm_segment_t old_fs;
-	int ret;
-
-	kfilename = getname32(filename);
-	ret = PTR_ERR(kfilename);
-	if (!IS_ERR(kfilename)) {
-		if (tvs) {
-			if (get_tv32(&ktvs[0], tvs) ||
-			    get_tv32(&ktvs[1], 1+tvs))
-				return -EFAULT;
-		}
-
-		old_fs = get_fs();
-		set_fs(KERNEL_DS);
-		ret = sys_utimes(kfilename, &ktvs[0]);
-		set_fs(old_fs);
-
-		putname(kfilename);
-	}
-	return ret;
-}
-
-/* These are here just in case some old ia32 binary calls it. */
-asmlinkage long
-sys32_pause(void)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule();
-	return -ERESTARTNOHAND;
-}
-
-/* PCI config space poking. */
-extern asmlinkage long sys_pciconfig_read(unsigned long bus,
-					 unsigned long dfn,
-					 unsigned long off,
-					 unsigned long len,
-					 unsigned char *buf);
-
-extern asmlinkage long sys_pciconfig_write(unsigned long bus,
-					  unsigned long dfn,
-					  unsigned long off,
-					  unsigned long len,
-					  unsigned char *buf);
-
-asmlinkage long
-sys32_pciconfig_read(u32 bus, u32 dfn, u32 off, u32 len, u32 ubuf)
-{
-	return sys_pciconfig_read((unsigned long) bus,
-				  (unsigned long) dfn,
-				  (unsigned long) off,
-				  (unsigned long) len,
-				  (unsigned char *)AA(ubuf));
-}
-
-asmlinkage long
-sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubuf)
-{
-	return sys_pciconfig_write((unsigned long) bus,
-				   (unsigned long) dfn,
-				   (unsigned long) off,
-				   (unsigned long) len,
-				   (unsigned char *)AA(ubuf));
-}
-
-extern asmlinkage long sys_prctl(int option, unsigned long arg2,
-				unsigned long arg3, unsigned long arg4,
-				unsigned long arg5);
-
-asmlinkage long
-sys32_prctl(int option, u32 arg2, u32 arg3, u32 arg4, u32 arg5)
-{
-	return sys_prctl(option,
-			 (unsigned long) arg2,
-			 (unsigned long) arg3,
-			 (unsigned long) arg4,
-			 (unsigned long) arg5);
-}
-
-
-extern asmlinkage ssize_t sys_pread(unsigned int fd, char * buf,
-				    size_t count, loff_t pos);
-
-extern asmlinkage ssize_t sys_pwrite(unsigned int fd, const char * buf,
-				     size_t count, loff_t pos);
-
-typedef __kernel_ssize_t32 ssize_t32;
-
-asmlinkage ssize_t32
-sys32_pread(unsigned int fd, char *ubuf, __kernel_size_t32 count,
-	    u32 poshi, u32 poslo)
-{
-	return sys_pread(fd, ubuf, count,
-			 ((loff_t)AA(poshi) << 32) | AA(poslo));
-}
-
-asmlinkage ssize_t32
-sys32_pwrite(unsigned int fd, char *ubuf, __kernel_size_t32 count,
-	     u32 poshi, u32 poslo)
-{
-	return sys_pwrite(fd, ubuf, count,
-			  ((loff_t)AA(poshi) << 32) | AA(poslo));
-}
-
-
-extern asmlinkage long sys_personality(unsigned long);
-
-asmlinkage long
-sys32_personality(unsigned long personality)
-{
-	int ret;
-	if (current->personality == PER_LINUX32 && personality == PER_LINUX)
-		personality = PER_LINUX32;
-	ret = sys_personality(personality);
-	if (ret == PER_LINUX32)
-		ret = PER_LINUX;
-	return ret;
-}
-
-extern asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t *offset,
-				       size_t count);
-
-asmlinkage long
-sys32_sendfile(int out_fd, int in_fd, __kernel_off_t32 *offset, s32 count)
-{
-	mm_segment_t old_fs = get_fs();
-	int ret;
-	off_t of;
-
-	if (offset && get_user(of, offset))
-		return -EFAULT;
-
-	set_fs(KERNEL_DS);
-	ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
-	set_fs(old_fs);
-
-	if (!ret && offset && put_user(of, offset))
-		return -EFAULT;
-
-	return ret;
-}
-
 /* Handle adjtimex compatability. */
 
 struct timex32 {
@@ -5041,4 +4366,4 @@
 
 	return ret;
 }
-#endif	// NOTYET
+#endif /* NOTYET */
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/Makefile linux/arch/ia64/kernel/Makefile
--- v2.4.14/linux/arch/ia64/kernel/Makefile	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/Makefile	Fri Nov  9 14:26:17 2001
@@ -16,7 +16,7 @@
 obj-y := acpi.o entry.o gate.o efi.o efi_stub.o ia64_ksyms.o irq.o irq_ia64.o irq_lsapic.o ivt.o \
 	 machvec.o pal.o process.o perfmon.o ptrace.o sal.o semaphore.o setup.o	\
 	 signal.o sys_ia64.o traps.o time.o unaligned.o unwind.o
-obj-$(CONFIG_IA64_GENERIC) += machvec.o iosapic.o
+obj-$(CONFIG_IA64_GENERIC) += iosapic.o
 obj-$(CONFIG_IA64_DIG) += iosapic.o
 obj-$(CONFIG_IA64_PALINFO) += palinfo.o
 obj-$(CONFIG_EFI_VARS) += efivars.o
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/acpi.c linux/arch/ia64/kernel/acpi.c
--- v2.4.14/linux/arch/ia64/kernel/acpi.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/acpi.c	Fri Nov  9 14:26:17 2001
@@ -9,7 +9,7 @@
  * Copyright (C) 2000 Hewlett-Packard Co.
  * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com>
  * Copyright (C) 2000 Intel Corp.
- * Copyright (C) 2000 J.I. Lee <jung-ik.lee@intel.com>
+ * Copyright (C) 2000,2001 J.I. Lee <jung-ik.lee@intel.com>
  *      ACPI based kernel configuration manager.
  *      ACPI 2.0 & IA64 ext 0.71
  */
@@ -23,6 +23,9 @@
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/irq.h>
+#ifdef CONFIG_SERIAL_ACPI
+#include <linux/acpi_serial.h>
+#endif
 
 #include <asm/acpi-ext.h>
 #include <asm/acpikcfg.h>
@@ -34,6 +37,9 @@
 
 #undef ACPI_DEBUG		/* Guess what this does? */
 
+/* global array to record platform interrupt vectors for generic int routing */
+int platform_irq_list[ACPI_MAX_PLATFORM_IRQS];
+
 /* These are ugly but will be reclaimed by the kernel */
 int __initdata available_cpus;
 int __initdata total_cpus;
@@ -41,8 +47,11 @@
 void (*pm_idle) (void);
 void (*pm_power_off) (void);
 
+asm (".weak iosapic_register_irq");
 asm (".weak iosapic_register_legacy_irq");
+asm (".weak iosapic_register_platform_irq");
 asm (".weak iosapic_init");
+asm (".weak iosapic_version");
 
 const char *
 acpi_get_sysname (void)
@@ -55,6 +64,8 @@
 	return "hpsim";
 # elif defined (CONFIG_IA64_SGI_SN1)
 	return "sn1";
+# elif defined (CONFIG_IA64_SGI_SN2)
+	return "sn2";
 # elif defined (CONFIG_IA64_DIG)
 	return "dig";
 # else
@@ -65,6 +76,25 @@
 }
 
 /*
+ * Interrupt routing API for device drivers.
+ * Provides the interrupt vector for a generic platform event
+ * (currently only CPEI implemented)
+ */
+int
+acpi_request_vector(u32 int_type)
+{
+	int vector = -1;
+
+	if (int_type < ACPI_MAX_PLATFORM_IRQS) {
+		/* correctable platform error interrupt */
+		vector = platform_irq_list[int_type];
+	} else
+		printk("acpi_request_vector(): invalid interrupt type\n");
+
+	return vector;
+}
+
+/*
  * Configure legacy IRQ information.
  */
 static void __init
@@ -139,15 +169,93 @@
 }
 
 /*
- * Info on platform interrupt sources: NMI. PMI, INIT, etc.
+ * Extract iosapic info from madt (again) to determine which iosapic
+ * this platform interrupt resides in
+ */
+static int __init
+acpi20_which_iosapic (int global_vector, acpi_madt_t *madt, u32 *irq_base, char **iosapic_address)
+{
+	acpi_entry_iosapic_t *iosapic;
+	char *p, *end;
+	int ver, max_pin;
+
+	p = (char *) (madt + 1);
+	end = p + (madt->header.length - sizeof(acpi_madt_t));
+
+	while (p < end) {
+		switch (*p) {
+		      case ACPI20_ENTRY_IO_SAPIC:
+			/* collect IOSAPIC info for platform int use later */
+			iosapic = (acpi_entry_iosapic_t *)p;
+			*irq_base = iosapic->irq_base;
+			*iosapic_address = ioremap(iosapic->address, 0);
+			/* is this the iosapic we're looking for? */
+			ver = iosapic_version(*iosapic_address);
+			max_pin = (ver >> 16) & 0xff;
+			if ((global_vector - *irq_base) <= max_pin)
+				return 0;		/* found it! */
+			break;
+		      default:
+			break;
+		}
+		p += p[1];
+	}
+	return 1;
+}
+
+/*
+ * Info on platform interrupt sources: NMI, PMI, INIT, etc.
  */
 static void __init
-acpi20_platform (char *p)
+acpi20_platform (char *p, acpi_madt_t *madt)
 {
+	int vector;
+	u32 irq_base;
+	char *iosapic_address;
+	unsigned long polarity = 0, trigger = 0;
 	acpi20_entry_platform_src_t *plat = (acpi20_entry_platform_src_t *) p;
 
 	printk("PLATFORM: IOSAPIC %x -> Vector %x on CPU %.04u:%.04u\n",
 	       plat->iosapic_vector, plat->global_vector, plat->eid, plat->id);
+
+	/* record platform interrupt vectors for generic int routing code */
+
+	if (!iosapic_register_platform_irq) {
+		printk("acpi20_platform(): no ACPI platform IRQ support\n");
+		return;
+	}
+
+	/* extract polarity and trigger info from flags */
+	switch (plat->flags) {
+	      case 0x5: polarity = 1; trigger = 1; break;
+	      case 0x7: polarity = 0; trigger = 1; break;
+	      case 0xd: polarity = 1; trigger = 0; break;
+	      case 0xf: polarity = 0; trigger = 0; break;
+	      default:
+		printk("acpi20_platform(): unknown flags 0x%x\n", plat->flags);
+		break;
+	}
+
+	/* which iosapic does this IRQ belong to? */
+	if (acpi20_which_iosapic(plat->global_vector, madt, &irq_base, &iosapic_address)) {
+		printk("acpi20_platform(): I/O SAPIC not found!\n");
+		return;
+	}
+
+	/*
+	 * get vector assignment for this IRQ, set attributes, and program the IOSAPIC
+	 * routing table
+	 */
+	vector = iosapic_register_platform_irq(plat->int_type,
+					       plat->global_vector,
+					       plat->iosapic_vector,
+					       plat->eid,
+					       plat->id,
+					       polarity,
+					       trigger,
+					       irq_base,
+					       iosapic_address);
+	platform_irq_list[plat->int_type] = vector;
 }
 
 /*
@@ -173,8 +281,10 @@
 static void __init
 acpi20_parse_madt (acpi_madt_t *madt)
 {
-	acpi_entry_iosapic_t *iosapic;
+	acpi_entry_iosapic_t *iosapic = NULL;
+	acpi20_entry_lsapic_t *lsapic = NULL;
 	char *p, *end;
+	int i;
 
 	/* Base address of IPI Message Block */
 	if (madt->lapic_address) {
@@ -186,23 +296,27 @@
 	p = (char *) (madt + 1);
 	end = p + (madt->header.length - sizeof(acpi_madt_t));
 
+	/* Initialize platform interrupt vector array */
+	for (i = 0; i < ACPI_MAX_PLATFORM_IRQS; i++)
+		platform_irq_list[i] = -1;
+
 	/*
-	 * Splitted entry parsing to ensure ordering.
+	 * Split-up entry parsing to ensure ordering.
 	 */
-
 	while (p < end) {
 		switch (*p) {
-		case ACPI20_ENTRY_LOCAL_APIC_ADDR_OVERRIDE:
+		      case ACPI20_ENTRY_LOCAL_APIC_ADDR_OVERRIDE:
 			printk("ACPI 2.0 MADT: LOCAL APIC Override\n");
 			acpi20_lapic_addr_override(p);
 			break;
 
-		case ACPI20_ENTRY_LOCAL_SAPIC:
+		      case ACPI20_ENTRY_LOCAL_SAPIC:
 			printk("ACPI 2.0 MADT: LOCAL SAPIC\n");
+			lsapic = (acpi20_entry_lsapic_t *) p;
 			acpi20_lsapic(p);
 			break;
 
-		case ACPI20_ENTRY_IO_SAPIC:
+		      case ACPI20_ENTRY_IO_SAPIC:
 			iosapic = (acpi_entry_iosapic_t *) p;
 			if (iosapic_init)
 				/*
@@ -218,26 +332,25 @@
 					);
 			break;
 
-		case ACPI20_ENTRY_PLATFORM_INT_SOURCE:
+		      case ACPI20_ENTRY_PLATFORM_INT_SOURCE:
 			printk("ACPI 2.0 MADT: PLATFORM INT SOURCE\n");
-			acpi20_platform(p);
+			acpi20_platform(p, madt);
 			break;
 
-		case ACPI20_ENTRY_LOCAL_APIC:
+		      case ACPI20_ENTRY_LOCAL_APIC:
 			printk("ACPI 2.0 MADT: LOCAL APIC entry\n"); break;
-		case ACPI20_ENTRY_IO_APIC:
+		      case ACPI20_ENTRY_IO_APIC:
 			printk("ACPI 2.0 MADT: IO APIC entry\n"); break;
-		case ACPI20_ENTRY_NMI_SOURCE:
+		      case ACPI20_ENTRY_NMI_SOURCE:
 			printk("ACPI 2.0 MADT: NMI SOURCE entry\n"); break;
-		case ACPI20_ENTRY_LOCAL_APIC_NMI:
+		      case ACPI20_ENTRY_LOCAL_APIC_NMI:
 			printk("ACPI 2.0 MADT: LOCAL APIC NMI entry\n"); break;
-		case ACPI20_ENTRY_INT_SRC_OVERRIDE:
+		      case ACPI20_ENTRY_INT_SRC_OVERRIDE:
 			break;
-		default:
+		      default:
 			printk("ACPI 2.0 MADT: unknown entry skip\n"); break;
 			break;
 		}
-
 		p += p[1];
 	}
 
@@ -245,16 +358,35 @@
 	end = p + (madt->header.length - sizeof(acpi_madt_t));
 
 	while (p < end) {
+		switch (*p) {
+		      case ACPI20_ENTRY_LOCAL_APIC:
+			if (lsapic) break;
+			printk("ACPI 2.0 MADT: LOCAL APIC entry\n");
+			/* parse local apic if there's no local Sapic */
+			break;
+		      case ACPI20_ENTRY_IO_APIC:
+			if (iosapic) break;
+			printk("ACPI 2.0 MADT: IO APIC entry\n");
+			/* parse ioapic if there's no ioSapic */
+			break;
+		      default:
+			break;
+		}
+		p += p[1];
+	}
 
+	p = (char *) (madt + 1);
+	end = p + (madt->header.length - sizeof(acpi_madt_t));
+
+	while (p < end) {
 		switch (*p) {
-		case ACPI20_ENTRY_INT_SRC_OVERRIDE:
+		      case ACPI20_ENTRY_INT_SRC_OVERRIDE:
 			printk("ACPI 2.0 MADT: INT SOURCE Override\n");
 			acpi_legacy_irq(p);
 			break;
-		default:
+		      default:
 			break;
 		}
-
 		p += p[1];
 	}
 
@@ -269,6 +401,7 @@
 # ifdef CONFIG_ACPI
 	acpi_xsdt_t *xsdt;
 	acpi_desc_table_hdr_t *hdrp;
+	acpi_madt_t *madt;
 	int tables, i;
 
 	if (strncmp(rsdp20->signature, ACPI_RSDP_SIG, ACPI_RSDP_SIG_LEN)) {
@@ -310,9 +443,76 @@
 			ACPI_MADT_SIG, ACPI_MADT_SIG_LEN) != 0)
 			continue;
 
-		acpi20_parse_madt((acpi_madt_t *) hdrp);
+		/* Save MADT pointer for later */
+		madt = (acpi_madt_t *) hdrp;
+		acpi20_parse_madt(madt);
 	}
 
+#ifdef CONFIG_SERIAL_ACPI
+	/*
+	 * Now we're interested in other tables.  We want the iosapics already
+	 * initialized, so we do it in a separate loop.
+	 */
+	for (i = 0; i < tables; i++) {
+		hdrp = (acpi_desc_table_hdr_t *) __va(readl_unaligned(&xsdt->entry_ptrs[i]));
+		/*
+		 * search for SPCR and DBGP table entries so we can enable
+		 * non-pci interrupts to IO-SAPICs.
+		 */
+		if (!strncmp(hdrp->signature, ACPI_SPCRT_SIG, ACPI_SPCRT_SIG_LEN) ||
+		    !strncmp(hdrp->signature, ACPI_DBGPT_SIG, ACPI_DBGPT_SIG_LEN))
+		{
+			acpi_ser_t *spcr = (void *)hdrp;
+			unsigned long global_int;
+
+			setup_serial_acpi(hdrp);
+
+			/*
+			 * ACPI is able to describe serial ports that live at non-standard
+			 * memory space addresses and use SAPIC interrupts.  If not also
+			 * PCI devices, there would be no interrupt vector information for
+			 * them.  This checks for and fixes that situation.
+			 */
+			if (spcr->length < sizeof(acpi_ser_t))
+				/* table is not long enough for full info, thus no int */
+				break;
+
+			/*
+			 * If the device is not in PCI space, but uses a SAPIC interrupt,
+			 * we need to program the SAPIC so that serial can autoprobe for
+			 * the IA64 interrupt vector later on.  If the device is in PCI
+			 * space, it should already be setup via the PCI vectors
+			 */
+			if (spcr->base_addr.space_id != ACPI_SERIAL_PCICONF_SPACE &&
+			    spcr->int_type == ACPI_SERIAL_INT_SAPIC)
+			{
+				u32 irq_base;
+				char *iosapic_address;
+				int vector;
+
+				/* We have a UART in memory space with a SAPIC interrupt */
+				global_int = (  (spcr->global_int[3] << 24)
+					      | (spcr->global_int[2] << 16)
+					      | (spcr->global_int[1] << 8)
+					      | spcr->global_int[0]);
+
+				if (!iosapic_register_irq)
+					continue;
+
+				/* which iosapic does this IRQ belong to? */
+				if (acpi20_which_iosapic(global_int, madt, &irq_base,
+							 &iosapic_address) == 0)
+				{
+					vector = iosapic_register_irq(global_int,
+					                              1, /* active high polarity */
+					                              1, /* edge triggered */
+					                              irq_base,
+					                              iosapic_address);
+				}
+			}
+		}
+	}
+#endif
 	acpi_cf_terminate();
 
 #  ifdef CONFIG_SMP
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/efi.c linux/arch/ia64/kernel/efi.c
--- v2.4.14/linux/arch/ia64/kernel/efi.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/efi.c	Fri Nov  9 14:26:17 2001
@@ -6,8 +6,8 @@
  * Copyright (C) 1999 VA Linux Systems
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  * Copyright (C) 1999-2001 Hewlett-Packard Co.
- * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999-2001 Stephane Eranian <eranian@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
  *
  * All EFI Runtime Services are not implemented yet as EFI only
  * supports physical mode addressing on SoftSDV. This is to be fixed
@@ -234,7 +234,7 @@
 		 * The only ITLB entry in region 7 that is used is the one installed by
 		 * __start().  That entry covers a 64MB range.
 		 */
-		mask  = ~((1 << KERNEL_PG_SHIFT) - 1);
+		mask  = ~((1 << KERNEL_TR_PAGE_SHIFT) - 1);
 		vaddr = PAGE_OFFSET + md->phys_addr;
 
 		/*
@@ -242,29 +242,32 @@
 		 * mapping.
 		 *
 		 * PAL code is guaranteed to be aligned on a power of 2 between 4k and
-		 * 256KB.  Also from the documentation, it seems like there is an implicit
-		 * guarantee that you will need only ONE ITR to map it. This implies that
-		 * the PAL code is always aligned on its size, i.e., the closest matching
-		 * page size supported by the TLB. Therefore PAL code is guaranteed never
-		 * to cross a 64MB unless it is bigger than 64MB (very unlikely!).  So for
+		 * 256KB and that only one ITR is needed to map it. This implies that the
+		 * PAL code is always aligned on its size, i.e., the closest matching page
+		 * size supported by the TLB. Therefore PAL code is guaranteed never to
+		 * cross a 64MB unless it is bigger than 64MB (very unlikely!).  So for
 		 * now the following test is enough to determine whether or not we need a
 		 * dedicated ITR for the PAL code.
 		 */
 		if ((vaddr & mask) == (KERNEL_START & mask)) {
-			printk(__FUNCTION__ " : no need to install ITR for PAL code\n");
+			printk(__FUNCTION__ ": no need to install ITR for PAL code\n");
 			continue;
 		}
 
+		if (md->num_pages << 12 > IA64_GRANULE_SIZE)
+			panic("Woah!  PAL code size bigger than a granule!");
+
+		mask  = ~((1 << IA64_GRANULE_SHIFT) - 1);
 		printk("CPU %d: mapping PAL code [0x%lx-0x%lx) into [0x%lx-0x%lx)\n",
 		       smp_processor_id(), md->phys_addr, md->phys_addr + (md->num_pages << 12),
-		       vaddr & mask, (vaddr & mask) + KERNEL_PG_SIZE);
+		       vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE);
 
 		/*
 		 * Cannot write to CRx with PSR.ic=1
 		 */
 		ia64_clear_ic(flags);
 		ia64_itr(0x1, IA64_TR_PALCODE, vaddr & mask,
-			 pte_val(mk_pte_phys(md->phys_addr, PAGE_KERNEL)), KERNEL_PG_SHIFT);
+			 pte_val(mk_pte_phys(md->phys_addr, PAGE_KERNEL)), IA64_GRANULE_SHIFT);
 		local_irq_restore(flags);
 		ia64_srlz_i();
 	}
@@ -482,5 +485,7 @@
 static void __exit
 efivars_exit(void)
 {
+#ifdef CONFIG_PROC_FS
  	remove_proc_entry(efi_dir->name, NULL);
+#endif
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/efi_stub.S linux/arch/ia64/kernel/efi_stub.S
--- v2.4.14/linux/arch/ia64/kernel/efi_stub.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/kernel/efi_stub.S	Fri Nov  9 14:26:17 2001
@@ -1,8 +1,8 @@
 /*
  * EFI call stub.
  *
- * Copyright (C) 1999-2000 Hewlett-Packard Co
- * Copyright (C) 1999-2000 David Mosberger <davidm@hpl.hp.com>
+ * Copyright (C) 1999-2001 Hewlett-Packard Co
+ *	David Mosberger <davidm@hpl.hp.com>
  *
  * This stub allows us to make EFI calls in physical mode with interrupts
  * turned off.  We need this because we can't call SetVirtualMap() until
@@ -68,17 +68,17 @@
 	;;
 	andcm r16=loc3,r16		// get psr with IT, DT, and RT bits cleared
 	mov out3=in4
-	br.call.sptk.few rp=ia64_switch_mode
+	br.call.sptk.many rp=ia64_switch_mode
 .ret0:	mov out4=in5
 	mov out5=in6
 	mov out6=in7
-	br.call.sptk.few rp=b6		// call the EFI function
+	br.call.sptk.many rp=b6		// call the EFI function
 .ret1:	mov ar.rsc=0			// put RSE in enforced lazy, LE mode
 	mov r16=loc3
-	br.call.sptk.few rp=ia64_switch_mode // return to virtual mode
+	br.call.sptk.many rp=ia64_switch_mode // return to virtual mode
 .ret2:	mov ar.rsc=loc4			// restore RSE configuration
 	mov ar.pfs=loc1
 	mov rp=loc0
 	mov gp=loc2
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(efi_call_phys)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/efivars.c linux/arch/ia64/kernel/efivars.c
--- v2.4.14/linux/arch/ia64/kernel/efivars.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/efivars.c	Fri Nov  9 14:26:17 2001
@@ -65,6 +65,7 @@
 
 MODULE_AUTHOR("Matt Domsch <Matt_Domsch@Dell.com>");
 MODULE_DESCRIPTION("/proc interface to EFI Variables");
+MODULE_LICENSE("GPL");
 
 #define EFIVARS_VERSION "0.03 2001-Apr-20"
 
@@ -276,21 +277,20 @@
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
 
-	spin_lock(&efivars_lock);
 	MOD_INC_USE_COUNT;
 
 	var_data = kmalloc(size, GFP_KERNEL);
 	if (!var_data) {
 		MOD_DEC_USE_COUNT;
-		spin_unlock(&efivars_lock);
 		return -ENOMEM;
 	}
 	if (copy_from_user(var_data, buffer, size)) {
 		MOD_DEC_USE_COUNT;
-		spin_unlock(&efivars_lock);
+                kfree(var_data);
 		return -EFAULT;
 	}
 
+	spin_lock(&efivars_lock);
 
 	/* Since the data ptr we've currently got is probably for
 	   a different variable find the right variable.
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/entry.S linux/arch/ia64/kernel/entry.S
--- v2.4.14/linux/arch/ia64/kernel/entry.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/entry.S	Fri Nov  9 14:26:17 2001
@@ -4,7 +4,7 @@
  * Kernel entry points.
  *
  * Copyright (C) 1998-2001 Hewlett-Packard Co
- * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  * Copyright (C) 1999 VA Linux Systems
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  * Copyright (C) 1999 Asit Mallick <Asit.K.Mallick@intel.com>
@@ -15,7 +15,7 @@
  * kernel stack. This allows us to handle interrupts without changing
  * to physical mode.
  *
- * Jonathan Nickin	<nicklin@missioncriticallinux.com>
+ * Jonathan Nicklin	<nicklin@missioncriticallinux.com>
  * Patrick O'Rourke	<orourke@missioncriticallinux.com>
  * 11/07/2000
  /
@@ -55,7 +55,7 @@
 	mov out1=in1			// argv
 	mov out2=in2			// envp
 	add out3=16,sp			// regs
-	br.call.sptk.few rp=sys_execve
+	br.call.sptk.many rp=sys_execve
 .ret0:	cmp4.ge p6,p7=r8,r0
 	mov ar.pfs=loc1			// restore ar.pfs
 	sxt4 r8=r8			// return 64-bit result
@@ -64,7 +64,7 @@
 (p6)	cmp.ne pKern,pUser=r0,r0	// a successful execve() lands us in user-mode...
 	mov rp=loc0
 (p6)	mov ar.pfs=r0			// clear ar.pfs on success
-(p7)	br.ret.sptk.few rp
+(p7)	br.ret.sptk.many rp
 
 	/*
 	 * In theory, we'd have to zap this state only to prevent leaking of
@@ -85,7 +85,7 @@
 	ldf.fill f26=[sp];	ldf.fill f27=[sp];	mov f28=f0
 	ldf.fill f29=[sp];	ldf.fill f30=[sp];	mov f31=f0
 	mov ar.lc=0
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(ia64_execve)
 
 GLOBAL_ENTRY(sys_clone2)
@@ -99,7 +99,7 @@
 	mov out3=in2
 	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
 	mov out0=in0				// out0 = clone_flags
-	br.call.sptk.few rp=do_fork
+	br.call.sptk.many rp=do_fork
 .ret1:	.restore sp
 	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
 	mov ar.pfs=loc1
@@ -118,7 +118,7 @@
 	mov out3=0
 	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
 	mov out0=in0				// out0 = clone_flags
-	br.call.sptk.few rp=do_fork
+	br.call.sptk.many rp=do_fork
 .ret2:	.restore sp
 	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
 	mov ar.pfs=loc1
@@ -140,23 +140,23 @@
 	dep r20=0,in0,61,3		// physical address of "current"
 	;;
 	st8 [r22]=sp			// save kernel stack pointer of old task
-	shr.u r26=r20,KERNEL_PG_SHIFT
-	mov r16=KERNEL_PG_NUM
+	shr.u r26=r20,IA64_GRANULE_SHIFT
+	shr.u r17=r20,KERNEL_TR_PAGE_SHIFT
 	;;
-	cmp.ne p6,p7=r26,r16		// check >= 64M && < 128M
+	cmp.ne p6,p7=KERNEL_TR_PAGE_NUM,r17
 	adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
 	;;
 	/*
-	 * If we've already mapped this task's page, we can skip doing it
-	 * again.
+	 * If we've already mapped this task's page, we can skip doing it again.
 	 */
 (p6)	cmp.eq p7,p6=r26,r27
-(p6)	br.cond.dpnt.few .map
+(p6)	br.cond.dpnt .map
 	;;
-.done:	ld8 sp=[r21]			// load kernel stack pointer of new task
+.done:
 (p6)	ssm psr.ic			// if we we had to map, renable the psr.ic bit FIRST!!!
 	;;
 (p6)	srlz.d
+	ld8 sp=[r21]			// load kernel stack pointer of new task
 	mov IA64_KR(CURRENT)=r20	// update "current" application register
 	mov r8=r13			// return pointer to previously running task
 	mov r13=in0			// set "current" pointer
@@ -167,7 +167,7 @@
 #ifdef CONFIG_SMP
 	sync.i				// ensure "fc"s done by this CPU are visible on other CPUs
 #endif
-	br.ret.sptk.few rp		// boogie on out in new context
+	br.ret.sptk.many rp		// boogie on out in new context
 
 .map:
 	rsm psr.i | psr.ic
@@ -175,7 +175,7 @@
 	;;
 	srlz.d
 	or r23=r25,r20			// construct PA | page properties
-	mov r25=KERNEL_PG_SHIFT<<2
+	mov r25=IA64_GRANULE_SHIFT<<2
 	;;
 	mov cr.itir=r25
 	mov cr.ifa=in0			// VA of next task...
@@ -184,7 +184,7 @@
 	mov IA64_KR(CURRENT_STACK)=r26	// remember last page we mapped...
 	;;
 	itr.d dtr[r25]=r23		// wire in new mapping...
-	br.cond.sptk.many .done
+	br.cond.sptk .done
 END(ia64_switch_to)
 
 /*
@@ -212,24 +212,18 @@
 	.save @priunat,r17
 	mov r17=ar.unat		// preserve caller's
 	.body
-#if !(defined(CONFIG_ITANIUM_B0_SPECIFIC) || defined(CONFIG_ITANIUM_B1_SPECIFIC))
 	adds r3=80,sp
 	;;
 	lfetch.fault.excl.nt1 [r3],128
-#endif
 	mov ar.rsc=0		// put RSE in mode: enforced lazy, little endian, pl 0
-#if !(defined(CONFIG_ITANIUM_B0_SPECIFIC) || defined(CONFIG_ITANIUM_B1_SPECIFIC))
 	adds r2=16+128,sp
 	;;
 	lfetch.fault.excl.nt1 [r2],128
 	lfetch.fault.excl.nt1 [r3],128
-#endif
 	adds r14=SW(R4)+16,sp
-#if !(defined(CONFIG_ITANIUM_B0_SPECIFIC) || defined(CONFIG_ITANIUM_B1_SPECIFIC))
 	;;
 	lfetch.fault.excl [r2]
 	lfetch.fault.excl [r3]
-#endif
 	adds r15=SW(R5)+16,sp
 	;;
 	mov r18=ar.fpsr		// preserve fpsr
@@ -309,7 +303,7 @@
 	st8 [r2]=r20		// save ar.bspstore
 	st8 [r3]=r21		// save predicate registers
 	mov ar.rsc=3		// put RSE back into eager mode, pl 0
-	br.cond.sptk.few b7
+	br.cond.sptk.many b7
 END(save_switch_stack)
 
 /*
@@ -321,11 +315,9 @@
 ENTRY(load_switch_stack)
 	.prologue
 	.altrp b7
-	.body
-#if !(defined(CONFIG_ITANIUM_B0_SPECIFIC) || defined(CONFIG_ITANIUM_B1_SPECIFIC))
 
+	.body
 	lfetch.fault.nt1 [sp]
-#endif
 	adds r2=SW(AR_BSPSTORE)+16,sp
 	adds r3=SW(AR_UNAT)+16,sp
 	mov ar.rsc=0						// put RSE into enforced lazy mode
@@ -426,7 +418,7 @@
 	;;
 (p6)	st4 [r2]=r8
 (p6)	mov r8=-1
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__ia64_syscall)
 
 	/*
@@ -441,11 +433,11 @@
 	.body
 	mov loc2=b6
 	;;
-	br.call.sptk.few rp=syscall_trace
+	br.call.sptk.many rp=syscall_trace
 .ret3:	mov rp=loc0
 	mov ar.pfs=loc1
 	mov b6=loc2
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(invoke_syscall_trace)
 
 	/*
@@ -462,21 +454,21 @@
 
 GLOBAL_ENTRY(ia64_trace_syscall)
 	PT_REGS_UNWIND_INFO(0)
-	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args
-.ret6:	br.call.sptk.few rp=b6			// do the syscall
+	br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch syscall args
+.ret6:	br.call.sptk.many rp=b6			// do the syscall
 strace_check_retval:
 	cmp.lt p6,p0=r8,r0			// syscall failed?
 	adds r2=PT(R8)+16,sp			// r2 = &pt_regs.r8
 	adds r3=PT(R10)+16,sp			// r3 = &pt_regs.r10
 	mov r10=0
-(p6)	br.cond.sptk.few strace_error		// syscall failed ->
+(p6)	br.cond.sptk strace_error		// syscall failed ->
 	;;					// avoid RAW on r10
 strace_save_retval:
 .mem.offset 0,0;	st8.spill [r2]=r8	// store return value in slot for r8
 .mem.offset 8,0;	st8.spill [r3]=r10	// clear error indication in slot for r10
 ia64_strace_leave_kernel:
-	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch return value
-.rety:	br.cond.sptk.many ia64_leave_kernel
+	br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch return value
+.rety:	br.cond.sptk ia64_leave_kernel
 
 strace_error:
 	ld8 r3=[r2]				// load pt_regs.r8
@@ -487,7 +479,7 @@
 	;;
 (p6)	mov r10=-1
 (p6)	mov r8=r9
-	br.cond.sptk.few strace_save_retval
+	br.cond.sptk strace_save_retval
 END(ia64_trace_syscall)
 
 GLOBAL_ENTRY(ia64_ret_from_clone)
@@ -497,7 +489,7 @@
 	 * Called by ia64_switch_to after do_fork()->copy_thread().  r8 contains the
 	 * address of the previously executing task.
 	 */
-	br.call.sptk.few rp=invoke_schedule_tail
+	br.call.sptk.many rp=ia64_invoke_schedule_tail
 .ret8:
 	adds r2=IA64_TASK_PTRACE_OFFSET,r13
 	;;
@@ -505,7 +497,7 @@
 	;;
 	mov r8=0
 	tbit.nz p6,p0=r2,PT_TRACESYS_BIT
-(p6)	br strace_check_retval
+(p6)	br.cond.spnt strace_check_retval
 	;;					// added stop bits to prevent r8 dependency
 END(ia64_ret_from_clone)
 	// fall through
@@ -519,7 +511,7 @@
 (p6)	st8.spill [r2]=r8	// store return value in slot for r8 and set unat bit
 	.mem.offset 8,0
 (p6)	st8.spill [r3]=r0	// clear error indication in slot for r10 and set unat bit
-(p7)	br.cond.spnt.few handle_syscall_error	// handle potential syscall failure
+(p7)	br.cond.spnt handle_syscall_error	// handle potential syscall failure
 END(ia64_ret_from_syscall)
 	// fall through
 GLOBAL_ENTRY(ia64_leave_kernel)
@@ -527,22 +519,22 @@
 	lfetch.fault [sp]
 	movl r14=.restart
 	;;
-	MOVBR(.ret.sptk,rp,r14,.restart)
+	mov.ret.sptk rp=r14,.restart
 .restart:
 	adds r17=IA64_TASK_NEED_RESCHED_OFFSET,r13
 	adds r18=IA64_TASK_SIGPENDING_OFFSET,r13
 #ifdef CONFIG_PERFMON
-	adds r19=IA64_TASK_PFM_NOTIFY_OFFSET,r13
+	adds r19=IA64_TASK_PFM_MUST_BLOCK_OFFSET,r13
 #endif
 	;;
 #ifdef CONFIG_PERFMON
-	ld8 r19=[r19]				// load current->task.pfm_notify
+(pUser)	ld8 r19=[r19]				// load current->thread.pfm_must_block
 #endif
-	ld8 r17=[r17]				// load current->need_resched
-	ld4 r18=[r18]				// load current->sigpending
+(pUser)	ld8 r17=[r17]				// load current->need_resched
+(pUser)	ld4 r18=[r18]				// load current->sigpending
 	;;
 #ifdef CONFIG_PERFMON
-	cmp.ne p9,p0=r19,r0			// current->task.pfm_notify != 0?
+(pUser)	cmp.ne.unc p9,p0=r19,r0			// current->thread.pfm_must_block != 0?
 #endif
 (pUser)	cmp.ne.unc p7,p0=r17,r0			// current->need_resched != 0?
 (pUser)	cmp.ne.unc p8,p0=r18,r0			// current->sigpending != 0?
@@ -550,7 +542,7 @@
 	adds r2=PT(R8)+16,r12
 	adds r3=PT(R9)+16,r12
 #ifdef CONFIG_PERFMON
-(p9)	br.call.spnt.many b7=pfm_overflow_notify
+(p9)	br.call.spnt.many b7=pfm_block_on_overflow
 #endif
 #if __GNUC__ < 3
 (p7)	br.call.spnt.many b7=invoke_schedule
@@ -650,13 +642,13 @@
 	movl r17=PERCPU_ADDR+IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET
 	;;
 	ld4 r17=[r17]		// r17 = cpu_data->phys_stacked_size_p8
-(pKern)	br.cond.dpnt.few skip_rbs_switch
+(pKern)	br.cond.dpnt skip_rbs_switch
 	/*
 	 * Restore user backing store.
 	 *
 	 * NOTE: alloc, loadrs, and cover can't be predicated.
 	 */
-(pNonSys) br.cond.dpnt.few dont_preserve_current_frame
+(pNonSys) br.cond.dpnt dont_preserve_current_frame
 	cover				// add current frame into dirty partition
 	;;
 	mov r19=ar.bsp			// get new backing store pointer
@@ -687,7 +679,7 @@
 	shladd in0=loc1,3,r17
 	mov in1=0
 	;;
-	.align 32
+//	.align 32	// gas-2.11.90 is unable to generate a stop bit after .align
 rse_clear_invalid:
 	// cycle 0
  { .mii
@@ -706,7 +698,7 @@
 }{ .mib
 	mov loc3=0
 	mov loc4=0
-(pRecurse) br.call.sptk.few b6=rse_clear_invalid
+(pRecurse) br.call.sptk.many b6=rse_clear_invalid
 
 }{ .mfi	// cycle 2
 	mov loc5=0
@@ -715,7 +707,7 @@
 }{ .mib
 	mov loc6=0
 	mov loc7=0
-(pReturn) br.ret.sptk.few b6
+(pReturn) br.ret.sptk.many b6
 }
 #	undef pRecurse
 #	undef pReturn
@@ -761,24 +753,24 @@
 	;;
 .mem.offset 0,0; st8.spill [r2]=r9	// store errno in pt_regs.r8 and set unat bit
 .mem.offset 8,0; st8.spill [r3]=r10	// store error indication in pt_regs.r10 and set unat bit
-	br.cond.sptk.many ia64_leave_kernel
+	br.cond.sptk ia64_leave_kernel
 END(handle_syscall_error)
 
 	/*
 	 * Invoke schedule_tail(task) while preserving in0-in7, which may be needed
 	 * in case a system call gets restarted.
 	 */
-ENTRY(invoke_schedule_tail)
+GLOBAL_ENTRY(ia64_invoke_schedule_tail)
 	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
 	alloc loc1=ar.pfs,8,2,1,0
 	mov loc0=rp
 	mov out0=r8				// Address of previous task
 	;;
-	br.call.sptk.few rp=schedule_tail
+	br.call.sptk.many rp=schedule_tail
 .ret11:	mov ar.pfs=loc1
 	mov rp=loc0
 	br.ret.sptk.many rp
-END(invoke_schedule_tail)
+END(ia64_invoke_schedule_tail)
 
 #if __GNUC__ < 3
 
@@ -797,7 +789,7 @@
 	mov loc0=rp
 	;;
 	.body
-	br.call.sptk.few rp=schedule
+	br.call.sptk.many rp=schedule
 .ret14:	mov ar.pfs=loc1
 	mov rp=loc0
 	br.ret.sptk.many rp
@@ -824,7 +816,7 @@
 	.spillpsp ar.unat, 16			// (note that offset is relative to psp+0x10!)
 	st8 [sp]=r9,-16				// allocate space for ar.unat and save it
 	.body
-	br.call.sptk.few rp=ia64_do_signal
+	br.call.sptk.many rp=ia64_do_signal
 .ret15:	.restore sp
 	adds sp=16,sp				// pop scratch stack space
 	;;
@@ -849,7 +841,7 @@
 	.spillpsp ar.unat, 16			// (note that offset is relative to psp+0x10!)
 	st8 [sp]=r9,-16				// allocate space for ar.unat and save it
 	.body
-	br.call.sptk.few rp=ia64_rt_sigsuspend
+	br.call.sptk.many rp=ia64_rt_sigsuspend
 .ret17:	.restore sp
 	adds sp=16,sp				// pop scratch stack space
 	;;
@@ -871,15 +863,15 @@
 	cmp.eq pNonSys,pSys=r0,r0		// sigreturn isn't a normal syscall...
 	;;
 	adds out0=16,sp				// out0 = &sigscratch
-	br.call.sptk.few rp=ia64_rt_sigreturn
+	br.call.sptk.many rp=ia64_rt_sigreturn
 .ret19:	.restore sp 0
 	adds sp=16,sp
 	;;
 	ld8 r9=[sp]				// load new ar.unat
-	MOVBR(.sptk,b7,r8,ia64_leave_kernel)
+	mov.sptk b7=r8,ia64_leave_kernel
 	;;
 	mov ar.unat=r9
-	br b7
+	br.many b7
 END(sys_rt_sigreturn)
 
 GLOBAL_ENTRY(ia64_prepare_handle_unaligned)
@@ -890,7 +882,7 @@
 	mov r16=r0
 	.prologue
 	DO_SAVE_SWITCH_STACK
-	br.call.sptk.few rp=ia64_handle_unaligned // stack frame setup in ivt
+	br.call.sptk.many rp=ia64_handle_unaligned // stack frame setup in ivt
 .ret21:	.body
 	DO_LOAD_SWITCH_STACK
 	br.cond.sptk.many rp			  // goes to ia64_leave_kernel
@@ -920,14 +912,14 @@
 	adds out0=16,sp				// &info
 	mov out1=r13				// current
 	adds out2=16+EXTRA_FRAME_SIZE,sp	// &switch_stack
-	br.call.sptk.few rp=unw_init_frame_info
+	br.call.sptk.many rp=unw_init_frame_info
 1:	adds out0=16,sp				// &info
 	mov b6=loc2
 	mov loc2=gp				// save gp across indirect function call
 	;;
 	ld8 gp=[in0]
 	mov out1=in1				// arg
-	br.call.sptk.few rp=b6			// invoke the callback function
+	br.call.sptk.many rp=b6			// invoke the callback function
 1:	mov gp=loc2				// restore gp
 
 	// For now, we don't allow changing registers from within
@@ -1026,7 +1018,7 @@
 	data8 sys_setpriority
 	data8 sys_statfs
 	data8 sys_fstatfs
-	data8 ia64_ni_syscall			// 1105
+	data8 sys_gettid			// 1105
 	data8 sys_semget
 	data8 sys_semop
 	data8 sys_semctl
@@ -1137,7 +1129,7 @@
 	data8 sys_clone2
 	data8 sys_getdents64
 	data8 sys_getunwind			// 1215
-	data8 ia64_ni_syscall
+	data8 sys_readahead
 	data8 ia64_ni_syscall
 	data8 ia64_ni_syscall
 	data8 ia64_ni_syscall
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/entry.h linux/arch/ia64/kernel/entry.h
--- v2.4.14/linux/arch/ia64/kernel/entry.h	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/entry.h	Fri Nov  9 14:26:17 2001
@@ -1,12 +1,5 @@
 #include <linux/config.h>
 
-/* XXX fixme */
-#if defined(CONFIG_ITANIUM_B1_SPECIFIC)
-# define MOVBR(type,br,gr,lbl)	mov br=gr
-#else
-# define MOVBR(type,br,gr,lbl)	mov##type br=gr,lbl
-#endif
-
 /*
  * Preserved registers that are shared between code in ivt.S and entry.S.  Be
  * careful not to step on these!
@@ -62,7 +55,7 @@
 	;;					\
 	.fframe IA64_SWITCH_STACK_SIZE;		\
 	adds sp=-IA64_SWITCH_STACK_SIZE,sp;	\
-	MOVBR(.ret.sptk,b7,r28,1f);		\
+	mov.ret.sptk b7=r28,1f;			\
 	SWITCH_STACK_SAVES(0);			\
 	br.cond.sptk.many save_switch_stack;	\
 1:
@@ -71,7 +64,7 @@
 	movl r28=1f;				\
 	;;					\
 	invala;					\
-	MOVBR(.ret.sptk,b7,r28,1f);		\
+	mov.ret.sptk b7=r28,1f;			\
 	br.cond.sptk.many load_switch_stack;	\
 1:	.restore sp;				\
 	adds sp=IA64_SWITCH_STACK_SIZE,sp
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/fw-emu.c linux/arch/ia64/kernel/fw-emu.c
--- v2.4.14/linux/arch/ia64/kernel/fw-emu.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/fw-emu.c	Fri Nov  9 14:26:17 2001
@@ -174,6 +174,43 @@
 "	;;\n"
 "	mov ar.lc=r9\n"
 "	mov r8=r0\n"
+"	;;\n"
+"1:	cmp.eq p6,p7=15,r28		/* PAL_PERF_MON_INFO */\n"
+"(p7)	br.cond.sptk.few 1f\n"
+"	mov r8=0			/* status = 0 */\n"
+"	movl r9 =0x12082004		/* generic=4 width=32 retired=8 cycles=18 */\n"
+"	mov r10=0			/* reserved */\n"
+"	mov r11=0			/* reserved */\n"
+"	mov r16=0xffff			/* implemented PMC */\n"
+"	mov r17=0xffff			/* implemented PMD */\n"
+"	add r18=8,r29			/* second index */\n"
+"	;;\n"
+"	st8 [r29]=r16,16		/* store implemented PMC */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	;;\n"
+"	st8 [r29]=r0,16			/* store implemented PMC */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	;;\n"
+"	st8 [r29]=r17,16		/* store implemented PMD */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	mov r16=0xf0			/* cycles count capable PMC */\n"
+"	;;\n"
+"	st8 [r29]=r0,16			/* store implemented PMC */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	mov r17=0x10			/* retired bundles capable PMC */\n"
+"	;;\n"
+"	st8 [r29]=r16,16		/* store cycles capable */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	;;\n"
+"	st8 [r29]=r0,16			/* store implemented PMC */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	;;\n"
+"	st8 [r29]=r17,16		/* store retired bundle capable */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	;;\n"
+"	st8 [r29]=r0,16			/* store implemented PMC */\n"
+"	st8 [r18]=r0,16			/* clear remaining bits  */\n"
+"	;;\n"
 "1:	br.cond.sptk.few rp\n"
 "stacked:\n"
 "	br.ret.sptk.few rp\n"
@@ -414,11 +451,6 @@
 #ifdef CONFIG_IA64_SDV
 	strcpy(sal_systab->oem_id, "Intel");
 	strcpy(sal_systab->product_id, "SDV");
-#endif
-
-#ifdef CONFIG_IA64_SGI_SN1_SIM
-	strcpy(sal_systab->oem_id, "SGI");
-	strcpy(sal_systab->product_id, "SN1");
 #endif
 
 	/* fill in an entry point: */
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/gate.S linux/arch/ia64/kernel/gate.S
--- v2.4.14/linux/arch/ia64/kernel/gate.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/gate.S	Fri Nov  9 14:26:17 2001
@@ -3,7 +3,7 @@
  * region.  For now, it contains the signal trampoline code only.
  *
  * Copyright (C) 1999-2001 Hewlett-Packard Co
- * Copyright (C) 1999-2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ * 	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 
 #include <asm/asmmacro.h>
@@ -18,7 +18,6 @@
 #	define ARG0_OFF		(16 + IA64_SIGFRAME_ARG0_OFFSET)
 #	define ARG1_OFF		(16 + IA64_SIGFRAME_ARG1_OFFSET)
 #	define ARG2_OFF		(16 + IA64_SIGFRAME_ARG2_OFFSET)
-#	define RBS_BASE_OFF	(16 + IA64_SIGFRAME_RBS_BASE_OFFSET)
 #	define SIGHANDLER_OFF	(16 + IA64_SIGFRAME_HANDLER_OFFSET)
 #	define SIGCONTEXT_OFF	(16 + IA64_SIGFRAME_SIGCONTEXT_OFFSET)
 
@@ -32,6 +31,8 @@
 #	define PR_OFF		IA64_SIGCONTEXT_PR_OFFSET
 #	define RP_OFF		IA64_SIGCONTEXT_B0_OFFSET
 #	define SP_OFF		IA64_SIGCONTEXT_R12_OFFSET
+#	define RBS_BASE_OFF	IA64_SIGCONTEXT_RBS_BASE_OFFSET
+#	define LOADRS_OFF	IA64_SIGCONTEXT_LOADRS_OFFSET
 #	define base0		r2
 #	define base1		r3
 	/*
@@ -73,34 +74,37 @@
 	.vframesp SP_OFF+SIGCONTEXT_OFF
 	.body
 
-	.prologue
+	.label_state 1
+
 	adds base0=SIGHANDLER_OFF,sp
-	adds base1=RBS_BASE_OFF,sp
+	adds base1=RBS_BASE_OFF+SIGCONTEXT_OFF,sp
 	br.call.sptk.many rp=1f
 1:
 	ld8 r17=[base0],(ARG0_OFF-SIGHANDLER_OFF)	// get pointer to signal handler's plabel
-	ld8 r15=[base1],(ARG1_OFF-RBS_BASE_OFF)		// get address of new RBS base (or NULL)
+	ld8 r15=[base1]					// get address of new RBS base (or NULL)
 	cover				// push args in interrupted frame onto backing store
 	;;
+	cmp.ne p8,p0=r15,r0		// do we need to switch the rbs?
+	mov.m r9=ar.bsp			// fetch ar.bsp
+	.spillsp.p p8, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
+(p8)	br.cond.spnt setup_rbs		// yup -> (clobbers r14, r15, and r16)
+back_from_setup_rbs:
+
 	.save ar.pfs, r8
 	alloc r8=ar.pfs,0,0,3,0		// get CFM0, EC0, and CPL0 into r8
 	ld8 out0=[base0],16		// load arg0 (signum)
+	adds base1=(ARG1_OFF-(RBS_BASE_OFF+SIGCONTEXT_OFF)),base1
 	;;
 	ld8 out1=[base1]		// load arg1 (siginfop)
 	ld8 r10=[r17],8			// get signal handler entry point
 	;;
 	ld8 out2=[base0]		// load arg2 (sigcontextp)
 	ld8 gp=[r17]			// get signal handler's global pointer
-	cmp.ne p8,p0=r15,r0		// do we need to switch the rbs?
 
-	mov.m r17=ar.bsp		// fetch ar.bsp
-	.spillsp.p p8, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
-(p8)	br.cond.spnt.few setup_rbs	// yup -> (clobbers r14 and r16)
-back_from_setup_rbs:
 	adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp
 	;;
 	.spillsp ar.bsp, BSP_OFF+SIGCONTEXT_OFF
-	st8 [base0]=r17,(CFM_OFF-BSP_OFF)	// save sc_ar_bsp
+	st8 [base0]=r9,(CFM_OFF-BSP_OFF)	// save sc_ar_bsp
 	dep r8=0,r8,38,26			// clear EC0, CPL0 and reserved bits
 	adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp
 	;;
@@ -123,7 +127,7 @@
 	;;
 	stf.spill [base0]=f14,32
 	stf.spill [base1]=f15,32
-	br.call.sptk.few rp=b6			// call the signal handler
+	br.call.sptk.many rp=b6			// call the signal handler
 .ret0:	adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp
 	;;
 	ld8 r15=[base0],(CFM_OFF-BSP_OFF)	// fetch sc_ar_bsp and advance to CFM_OFF
@@ -131,7 +135,7 @@
 	;;
 	ld8 r8=[base0]				// restore (perhaps modified) CFM0, EC0, and CPL0
 	cmp.ne p8,p0=r14,r15			// do we need to restore the rbs?
-(p8)	br.cond.spnt.few restore_rbs		// yup -> (clobbers r14 and r16)
+(p8)	br.cond.spnt restore_rbs		// yup -> (clobbers r14 and r16)
 	;;
 back_from_restore_rbs:
 	adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
@@ -154,30 +158,52 @@
 	mov r15=__NR_rt_sigreturn
 	break __BREAK_SYSCALL
 
+	.body
+	.copy_state 1
 setup_rbs:
-	flushrs					// must be first in insn
 	mov ar.rsc=0				// put RSE into enforced lazy mode
-	adds r16=(RNAT_OFF+SIGCONTEXT_OFF),sp
 	;;
-	mov r14=ar.rnat				// get rnat as updated by flushrs
-	mov ar.bspstore=r15			// set new register backing store area
+	.save ar.rnat, r16
+	mov r16=ar.rnat				// save RNaT before switching backing store area
+	adds r14=(RNAT_OFF+SIGCONTEXT_OFF),sp
+
+	mov ar.bspstore=r15			// switch over to new register backing store area
 	;;
 	.spillsp ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
-	st8 [r16]=r14				// save sc_ar_rnat
+	st8 [r14]=r16				// save sc_ar_rnat
+	adds r14=(LOADRS_OFF+SIGCONTEXT_OFF),sp
+
+	mov.m r16=ar.bsp			// sc_loadrs <- (new bsp - new bspstore) << 16
+	;;
+	invala
+	sub r15=r16,r15
+	;;
+	shl r15=r15,16
+	;;
+	st8 [r14]=r15				// save sc_loadrs
 	mov ar.rsc=0xf				// set RSE into eager mode, pl 3
-	invala					// invalidate ALAT
-	br.cond.sptk.many back_from_setup_rbs
+	br.cond.sptk back_from_setup_rbs
 
+	.prologue
+	.copy_state 1
+	.spillsp ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
+	.body
 restore_rbs:
-	flushrs
-	mov ar.rsc=0				// put RSE into enforced lazy mode
+	alloc r2=ar.pfs,0,0,0,0			// alloc null frame
+	adds r16=(LOADRS_OFF+SIGCONTEXT_OFF),sp
+	;;
+	ld8 r14=[r16]
 	adds r16=(RNAT_OFF+SIGCONTEXT_OFF),sp
 	;;
+	mov ar.rsc=r14				// put RSE into enforced lazy mode
 	ld8 r14=[r16]				// get new rnat
-	mov ar.bspstore=r15			// set old register backing store area
 	;;
-	mov ar.rnat=r14				// establish new rnat
+	loadrs					// restore dirty partition
+	;;
+	mov ar.bspstore=r15			// switch back to old register backing store area
+	;;
+	mov ar.rnat=r14				// restore RNaT
 	mov ar.rsc=0xf				// (will be restored later on from sc_ar_rsc)
 	// invala not necessary as that will happen when returning to user-mode
-	br.cond.sptk.many back_from_restore_rbs
+	br.cond.sptk back_from_restore_rbs
 END(ia64_sigtramp)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/head.S linux/arch/ia64/kernel/head.S
--- v2.4.14/linux/arch/ia64/kernel/head.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/head.S	Fri Nov  9 14:26:17 2001
@@ -6,8 +6,8 @@
  * entry point.
  *
  * Copyright (C) 1998-2001 Hewlett-Packard Co
- * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 2001 Stephane Eranian <eranian@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
  * Copyright (C) 1999 VA Linux Systems
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  * Copyright (C) 1999 Intel Corp.
@@ -63,17 +63,17 @@
 	 * that maps the kernel's text and data:
 	 */
 	rsm psr.i | psr.ic
-	mov r16=((ia64_rid(IA64_REGION_ID_KERNEL, PAGE_OFFSET) << 8) | (KERNEL_PG_SHIFT << 2))
+	mov r16=((ia64_rid(IA64_REGION_ID_KERNEL, PAGE_OFFSET) << 8) | (IA64_GRANULE_SHIFT << 2))
 	;;
 	srlz.i
-	mov r18=KERNEL_PG_SHIFT<<2
-	movl r17=PAGE_OFFSET + KERNEL_PG_NUM*KERNEL_PG_SIZE
+	mov r18=KERNEL_TR_PAGE_SHIFT<<2
+	movl r17=KERNEL_START
 	;;
 	mov rr[r17]=r16
 	mov cr.itir=r18
 	mov cr.ifa=r17
 	mov r16=IA64_TR_KERNEL
-	movl r18=(KERNEL_PG_NUM*KERNEL_PG_SIZE | PAGE_KERNEL)
+	movl r18=((1 << KERNEL_TR_PAGE_SHIFT) | PAGE_KERNEL)
 	;;
 	srlz.i
 	;;
@@ -86,7 +86,8 @@
 	/*
 	 * Switch into virtual mode:
 	 */
-	movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN)
+	movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \
+		  |IA64_PSR_DI)
 	;;
 	mov cr.ipsr=r16
 	movl r17=1f
@@ -111,7 +112,7 @@
 	;;
 
 #ifdef CONFIG_IA64_EARLY_PRINTK
-	mov r3=(6<<8) | (KERNEL_PG_SHIFT<<2)
+	mov r3=(6<<8) | (IA64_GRANULE_SHIFT<<2)
 	movl r2=6<<61
 	;;
 	mov rr[r2]=r3
@@ -144,6 +145,7 @@
 	cmp4.ne isAP,isBP=r3,r0
 	;;			// RAW on r2
 	extr r3=r2,0,61		// r3 == phys addr of task struct
+	mov r16=KERNEL_TR_PAGE_NUM
 	;;
 
 	// load the "current" pointer (r13) and ar.k6 with the current task
@@ -151,7 +153,7 @@
 	mov IA64_KR(CURRENT)=r3		// Physical address
 
 	// initialize k4 to a safe value (64-128MB is mapped by TR_KERNEL)
-	mov IA64_KR(CURRENT_STACK)=1
+	mov IA64_KR(CURRENT_STACK)=r16
 	/*
 	 * Reserve space at the top of the stack for "struct pt_regs".  Kernel threads
 	 * don't store interesting values in that structure, but the space still needs
@@ -183,31 +185,31 @@
 	alloc r2=ar.pfs,0,0,2,0
 	movl out0=alive_msg
 	;;
-	br.call.sptk.few rp=early_printk
+	br.call.sptk.many rp=early_printk
 1:	// force new bundle
 #endif /* CONFIG_IA64_EARLY_PRINTK */
 
 #ifdef CONFIG_SMP
-(isAP)	br.call.sptk.few rp=start_secondary
+(isAP)	br.call.sptk.many rp=start_secondary
 .ret0:
-(isAP)	br.cond.sptk.few self
+(isAP)	br.cond.sptk self
 #endif
 
 	// This is executed by the bootstrap processor (bsp) only:
 
 #ifdef CONFIG_IA64_FW_EMU
 	// initialize PAL & SAL emulator:
-	br.call.sptk.few rp=sys_fw_init
+	br.call.sptk.many rp=sys_fw_init
 .ret1:
 #endif
-	br.call.sptk.few rp=start_kernel
+	br.call.sptk.many rp=start_kernel
 .ret2:	addl r3=@ltoff(halt_msg),gp
 	;;
 	alloc r2=ar.pfs,8,0,2,0
 	;;
 	ld8 out0=[r3]
-	br.call.sptk.few b0=console_print
-self:	br.sptk.few self		// endless loop
+	br.call.sptk.many b0=console_print
+self:	br.sptk.many self		// endless loop
 END(_start)
 
 GLOBAL_ENTRY(ia64_save_debug_regs)
@@ -218,7 +220,7 @@
 	add r19=IA64_NUM_DBG_REGS*8,in0
 	;;
 1:	mov r16=dbr[r18]
-#if defined(CONFIG_ITANIUM_C0_SPECIFIC)
+#ifdef CONFIG_ITANIUM
 	;;
 	srlz.d
 #endif
@@ -227,17 +229,15 @@
 	;;
 	st8.nta [in0]=r16,8
 	st8.nta [r19]=r17,8
-	br.cloop.sptk.few 1b
+	br.cloop.sptk.many 1b
 	;;
 	mov ar.lc=r20			// restore ar.lc
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(ia64_save_debug_regs)
 
 GLOBAL_ENTRY(ia64_load_debug_regs)
 	alloc r16=ar.pfs,1,0,0,0
-#if !(defined(CONFIG_ITANIUM_B0_SPECIFIC) || defined(CONFIG_ITANIUM_B1_SPECIFIC))
 	lfetch.nta [in0]
-#endif
 	mov r20=ar.lc			// preserve ar.lc
 	add r19=IA64_NUM_DBG_REGS*8,in0
 	mov ar.lc=IA64_NUM_DBG_REGS-1
@@ -248,15 +248,15 @@
 	add r18=1,r18
 	;;
 	mov dbr[r18]=r16
-#if defined(CONFIG_ITANIUM_BSTEP_SPECIFIC) || defined(CONFIG_ITANIUM_C0_SPECIFIC)
+#ifdef CONFIG_ITANIUM
 	;;
-	srlz.d
+	srlz.d				// Errata 132 (NoFix status)
 #endif
 	mov ibr[r18]=r17
-	br.cloop.sptk.few 1b
+	br.cloop.sptk.many 1b
 	;;
 	mov ar.lc=r20			// restore ar.lc
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(ia64_load_debug_regs)
 
 GLOBAL_ENTRY(__ia64_save_fpu)
@@ -406,7 +406,7 @@
 	;;
 	stf.spill.nta [in0]=f126,32
 	stf.spill.nta [ r3]=f127,32
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__ia64_save_fpu)
 
 GLOBAL_ENTRY(__ia64_load_fpu)
@@ -556,7 +556,7 @@
 	;;
 	ldf.fill.nta f126=[in0],32
 	ldf.fill.nta f127=[ r3],32
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__ia64_load_fpu)
 
 GLOBAL_ENTRY(__ia64_init_fpu)
@@ -690,7 +690,7 @@
 	;;
 	ldf.fill f126=[sp]
 	mov      f127=f0
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__ia64_init_fpu)
 
 /*
@@ -738,7 +738,7 @@
 	rfi				// must be last insn in group
 	;;
 1:	mov rp=r14
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(ia64_switch_mode)
 
 #ifdef CONFIG_IA64_BRL_EMU
@@ -752,7 +752,7 @@
 	alloc r16=ar.pfs,1,0,0,0;		\
 	mov reg=r32;				\
 	;;					\
-	br.ret.sptk rp;				\
+	br.ret.sptk.many rp;			\
  END(ia64_set_##reg)
 
 SET_REG(b1);
@@ -816,12 +816,11 @@
 	;;
 	cmp.ne p15,p0=tmp,r0
 	mov tmp=ar.itc
-(p15)	br.cond.sptk.few .retry	// lock is still busy
+(p15)	br.cond.sptk .retry	// lock is still busy
 	;;
 	// try acquiring lock (we know ar.ccv is still zero!):
 	mov tmp=1
 	;;
-	IA64_SEMFIX_INSN
 	cmpxchg4.acq tmp=[r31],tmp,ar.ccv
 	;;
 	cmp.eq p15,p0=tmp,r0
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/ia64_ksyms.c linux/arch/ia64/kernel/ia64_ksyms.c
--- v2.4.14/linux/arch/ia64/kernel/ia64_ksyms.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/ia64_ksyms.c	Fri Nov  9 14:26:17 2001
@@ -69,6 +69,8 @@
 
 #include <asm/pgalloc.h>
 
+EXPORT_SYMBOL(flush_tlb_range);
+
 #ifdef CONFIG_SMP
 
 EXPORT_SYMBOL(smp_flush_tlb_all);
@@ -145,4 +147,3 @@
 #include <linux/proc_fs.h>
 extern struct proc_dir_entry *efi_dir;
 EXPORT_SYMBOL(efi_dir);
-
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/iosapic.c linux/arch/ia64/kernel/iosapic.c
--- v2.4.14/linux/arch/ia64/kernel/iosapic.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/iosapic.c	Fri Nov  9 14:26:17 2001
@@ -53,6 +53,7 @@
 #include <asm/acpi-ext.h>
 #include <asm/acpikcfg.h>
 #include <asm/delay.h>
+#include <asm/hw_irq.h>
 #include <asm/io.h>
 #include <asm/iosapic.h>
 #include <asm/machvec.h>
@@ -325,7 +326,7 @@
 	set_affinity:	iosapic_set_affinity
 };
 
-static unsigned int
+unsigned int
 iosapic_version (char *addr)
 {
 	/*
@@ -342,6 +343,113 @@
 }
 
 /*
+ * ACPI can describe IOSAPIC interrupts via static tables and namespace
+ * methods.  This provides an interface to register those interrupts and
+ * program the IOSAPIC RTE.
+ */
+int
+iosapic_register_irq (u32 global_vector, unsigned long polarity, unsigned long
+                      edge_triggered, u32 base_irq, char *iosapic_address)
+{
+	irq_desc_t *idesc;
+	struct hw_interrupt_type *irq_type;
+	int vector;
+
+	vector = iosapic_irq_to_vector(global_vector);
+	if (vector < 0)
+		vector = ia64_alloc_irq();
+
+	/* fill in information from this vector's IOSAPIC */
+	iosapic_irq[vector].addr = iosapic_address;
+	iosapic_irq[vector].base_irq = base_irq;
+	iosapic_irq[vector].pin	= global_vector - iosapic_irq[vector].base_irq;
+	iosapic_irq[vector].polarity = polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW;
+	iosapic_irq[vector].dmode    = IOSAPIC_LOWEST_PRIORITY;
+
+	if (edge_triggered) {
+		iosapic_irq[vector].trigger = IOSAPIC_EDGE;
+		irq_type = &irq_type_iosapic_edge;
+	} else {
+		iosapic_irq[vector].trigger = IOSAPIC_LEVEL;
+		irq_type = &irq_type_iosapic_level;
+	}
+
+	idesc = irq_desc(vector);
+	if (idesc->handler != irq_type) {
+		if (idesc->handler != &no_irq_type)
+			printk("iosapic_register_irq(): changing vector 0x%02x from"
+			       "%s to %s\n", vector, idesc->handler->typename, irq_type->typename);
+		idesc->handler = irq_type;
+	}
+
+	printk("IOSAPIC %x(%s,%s) -> Vector %x\n", global_vector,
+	       (polarity ? "high" : "low"), (edge_triggered ? "edge" : "level"), vector);
+
+	/* program the IOSAPIC routing table */
+	set_rte(vector, (ia64_get_lid() >> 16) & 0xffff);
+	return vector;
+}
+
+/*
+ * ACPI calls this when it finds an entry for a platform interrupt.
+ * Note that the irq_base and IOSAPIC address must be set in iosapic_init().
+ */
+int
+iosapic_register_platform_irq (u32 int_type, u32 global_vector, u32 iosapic_vector,
+			       u16 eid, u16 id, unsigned long polarity,
+			       unsigned long edge_triggered, u32 base_irq, char *iosapic_address)
+{
+	struct hw_interrupt_type *irq_type;
+	irq_desc_t *idesc;
+	int vector;
+
+	switch (int_type) {
+	      case ACPI20_ENTRY_PIS_CPEI:
+		vector = IA64_PCE_VECTOR;
+		iosapic_irq[vector].dmode = IOSAPIC_LOWEST_PRIORITY;
+		break;
+	      case ACPI20_ENTRY_PIS_INIT:
+		vector = ia64_alloc_irq();
+		iosapic_irq[vector].dmode = IOSAPIC_INIT;
+		break;
+	      default:
+		printk("iosapic_register_platform_irq(): invalid int type\n");
+		return -1;
+	}
+
+	/* fill in information from this vector's IOSAPIC */
+	iosapic_irq[vector].addr = iosapic_address;
+	iosapic_irq[vector].base_irq = base_irq;
+	iosapic_irq[vector].pin	= global_vector - iosapic_irq[vector].base_irq;
+	iosapic_irq[vector].polarity = polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW;
+
+	if (edge_triggered) {
+		iosapic_irq[vector].trigger = IOSAPIC_EDGE;
+		irq_type = &irq_type_iosapic_edge;
+	} else {
+		iosapic_irq[vector].trigger = IOSAPIC_LEVEL;
+		irq_type = &irq_type_iosapic_level;
+	}
+
+	idesc = irq_desc(vector);
+	if (idesc->handler != irq_type) {
+		if (idesc->handler != &no_irq_type)
+			printk("iosapic_register_platform_irq(): changing vector 0x%02x from"
+			       "%s to %s\n", vector, idesc->handler->typename, irq_type->typename);
+		idesc->handler = irq_type;
+	}
+
+	printk("PLATFORM int %x: IOSAPIC %x(%s,%s) -> Vector %x CPU %.02u:%.02u\n",
+	       int_type, global_vector, (polarity ? "high" : "low"),
+	       (edge_triggered ? "edge" : "level"), vector, eid, id);
+
+	/* program the IOSAPIC routing table */
+	set_rte(vector, ((id << 8) | eid) & 0xffff);
+	return vector;
+}
+
+
+/*
  * ACPI calls this when it finds an entry for a legacy ISA interrupt.  Note that the
  * irq_base and IOSAPIC address must be set in iosapic_init().
  */
@@ -436,7 +544,7 @@
 			/* the interrupt route is for another controller... */
 			continue;
 
-		if (irq < 16)
+		if (pcat_compat && (irq < 16))
 			vector = isa_irq_to_vector(irq);
 		else {
 			vector = iosapic_irq_to_vector(irq);
@@ -515,6 +623,23 @@
 				printk("PCI->APIC IRQ transform: (B%d,I%d,P%d) -> 0x%02x\n",
 				       dev->bus->number, PCI_SLOT(dev->devfn), pin, vector);
 				dev->irq = vector;
+
+#ifdef CONFIG_SMP
+				/*
+				 * For platforms that do not support interrupt redirect
+				 * via the XTP interface, we can round-robin the PCI
+				 * device interrupts to the processors
+				 */
+				if (!(smp_int_redirect & SMP_IRQ_REDIRECTION)) {
+					static int cpu_index = 0;
+
+					set_rte(vector, cpu_physical_id(cpu_index) & 0xffff);
+
+					cpu_index++;
+					if (cpu_index >= smp_num_cpus)
+						cpu_index = 0;
+				}
+#endif
 			}
 		}
 		/*
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/irq.c linux/arch/ia64/kernel/irq.c
--- v2.4.14/linux/arch/ia64/kernel/irq.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/irq.c	Fri Nov  9 14:26:17 2001
@@ -33,6 +33,7 @@
 #include <linux/irq.h>
 #include <linux/proc_fs.h>
 
+#include <asm/atomic.h>
 #include <asm/io.h>
 #include <asm/smp.h>
 #include <asm/system.h>
@@ -121,7 +122,10 @@
 	end_none
 };
 
-volatile unsigned long irq_err_count;
+atomic_t irq_err_count;
+#if defined(CONFIG_X86) && defined(CONFIG_X86_IO_APIC) && defined(APIC_MISMATCH_DEBUG)
+atomic_t irq_mis_count;
+#endif
 
 /*
  * Generic, controller-independent functions:
@@ -164,14 +168,17 @@
 		p += sprintf(p, "%10u ",
 			nmi_count(cpu_logical_map(j)));
 	p += sprintf(p, "\n");
-#if defined(CONFIG_SMP) && defined(__i386__)
+#if defined(CONFIG_SMP) && defined(CONFIG_X86)
 	p += sprintf(p, "LOC: ");
 	for (j = 0; j < smp_num_cpus; j++)
 		p += sprintf(p, "%10u ",
 			apic_timer_irqs[cpu_logical_map(j)]);
 	p += sprintf(p, "\n");
 #endif
-	p += sprintf(p, "ERR: %10lu\n", irq_err_count);
+	p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+#if defined(CONFIG_X86) && defined(CONFIG_X86_IO_APIC) && defined(APIC_MISMATCH_DEBUG)
+	p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+#endif
 	return p - buf;
 }
 
@@ -183,7 +190,7 @@
 
 #ifdef CONFIG_SMP
 unsigned int global_irq_holder = NO_PROC_ID;
-volatile unsigned long global_irq_lock; /* long for set_bit --RR */
+unsigned volatile long global_irq_lock; /* pedantic: long for set_bit --RR */
 
 extern void show_stack(unsigned long* esp);
 
@@ -201,14 +208,14 @@
 		printk(" %d",bh_count(i));
 
 	printk(" ]\nStack dumps:");
-#if defined(__ia64__)
+#if defined(CONFIG_IA64)
 	/*
 	 * We can't unwind the stack of another CPU without access to
 	 * the registers of that CPU.  And sending an IPI when we're
 	 * in a potentially wedged state doesn't sound like a smart
 	 * idea.
 	 */
-#elif defined(__i386__)
+#elif defined(CONFIG_X86)
 	for(i=0;i< smp_num_cpus;i++) {
 		unsigned long esp;
 		if(i==cpu)
@@ -261,7 +268,7 @@
 /*
  * We have to allow irqs to arrive between __sti and __cli
  */
-# ifdef __ia64__
+# ifdef CONFIG_IA64
 #  define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop 0")
 # else
 #  define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop")
@@ -331,6 +338,9 @@
 		/* Uhhuh.. Somebody else got it. Wait.. */
 		do {
 			do {
+#ifdef CONFIG_X86
+				rep_nop();
+#endif
 			} while (test_bit(0,&global_irq_lock));
 		} while (test_and_set_bit(0,&global_irq_lock));
 	}
@@ -364,7 +374,7 @@
 {
 	unsigned int flags;
 
-#ifdef __ia64__
+#ifdef CONFIG_IA64
 	__save_flags(flags);
 	if (flags & IA64_PSR_I) {
 		__cli();
@@ -403,7 +413,7 @@
 	int cpu = smp_processor_id();
 
 	__save_flags(flags);
-#ifdef __ia64__
+#ifdef CONFIG_IA64
 	local_enabled = (flags & IA64_PSR_I) != 0;
 #else
 	local_enabled = (flags >> EFLAGS_IF_SHIFT) & 1;
@@ -476,13 +486,19 @@
 	return status;
 }
 
-/*
- * Generic enable/disable code: this just calls
- * down into the PIC-specific version for the actual
- * hardware disable after having gotten the irq
- * controller lock.
+/**
+ *	disable_irq_nosync - disable an irq without waiting
+ *	@irq: Interrupt to disable
+ *
+ *	Disable the selected interrupt line.  Disables and Enables are
+ *	nested.
+ *	Unlike disable_irq(), this function does not ensure existing
+ *	instances of the IRQ handler have completed before returning.
+ *
+ *	This function may be called from IRQ context.
  */
-void inline disable_irq_nosync(unsigned int irq)
+
+inline void disable_irq_nosync(unsigned int irq)
 {
 	irq_desc_t *desc = irq_desc(irq);
 	unsigned long flags;
@@ -495,10 +511,19 @@
 	spin_unlock_irqrestore(&desc->lock, flags);
 }
 
-/*
- * Synchronous version of the above, making sure the IRQ is
- * no longer running on any other IRQ..
+/**
+ *	disable_irq - disable an irq and wait for completion
+ *	@irq: Interrupt to disable
+ *
+ *	Disable the selected interrupt line.  Enables and Disables are
+ *	nested.
+ *	This function waits for any pending IRQ handlers for this interrupt
+ *	to complete before returning. If you use this function while
+ *	holding a resource the IRQ handler may need you will deadlock.
+ *
+ *	This function may be called - with care - from IRQ context.
  */
+
 void disable_irq(unsigned int irq)
 {
 	disable_irq_nosync(irq);
@@ -512,6 +537,17 @@
 #endif
 }
 
+/**
+ *	enable_irq - enable handling of an irq
+ *	@irq: Interrupt to enable
+ *
+ *	Undoes the effect of one call to disable_irq().  If this
+ *	matches the last disable, processing of interrupts on this
+ *	IRQ line is re-enabled.
+ *
+ *	This function may be called from IRQ context.
+ */
+
 void enable_irq(unsigned int irq)
 {
 	irq_desc_t *desc = irq_desc(irq);
@@ -533,7 +569,8 @@
 		desc->depth--;
 		break;
 	case 0:
-		printk("enable_irq() unbalanced from %p\n", (void *) __builtin_return_address(0));
+		printk("enable_irq(%u) unbalanced from %p\n",
+		       irq, (void *) __builtin_return_address(0));
 	}
 	spin_unlock_irqrestore(&desc->lock, flags);
 }
@@ -626,11 +663,41 @@
 		desc->handler->end(irq);
 		spin_unlock(&desc->lock);
 	}
-	if (local_softirq_pending())
-		do_softirq();
 	return 1;
 }
 
+/**
+ *	request_irq - allocate an interrupt line
+ *	@irq: Interrupt line to allocate
+ *	@handler: Function to be called when the IRQ occurs
+ *	@irqflags: Interrupt type flags
+ *	@devname: An ascii name for the claiming device
+ *	@dev_id: A cookie passed back to the handler function
+ *
+ *	This call allocates interrupt resources and enables the
+ *	interrupt line and IRQ handling. From the point this
+ *	call is made your handler function may be invoked. Since
+ *	your handler function must clear any interrupt the board 
+ *	raises, you must take care both to initialise your hardware
+ *	and to set up the interrupt handler in the right order.
+ *
+ *	Dev_id must be globally unique. Normally the address of the
+ *	device data structure is used as the cookie. Since the handler
+ *	receives this value it makes sense to use it.
+ *
+ *	If your interrupt is shared you must pass a non NULL dev_id
+ *	as this is required when freeing the interrupt.
+ *
+ *	Flags:
+ *
+ *	SA_SHIRQ		Interrupt is shared
+ *
+ *	SA_INTERRUPT		Disable local interrupts while processing
+ *
+ *	SA_SAMPLE_RANDOM	The interrupt can be used for entropy
+ *
+ */
+
 int request_irq(unsigned int irq,
 		void (*handler)(int, void *, struct pt_regs *),
 		unsigned long irqflags,
@@ -676,6 +743,24 @@
 	return retval;
 }
 
+/**
+ *	free_irq - free an interrupt
+ *	@irq: Interrupt line to free
+ *	@dev_id: Device identity to free
+ *
+ *	Remove an interrupt handler. The handler is removed and if the
+ *	interrupt line is no longer in use by any driver it is disabled.
+ *	On a shared IRQ the caller must ensure the interrupt is disabled
+ *	on the card it drives before calling this function. The function
+ *	does not return until any executing interrupts for this IRQ
+ *	have completed.
+ *
+ *	This function may be called from interrupt context. 
+ *
+ *	Bugs: Attempting to free an irq in a handler for the same irq hangs
+ *	      the machine.
+ */
+
 void free_irq(unsigned int irq, void *dev_id)
 {
 	irq_desc_t *desc;
@@ -726,6 +811,17 @@
  * with "IRQ_WAITING" cleared and the interrupt
  * disabled.
  */
+
+static DECLARE_MUTEX(probe_sem);
+
+/**
+ *	probe_irq_on	- begin an interrupt autodetect
+ *
+ *	Commence probing for an interrupt. The interrupts are scanned
+ *	and a mask of potential interrupt lines is returned.
+ *
+ */
+
 unsigned long probe_irq_on(void)
 {
 	unsigned int i;
@@ -733,6 +829,7 @@
 	unsigned long val;
 	unsigned long delay;
 
+	down(&probe_sem);
 	/*
 	 * something may have generated an irq long ago and we want to
 	 * flush such a longstanding irq before considering it as spurious.
@@ -799,10 +896,19 @@
 	return val;
 }
 
-/*
- * Return a mask of triggered interrupts (this
- * can handle only legacy ISA interrupts).
+/**
+ *	probe_irq_mask - scan a bitmap of interrupt lines
+ *	@val:	mask of interrupts to consider
+ *
+ *	Scan the ISA bus interrupt lines and return a bitmap of
+ *	active interrupts. The interrupt probe logic state is then
+ *	returned to its previous value.
+ *
+ *	Note: we need to scan all the irq's even though we will
+ *	only return ISA irq numbers - just so that we reset them
+ *	all to a known state.
  */
+
 unsigned int probe_irq_mask(unsigned long val)
 {
 	int i;
@@ -825,14 +931,29 @@
 		}
 		spin_unlock_irq(&desc->lock);
 	}
+	up(&probe_sem);
 
 	return mask & val;
 }
 
-/*
- * Return the one interrupt that triggered (this can
- * handle any interrupt source)
+/**
+ *	probe_irq_off	- end an interrupt autodetect
+ *	@val: mask of potential interrupts (unused)
+ *
+ *	Scans the unused interrupt lines and returns the line which
+ *	appears to have triggered the interrupt. If no interrupt was
+ *	found then zero is returned. If more than one interrupt is
+ *	found then minus the first candidate is returned to indicate
+ *	their is doubt.
+ *
+ *	The interrupt probe logic state is returned to its previous
+ *	value.
+ *
+ *	BUGS: When used in a module (which arguably shouldnt happen)
+ *	nothing prevents two IRQ probe callers from overlapping. The
+ *	results of this are non-optimal.
  */
+
 int probe_irq_off(unsigned long val)
 {
 	int i, irq_found, nr_irqs;
@@ -857,6 +978,7 @@
 		}
 		spin_unlock_irq(&desc->lock);
 	}
+	up(&probe_sem);
 
 	if (nr_irqs > 1)
 		irq_found = -irq_found;
@@ -911,7 +1033,7 @@
 
 	if (!shared) {
 		desc->depth = 0;
-		desc->status &= ~IRQ_DISABLED;
+		desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
 		desc->handler->startup(irq);
 	}
 	spin_unlock_irqrestore(&desc->lock,flags);
@@ -922,20 +1044,9 @@
 
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
-static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
-
-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
 
 #define HEX_DIGITS 8
 
-static int irq_affinity_read_proc (char *page, char **start, off_t off,
-			int count, int *eof, void *data)
-{
-	if (count < HEX_DIGITS+1)
-		return -EINVAL;
-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
-}
-
 static unsigned int parse_hex_value (const char *buffer,
 		unsigned long count, unsigned long *ret)
 {
@@ -973,6 +1084,20 @@
 	return 0;
 }
 
+#if CONFIG_SMP
+
+static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+
+static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
+
+static int irq_affinity_read_proc (char *page, char **start, off_t off,
+			int count, int *eof, void *data)
+{
+	if (count < HEX_DIGITS+1)
+		return -EINVAL;
+	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
+}
+
 static int irq_affinity_write_proc (struct file *file, const char *buffer,
 					unsigned long count, void *data)
 {
@@ -984,7 +1109,6 @@
 
 	err = parse_hex_value(buffer, count, &new_value);
 
-#if CONFIG_SMP
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
 	 * way to make the system unusable accidentally :-) At least
@@ -992,7 +1116,6 @@
 	 */
 	if (!(new_value & cpu_online_map))
 		return -EINVAL;
-#endif
 
 	irq_affinity[irq] = new_value;
 	irq_desc(irq)->handler->set_affinity(irq, new_value);
@@ -1000,6 +1123,8 @@
 	return full_count;
 }
 
+#endif /* CONFIG_SMP */
+
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
@@ -1027,7 +1152,6 @@
 
 static void register_irq_proc (unsigned int irq)
 {
-	struct proc_dir_entry *entry;
 	char name [MAX_NAMELEN];
 
 	if (!root_irq_dir || (irq_desc(irq)->handler == &no_irq_type))
@@ -1039,15 +1163,22 @@
 	/* create /proc/irq/1234 */
 	irq_dir[irq] = proc_mkdir(name, root_irq_dir);
 
-	/* create /proc/irq/1234/smp_affinity */
-	entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
-
-	entry->nlink = 1;
-	entry->data = (void *)(long)irq;
-	entry->read_proc = irq_affinity_read_proc;
-	entry->write_proc = irq_affinity_write_proc;
+#if CONFIG_SMP
+	{
+		struct proc_dir_entry *entry;
+		/* create /proc/irq/1234/smp_affinity */
+		entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
+
+		if (entry) {
+			entry->nlink = 1;
+			entry->data = (void *)(long)irq;
+			entry->read_proc = irq_affinity_read_proc;
+			entry->write_proc = irq_affinity_write_proc;
+		}
 
-	smp_affinity_entry[irq] = entry;
+		smp_affinity_entry[irq] = entry;
+	}
+#endif
 }
 
 unsigned long prof_cpu_mask = -1;
@@ -1062,6 +1193,9 @@
 
 	/* create /proc/irq/prof_cpu_mask */
 	entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir);
+
+	if (!entry)
+		return;
 
 	entry->nlink = 1;
 	entry->data = (void *)&prof_cpu_mask;
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/irq_ia64.c linux/arch/ia64/kernel/irq_ia64.c
--- v2.4.14/linux/arch/ia64/kernel/irq_ia64.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/irq_ia64.c	Fri Nov  9 14:26:17 2001
@@ -1,9 +1,9 @@
 /*
  * linux/arch/ia64/kernel/irq.c
  *
- * Copyright (C) 1998-2000 Hewlett-Packard Co
- * Copyright (C) 1998, 1999 Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 1999-2000 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1998-2001 Hewlett-Packard Co
+ *	Stephane Eranian <eranian@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  *  6/10/99: Updated to bring in sync with x86 version to facilitate
  *	     support for SMP and different interrupt controllers.
@@ -131,6 +131,13 @@
 		ia64_eoi();
 		vector = ia64_get_ivr();
 	}
+	/*
+	 * This must be done *after* the ia64_eoi().  For example, the keyboard softirq
+	 * handler needs to be able to wait for further keyboard interrupts, which can't
+	 * come through until ia64_eoi() has been done.
+	 */
+	if (local_softirq_pending())
+		do_softirq();
 }
 
 #ifdef CONFIG_SMP
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/ivt.S linux/arch/ia64/kernel/ivt.S
--- v2.4.14/linux/arch/ia64/kernel/ivt.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/ivt.S	Fri Nov  9 14:26:17 2001
@@ -2,8 +2,8 @@
  * arch/ia64/kernel/ivt.S
  *
  * Copyright (C) 1998-2001 Hewlett-Packard Co
- * Copyright (C) 1998, 1999 Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 1998-2001 David Mosberger <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
+ *	David Mosberger <davidm@hpl.hp.com>
  *
  * 00/08/23 Asit Mallick <asit.k.mallick@intel.com> TLB handling for SMP
  * 00/12/20 David Mosberger-Tang <davidm@hpl.hp.com> DTLB/ITLB handler now uses virtual PT.
@@ -157,7 +157,7 @@
 	;;
 (p10)	itc.i r18				// insert the instruction TLB entry
 (p11)	itc.d r18				// insert the data TLB entry
-(p6)	br.spnt.many page_fault			// handle bad address/page not present (page fault)
+(p6)	br.cond.spnt.many page_fault		// handle bad address/page not present (page fault)
 	mov cr.ifa=r22
 
 	/*
@@ -213,7 +213,7 @@
 	;;
 	mov b0=r29
 	tbit.z p6,p0=r18,_PAGE_P_BIT		// page present bit cleared?
-(p6)	br.cond.spnt.many page_fault
+(p6)	br.cond.spnt page_fault
 	;;
 	itc.i r18
 	;;
@@ -251,7 +251,7 @@
 	;;
 	mov b0=r29
 	tbit.z p6,p0=r18,_PAGE_P_BIT		// page present bit cleared?
-(p6)	br.cond.spnt.many page_fault
+(p6)	br.cond.spnt page_fault
 	;;
 	itc.d r18
 	;;
@@ -286,7 +286,7 @@
 	;;
 (p8)	mov cr.iha=r17
 (p8)	mov r29=b0				// save b0
-(p8)	br.cond.dptk.many itlb_fault
+(p8)	br.cond.dptk itlb_fault
 #endif
 	extr.u r23=r21,IA64_PSR_CPL0_BIT,2	// extract psr.cpl
 	shr.u r18=r16,57	// move address bit 61 to bit 4
@@ -297,7 +297,7 @@
 	dep r19=r17,r19,0,12	// insert PTE control bits into r19
 	;;
 	or r19=r19,r18		// set bit 4 (uncached) if the access was to region 6
-(p8)	br.cond.spnt.many page_fault
+(p8)	br.cond.spnt page_fault
 	;;
 	itc.i r19		// insert the TLB entry
 	mov pr=r31,-1
@@ -324,7 +324,7 @@
 	;;
 (p8)	mov cr.iha=r17
 (p8)	mov r29=b0				// save b0
-(p8)	br.cond.dptk.many dtlb_fault
+(p8)	br.cond.dptk dtlb_fault
 #endif
 	extr.u r23=r21,IA64_PSR_CPL0_BIT,2	// extract psr.cpl
 	tbit.nz p6,p7=r20,IA64_ISR_SP_BIT	// is speculation bit on?
@@ -333,7 +333,7 @@
 	;;
 	andcm r18=0x10,r18	// bit 4=~address-bit(61)
 	cmp.ne p8,p0=r0,r23
-(p8)	br.cond.spnt.many page_fault
+(p8)	br.cond.spnt page_fault
 
 	dep r21=-1,r21,IA64_PSR_ED_BIT,1
 	dep r19=r17,r19,0,12	// insert PTE control bits into r19
@@ -429,7 +429,7 @@
 	;;
 (p7)	cmp.eq.or.andcm p6,p7=r17,r0		// was L2 entry NULL?
 	dep r17=r19,r17,3,(PAGE_SHIFT-3)	// compute address of L3 page table entry
-(p6)	br.cond.spnt.many page_fault
+(p6)	br.cond.spnt page_fault
 	mov b0=r30
 	br.sptk.many b0				// return to continuation point
 END(nested_dtlb_miss)
@@ -534,15 +534,6 @@
 	;;
 1:	ld8 r18=[r17]
 	;;
-# if defined(CONFIG_IA32_SUPPORT) && defined(CONFIG_ITANIUM_B0_SPECIFIC)
-	/*
-	 * Erratum 85 (Access bit fault could be reported before page not present fault)
-	 *   If the PTE is indicates the page is not present, then just turn this into a
-	 *   page fault.
-	 */
-	tbit.z p6,p0=r18,_PAGE_P_BIT		// page present bit cleared?
-(p6)	br.sptk page_fault			// page wasn't present
-# endif
 	mov ar.ccv=r18				// set compare value for cmpxchg
 	or r25=_PAGE_A,r18			// set the accessed bit
 	;;
@@ -564,15 +555,6 @@
 	;;
 1:	ld8 r18=[r17]
 	;;
-# if defined(CONFIG_IA32_SUPPORT) && defined(CONFIG_ITANIUM_B0_SPECIFIC)
-	/*
-	 * Erratum 85 (Access bit fault could be reported before page not present fault)
-	 *   If the PTE is indicates the page is not present, then just turn this into a
-	 *   page fault.
-	 */
-	tbit.z p6,p0=r18,_PAGE_P_BIT		// page present bit cleared?
-(p6)	br.sptk page_fault			// page wasn't present
-# endif
 	or r18=_PAGE_A,r18			// set the accessed bit
 	mov b0=r29				// restore b0
 	;;
@@ -640,7 +622,7 @@
 	mov r31=pr		// prepare to save predicates
 	;;
 	cmp.eq p0,p7=r16,r17	// is this a system call? (p7 <- false, if so)
-(p7)	br.cond.spnt.many non_syscall
+(p7)	br.cond.spnt non_syscall
 
 	SAVE_MIN				// uses r31; defines r2:
 
@@ -656,7 +638,7 @@
 	adds r3=8,r2		// set up second base pointer for SAVE_REST
 	;;
 	SAVE_REST
-	br.call.sptk rp=demine_args		// clear NaT bits in (potential) syscall args
+	br.call.sptk.many rp=demine_args	// clear NaT bits in (potential) syscall args
 
 	mov r3=255
 	adds r15=-1024,r15			// r15 contains the syscall number---subtract 1024
@@ -698,7 +680,7 @@
 	st8 [r16]=r18				// store new value for cr.isr
 
 (p8)	br.call.sptk.many b6=b6			// ignore this return addr
-	br.cond.sptk.many ia64_trace_syscall
+	br.cond.sptk ia64_trace_syscall
 	// NOT REACHED
 END(break_fault)
 
@@ -811,8 +793,8 @@
 	mov b6=r8
 	;;
 	cmp.ne p6,p0=0,r8
-(p6)	br.call.dpnt b6=b6		// call returns to ia64_leave_kernel
-	br.sptk ia64_leave_kernel
+(p6)	br.call.dpnt.many b6=b6		// call returns to ia64_leave_kernel
+	br.sptk.many ia64_leave_kernel
 END(dispatch_illegal_op_fault)
 
 	.align 1024
@@ -855,30 +837,30 @@
 	adds r15=IA64_PT_REGS_R1_OFFSET + 16,sp
 	;;
 	cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0
-	st8 [r15]=r8		// save orignal EAX in r1 (IA32 procs don't use the GP)
+	st8 [r15]=r8		// save original EAX in r1 (IA32 procs don't use the GP)
 	;;
 	alloc r15=ar.pfs,0,0,6,0	// must first in an insn group
 	;;
-	ld4 r8=[r14],8          // r8 == EAX (syscall number)
-	mov r15=222		// sys_vfork - last implemented system call
+	ld4 r8=[r14],8		// r8 == eax (syscall number)
+	mov r15=230		// number of entries in ia32 system call table
 	;;
-	cmp.leu.unc p6,p7=r8,r15
-	ld4 out1=[r14],8        // r9 == ecx
+	cmp.ltu.unc p6,p7=r8,r15
+	ld4 out1=[r14],8	// r9 == ecx
 	;;
-	ld4 out2=[r14],8         // r10 == edx
+	ld4 out2=[r14],8	// r10 == edx
 	;;
-	ld4 out0=[r14]           // r11 == ebx
+	ld4 out0=[r14]		// r11 == ebx
 	adds r14=(IA64_PT_REGS_R8_OFFSET-(8*3)) + 16,sp
 	;;
-	ld4 out5=[r14],8         // r13 == ebp
+	ld4 out5=[r14],8	// r13 == ebp
 	;;
-	ld4 out3=[r14],8         // r14 == esi
+	ld4 out3=[r14],8	// r14 == esi
 	adds r2=IA64_TASK_PTRACE_OFFSET,r13	// r2 = &current->ptrace
 	;;
-	ld4 out4=[r14]           // R15 == edi
+	ld4 out4=[r14]		// r15 == edi
 	movl r16=ia32_syscall_table
 	;;
-(p6)    shladd r16=r8,3,r16     // Force ni_syscall if not valid syscall number
+(p6)    shladd r16=r8,3,r16	// force ni_syscall if not valid syscall number
 	ld8 r2=[r2]		// r2 = current->ptrace
 	;;
 	ld8 r16=[r16]
@@ -889,12 +871,12 @@
 	;;
 	mov rp=r15
 (p8)	br.call.sptk.many b6=b6
-	br.cond.sptk.many ia32_trace_syscall
+	br.cond.sptk ia32_trace_syscall
 
 non_ia32_syscall:
 	alloc r15=ar.pfs,0,0,2,0
-	mov out0=r14                            // interrupt #
-	add out1=16,sp                          // pointer to pt_regs
+	mov out0=r14				// interrupt #
+	add out1=16,sp				// pointer to pt_regs
 	;;			// avoid WAW on CFM
 	br.call.sptk.many rp=ia32_bad_interrupt
 .ret1:	movl r15=ia64_leave_kernel
@@ -1085,7 +1067,7 @@
 	mov r31=pr
 	;;
 	cmp4.eq p6,p0=0,r16
-(p6)	br.sptk dispatch_illegal_op_fault
+(p6)	br.sptk.many dispatch_illegal_op_fault
 	;;
 	mov r19=24		// fault number
 	br.sptk.many dispatch_to_fault_handler
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/mca.c linux/arch/ia64/kernel/mca.c
--- v2.4.14/linux/arch/ia64/kernel/mca.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/mca.c	Fri Nov  9 14:26:17 2001
@@ -3,12 +3,20 @@
  * Purpose:	Generic MCA handling layer
  *
  * Updated for latest kernel
+ * Copyright (C) 2001 Intel
+ * Copyright (C) Fred Lewis (frederick.v.lewis@intel.com)
+ *
  * Copyright (C) 2000 Intel
  * Copyright (C) Chuck Fleckenstein (cfleck@co.intel.com)
  *
  * Copyright (C) 1999 Silicon Graphics, Inc.
  * Copyright (C) Vijay Chander(vijay@engr.sgi.com)
  *
+ * 01/01/03 F. Lewis    Added setup of CMCI and CPEI IRQs, logging of corrected
+ *                      platform errors, completed code for logging of
+ *                      corrected & uncorrected machine check errors, and
+ *                      updated for conformance with Nov. 2000 revision of the
+ *                      SAL 3.0 spec.
  * 00/03/29 C. Fleckenstein  Fixed PAL/SAL update issues, began MCA bug fixes, logging issues,
  *                           added min save state dump, added INIT handler.
  */
@@ -16,6 +24,7 @@
 #include <linux/types.h>
 #include <linux/init.h>
 #include <linux/sched.h>
+#include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/smp_lock.h>
 
@@ -27,8 +36,10 @@
 #include <asm/mca.h>
 
 #include <asm/irq.h>
-#include <asm/machvec.h>
+#include <asm/hw_irq.h>
+#include <asm/acpi-ext.h>
 
+#undef MCA_PRT_XTRA_DATA
 
 typedef struct ia64_fptr {
 	unsigned long fp;
@@ -38,22 +49,67 @@
 ia64_mc_info_t			ia64_mc_info;
 ia64_mca_sal_to_os_state_t	ia64_sal_to_os_handoff_state;
 ia64_mca_os_to_sal_state_t	ia64_os_to_sal_handoff_state;
-u64				ia64_mca_proc_state_dump[256];
+u64				ia64_mca_proc_state_dump[512];
 u64				ia64_mca_stack[1024];
 u64				ia64_mca_stackframe[32];
 u64				ia64_mca_bspstore[1024];
 u64				ia64_init_stack[INIT_TASK_SIZE] __attribute__((aligned(16)));
 
-static void			ia64_mca_cmc_vector_setup(int		enable,
-							  int_vector_t	cmc_vector);
 static void			ia64_mca_wakeup_ipi_wait(void);
 static void			ia64_mca_wakeup(int cpu);
 static void			ia64_mca_wakeup_all(void);
-static void			ia64_log_init(int,int);
-static void			ia64_log_get(int,int, prfunc_t);
-static void			ia64_log_clear(int,int,int, prfunc_t);
+static void			ia64_log_init(int);
 extern void		        ia64_monarch_init_handler (void);
 extern void		        ia64_slave_init_handler (void);
+extern struct hw_interrupt_type irq_type_iosapic_level;
+
+static struct irqaction cmci_irqaction = {
+	handler:    ia64_mca_cmc_int_handler,
+	flags:      SA_INTERRUPT,
+	name:       "cmc_hndlr"
+};
+
+static struct irqaction mca_rdzv_irqaction = {
+	handler:    ia64_mca_rendez_int_handler,
+	flags:      SA_INTERRUPT,
+	name:       "mca_rdzv"
+};
+
+static struct irqaction mca_wkup_irqaction = {
+	handler:    ia64_mca_wakeup_int_handler,
+	flags:      SA_INTERRUPT,
+	name:       "mca_wkup"
+};
+
+static struct irqaction mca_cpe_irqaction = {
+	handler:    ia64_mca_cpe_int_handler,
+	flags:      SA_INTERRUPT,
+	name:       "cpe_hndlr"
+};
+
+/*
+ *  ia64_mca_log_sal_error_record
+ *
+ *  This function retrieves a specified error record type from SAL, sends it to
+ *  the system log, and notifies SALs to clear the record from its non-volatile
+ *  memory.
+ *
+ *  Inputs  :   sal_info_type   (Type of error record MCA/CMC/CPE/INIT)
+ *  Outputs :   None
+ */
+void
+ia64_mca_log_sal_error_record(int sal_info_type)
+{
+	/* Get the MCA error record */
+	if (!ia64_log_get(sal_info_type, (prfunc_t)printk))
+		return;                 // no record retrieved
+
+	/* Log the error record */
+	ia64_log_print(sal_info_type, (prfunc_t)printk);
+
+	/* Clear the CMC SAL logs now that they have been logged */
+	ia64_sal_clear_state_info(sal_info_type);
+}
 
 /*
  * hack for now, add platform dependent handlers
@@ -67,10 +123,14 @@
 }
 
 void
-cmci_handler_platform (int cmc_irq, void *arg, struct pt_regs *ptregs)
+ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
 {
+	IA64_MCA_DEBUG("ia64_mca_cpe_int_handler: received interrupt. vector = %#x\n", cpe_irq);
 
+	/* Get the CMC error record and log it */
+	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE);
 }
+
 /*
  * This routine will be used to deal with platform specific handling
  * of the init, i.e. drop into the kernel debugger on server machine,
@@ -81,17 +141,72 @@
 init_handler_platform (struct pt_regs *regs)
 {
 	/* if a kernel debugger is available call it here else just dump the registers */
+
 	show_regs(regs);		/* dump the state info */
+	while (1);			/* hang city if no debugger */
 }
 
+/*
+ * ia64_mca_init_platform
+ *
+ *  External entry for platform specific MCA initialization.
+ *
+ *  Inputs
+ *      None
+ *
+ *  Outputs
+ *      None
+ */
 void
-log_print_platform ( void *cur_buff_ptr, prfunc_t prfunc)
+ia64_mca_init_platform (void)
 {
+
 }
 
+/*
+ *  ia64_mca_check_errors
+ *
+ *  External entry to check for error records which may have been posted by SAL
+ *  for a prior failure which resulted in a machine shutdown before an the
+ *  error could be logged.  This function must be called after the filesystem
+ *  is initialized.
+ *
+ *  Inputs  :   None
+ *
+ *  Outputs :   None
+ */
 void
-ia64_mca_init_platform (void)
+ia64_mca_check_errors (void)
+{
+	/*
+	 *  If there is an MCA error record pending, get it and log it.
+	 */
+	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA);
+}
+
+/*
+ * ia64_mca_register_cpev
+ *
+ *  Register the corrected platform error vector with SAL.
+ *
+ *  Inputs
+ *      cpev        Corrected Platform Error Vector number
+ *
+ *  Outputs
+ *      None
+ */
+static void
+ia64_mca_register_cpev (int cpev)
 {
+	/* Register the CPE interrupt vector with SAL */
+	if (ia64_sal_mc_set_params(SAL_MC_PARAM_CPE_INT, SAL_MC_PARAM_MECHANISM_INT, cpev, 0, 0)) {
+		printk("ia64_mca_platform_init: failed to register Corrected "
+		       "Platform Error interrupt vector with SAL.\n");
+		return;
+	}
+
+	IA64_MCA_DEBUG("ia64_mca_platform_init: corrected platform error "
+		       "vector %#x setup and enabled\n", cpev);
 }
 
 #endif /* PLATFORM_MCA_HANDLERS */
@@ -140,30 +255,36 @@
 				     && !ia64_pmss_dump_bank0))
 			printk("\n");
 	}
-	/* hang city for now, until we include debugger or copy to ptregs to show: */
-	while (1);
 }
 
 /*
  * ia64_mca_cmc_vector_setup
- *	Setup the correctable machine check vector register in the processor
+ *
+ *  Setup the corrected machine check vector register in the processor and
+ *  unmask interrupt.  This function is invoked on a per-processor basis.
+ *
  * Inputs
- *	Enable (1 - enable cmc interrupt , 0 - disable)
- *	CMC handler entry point (if enabled)
+ *      None
  *
  * Outputs
  *	None
  */
-static void
-ia64_mca_cmc_vector_setup(int		enable,
-			  int_vector_t	cmc_vector)
+void
+ia64_mca_cmc_vector_setup (void)
 {
 	cmcv_reg_t	cmcv;
 
 	cmcv.cmcv_regval	= 0;
-	cmcv.cmcv_mask	= enable;
-	cmcv.cmcv_vector	= cmc_vector;
+	cmcv.cmcv_mask      = 0;        /* Unmask/enable interrupt */
+	cmcv.cmcv_vector    = IA64_CMC_VECTOR;
 	ia64_set_cmcv(cmcv.cmcv_regval);
+
+	IA64_MCA_DEBUG("ia64_mca_platform_init: CPU %d corrected "
+		       "machine check vector %#x setup and enabled.\n",
+		       smp_processor_id(), IA64_CMC_VECTOR);
+
+	IA64_MCA_DEBUG("ia64_mca_platform_init: CPU %d CMCV = %#016lx\n",
+		       smp_processor_id(), ia64_get_cmcv());
 }
 
 
@@ -174,26 +295,58 @@
 void
 mca_test(void)
 {
-	slpi_buf.slpi_valid.slpi_psi = 1;
-	slpi_buf.slpi_valid.slpi_cache_check = 1;
-	slpi_buf.slpi_valid.slpi_tlb_check = 1;
-	slpi_buf.slpi_valid.slpi_bus_check = 1;
-	slpi_buf.slpi_valid.slpi_minstate = 1;
-	slpi_buf.slpi_valid.slpi_bank1_gr = 1;
-	slpi_buf.slpi_valid.slpi_br = 1;
-	slpi_buf.slpi_valid.slpi_cr = 1;
-	slpi_buf.slpi_valid.slpi_ar = 1;
-	slpi_buf.slpi_valid.slpi_rr = 1;
-	slpi_buf.slpi_valid.slpi_fr = 1;
+	slpi_buf.valid.psi_static_struct = 1;
+	slpi_buf.valid.num_cache_check = 1;
+	slpi_buf.valid.num_tlb_check = 1;
+	slpi_buf.valid.num_bus_check = 1;
+	slpi_buf.valid.processor_static_info.minstate = 1;
+	slpi_buf.valid.processor_static_info.br = 1;
+	slpi_buf.valid.processor_static_info.cr = 1;
+	slpi_buf.valid.processor_static_info.ar = 1;
+	slpi_buf.valid.processor_static_info.rr = 1;
+	slpi_buf.valid.processor_static_info.fr = 1;
 
 	ia64_os_mca_dispatch();
 }
 
 #endif /* #if defined(MCA_TEST) */
 
+
+/*
+ *  verify_guid
+ *
+ *  Compares a test guid to a target guid and returns result.
+ *
+ *  Inputs
+ *      test_guid *     (ptr to guid to be verified)
+ *      target_guid *   (ptr to standard guid to be verified against)
+ *
+ *  Outputs
+ *      0               (test verifies against target)
+ *      non-zero        (test guid does not verify)
+ */
+static int
+verify_guid (efi_guid_t *test, efi_guid_t *target)
+{
+	int     rc;
+
+	if ((rc = memcmp((void *)test, (void *)target, sizeof(efi_guid_t)))) {
+		IA64_MCA_DEBUG("ia64_mca_print: invalid guid = "
+			       "{ %08x, %04x, %04x, { %#02x, %#02x, %#02x, %#02x, "
+			       "%#02x, %#02x, %#02x, %#02x, } } \n ",
+			       test->data1, test->data2, test->data3, test->data4[0],
+			       test->data4[1], test->data4[2], test->data4[3],
+			       test->data4[4], test->data4[5], test->data4[6],
+			       test->data4[7]);
+	}
+
+	return rc;
+}
+
 /*
  * ia64_mca_init
- *	Do all the mca specific initialization on a per-processor basis.
+ *
+ *  Do all the system level mca specific initialization.
  *
  *	1. Register spinloop and wakeup request interrupt vectors
  *
@@ -201,77 +354,80 @@
  *
  *	3. Register OS_INIT handler entry point
  *
- *	4. Initialize CMCV register to enable/disable CMC interrupt on the
- *	   processor and hook a handler in the platform-specific ia64_mca_init.
+ *  4. Initialize MCA/CMC/INIT related log buffers maintained by the OS.
  *
- *	5. Initialize MCA/CMC/INIT related log buffers maintained by the OS.
+ *  Note that this initialization is done very early before some kernel
+ *  services are available.
  *
- * Inputs
- *	None
- * Outputs
- *	None
+ *  Inputs  :   None
+ *
+ *  Outputs :   None
  */
 void __init
 ia64_mca_init(void)
 {
 	ia64_fptr_t *mon_init_ptr = (ia64_fptr_t *)ia64_monarch_init_handler;
 	ia64_fptr_t *slave_init_ptr = (ia64_fptr_t *)ia64_slave_init_handler;
+	ia64_fptr_t *mca_hldlr_ptr = (ia64_fptr_t *)ia64_os_mca_dispatch;
 	int i;
+	s64 rc;
 
-	IA64_MCA_DEBUG("ia64_mca_init : begin\n");
+	IA64_MCA_DEBUG("ia64_mca_init: begin\n");
 
 	/* Clear the Rendez checkin flag for all cpus */
-	for(i = 0 ; i < IA64_MAXCPUS; i++)
+	for(i = 0 ; i < NR_CPUS; i++)
 		ia64_mc_info.imi_rendez_checkin[i] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
 
-	/* NOTE : The actual irqs for the rendez, wakeup and
-	 * cmc interrupts are requested in the platform-specific
-	 * mca initialization code.
-	 */
 	/*
 	 * Register the rendezvous spinloop and wakeup mechanism with SAL
 	 */
 
 	/* Register the rendezvous interrupt vector with SAL */
-	if (ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_INT,
-				   SAL_MC_PARAM_MECHANISM_INT,
-				   IA64_MCA_RENDEZ_VECTOR,
-				   IA64_MCA_RENDEZ_TIMEOUT,
-				   0))
+	if ((rc = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_INT,
+					 SAL_MC_PARAM_MECHANISM_INT,
+					 IA64_MCA_RENDEZ_VECTOR,
+					 IA64_MCA_RENDEZ_TIMEOUT,
+					 0)))
+	{
+		printk("ia64_mca_init: Failed to register rendezvous interrupt "
+		       "with SAL.  rc = %ld\n", rc);
 		return;
+	}
 
 	/* Register the wakeup interrupt vector with SAL */
-	if (ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_WAKEUP,
-				   SAL_MC_PARAM_MECHANISM_INT,
-				   IA64_MCA_WAKEUP_VECTOR,
-				   0,
-				   0))
+	if ((rc = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_WAKEUP,
+					 SAL_MC_PARAM_MECHANISM_INT,
+					 IA64_MCA_WAKEUP_VECTOR,
+					 0, 0)))
+	{
+		printk("ia64_mca_init: Failed to register wakeup interrupt with SAL.  rc = %ld\n",
+		       rc);
 		return;
+	}
 
-	IA64_MCA_DEBUG("ia64_mca_init : registered mca rendezvous spinloop and wakeup mech.\n");
-	/*
-	 * Setup the correctable machine check vector
-	 */
-	ia64_mca_cmc_vector_setup(IA64_CMC_INT_ENABLE, IA64_CMC_VECTOR);
-
-	IA64_MCA_DEBUG("ia64_mca_init : correctable mca vector setup done\n");
+	IA64_MCA_DEBUG("ia64_mca_init: registered mca rendezvous spinloop and wakeup mech.\n");
 
-	ia64_mc_info.imi_mca_handler		= __pa(ia64_os_mca_dispatch);
+	ia64_mc_info.imi_mca_handler        = __pa(mca_hldlr_ptr->fp);
 	/*
 	 * XXX - disable SAL checksum by setting size to 0; should be
 	 *	__pa(ia64_os_mca_dispatch_end) - __pa(ia64_os_mca_dispatch);
 	 */
 	ia64_mc_info.imi_mca_handler_size	= 0;
-	/* Register the os mca handler with SAL */
-	if (ia64_sal_set_vectors(SAL_VECTOR_OS_MCA,
-				 ia64_mc_info.imi_mca_handler,
-				 __pa(ia64_get_gp()),
-				 ia64_mc_info.imi_mca_handler_size,
-				 0,0,0))
 
+	/* Register the os mca handler with SAL */
+	if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_MCA,
+				       ia64_mc_info.imi_mca_handler,
+				       mca_hldlr_ptr->gp,
+				       ia64_mc_info.imi_mca_handler_size,
+				       0, 0, 0)))
+	{
+		printk("ia64_mca_init: Failed to register os mca handler with SAL.  rc = %ld\n",
+		       rc);
 		return;
+	}
 
-	IA64_MCA_DEBUG("ia64_mca_init : registered os mca handler with SAL\n");
+	IA64_MCA_DEBUG("ia64_mca_init: registered os mca handler with SAL at 0x%lx, gp = 0x%lx\n",
+		       ia64_mc_info.imi_mca_handler, mca_hldlr_ptr->gp);
 
 	/*
 	 * XXX - disable SAL checksum by setting size to 0, should be
@@ -282,53 +438,87 @@
 	ia64_mc_info.imi_slave_init_handler		= __pa(slave_init_ptr->fp);
 	ia64_mc_info.imi_slave_init_handler_size	= 0;
 
-	IA64_MCA_DEBUG("ia64_mca_init : os init handler at %lx\n",ia64_mc_info.imi_monarch_init_handler);
+	IA64_MCA_DEBUG("ia64_mca_init: os init handler at %lx\n",
+		       ia64_mc_info.imi_monarch_init_handler);
 
 	/* Register the os init handler with SAL */
-	if (ia64_sal_set_vectors(SAL_VECTOR_OS_INIT,
-				 ia64_mc_info.imi_monarch_init_handler,
-				 __pa(ia64_get_gp()),
-				 ia64_mc_info.imi_monarch_init_handler_size,
-				 ia64_mc_info.imi_slave_init_handler,
-				 __pa(ia64_get_gp()),
-				 ia64_mc_info.imi_slave_init_handler_size))
+	if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_INIT,
+				       ia64_mc_info.imi_monarch_init_handler,
+				       __pa(ia64_get_gp()),
+				       ia64_mc_info.imi_monarch_init_handler_size,
+				       ia64_mc_info.imi_slave_init_handler,
+				       __pa(ia64_get_gp()),
+				       ia64_mc_info.imi_slave_init_handler_size)))
+	{
+		printk("ia64_mca_init: Failed to register m/s init handlers with SAL. rc = %ld\n",
+		       rc);
+		return;
+	}
 
+	IA64_MCA_DEBUG("ia64_mca_init: registered os init handler with SAL\n");
 
-		return;
+	/*
+	 *  Configure the CMCI vector and handler. Interrupts for CMC are
+	 *  per-processor, so AP CMC interrupts are setup in smp_callin() (smp.c).
+	 */
+	register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction);
+	ia64_mca_cmc_vector_setup();       /* Setup vector on BSP & enable */
+
+	/* Setup the MCA rendezvous interrupt vector */
+	register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction);
 
-	IA64_MCA_DEBUG("ia64_mca_init : registered os init handler with SAL\n");
+	/* Setup the MCA wakeup interrupt vector */
+	register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction);
+
+	/* Setup the CPE interrupt vector */
+	{
+		irq_desc_t *desc;
+		unsigned int irq;
+		int cpev = acpi_request_vector(ACPI20_ENTRY_PIS_CPEI);
+
+		if (cpev >= 0) {
+			for (irq = 0; irq < NR_IRQS; ++irq)
+				if (irq_to_vector(irq) == cpev) {
+					desc = irq_desc(irq);
+					desc->status |= IRQ_PER_CPU;
+					desc->handler = &irq_type_iosapic_level;
+					setup_irq(irq, &mca_cpe_irqaction);
+				}
+			ia64_mca_register_cpev(cpev);
+		} else
+			printk("ia64_mca_init: Failed to get routed CPEI vector from ACPI.\n");
+	}
 
 	/* Initialize the areas set aside by the OS to buffer the
 	 * platform/processor error states for MCA/INIT/CMC
 	 * handling.
 	 */
-	ia64_log_init(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PROCESSOR);
-	ia64_log_init(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PLATFORM);
-	ia64_log_init(SAL_INFO_TYPE_INIT, SAL_SUB_INFO_TYPE_PROCESSOR);
-	ia64_log_init(SAL_INFO_TYPE_INIT, SAL_SUB_INFO_TYPE_PLATFORM);
-	ia64_log_init(SAL_INFO_TYPE_CMC, SAL_SUB_INFO_TYPE_PROCESSOR);
-	ia64_log_init(SAL_INFO_TYPE_CMC, SAL_SUB_INFO_TYPE_PLATFORM);
-
-	ia64_mca_init_platform();
-
-	IA64_MCA_DEBUG("ia64_mca_init : platform-specific mca handling setup done\n");
+	ia64_log_init(SAL_INFO_TYPE_MCA);
+	ia64_log_init(SAL_INFO_TYPE_INIT);
+	ia64_log_init(SAL_INFO_TYPE_CMC);
+	ia64_log_init(SAL_INFO_TYPE_CPE);
 
 #if defined(MCA_TEST)
 	mca_test();
 #endif /* #if defined(MCA_TEST) */
 
 	printk("Mca related initialization done\n");
+
+#if 0   // Too early in initialization -- error log is lost
+	/* Do post-failure MCA error logging */
+	ia64_mca_check_errors();
+#endif  // Too early in initialization -- error log is lost
 }
 
 /*
  * ia64_mca_wakeup_ipi_wait
+ *
  *	Wait for the inter-cpu interrupt to be sent by the
  *	monarch processor once it is done with handling the
  *	MCA.
- * Inputs
- *	None
- * Outputs
- *	None
+ *
+ *  Inputs  :   None
+ *  Outputs :   None
  */
 void
 ia64_mca_wakeup_ipi_wait(void)
@@ -339,16 +529,16 @@
 
 	do {
 		switch(irr_num) {
-		case 0:
+		      case 0:
 			irr = ia64_get_irr0();
 			break;
-		case 1:
+		      case 1:
 			irr = ia64_get_irr1();
 			break;
-		case 2:
+		      case 2:
 			irr = ia64_get_irr2();
 			break;
-		case 3:
+		      case 3:
 			irr = ia64_get_irr3();
 			break;
 		}
@@ -357,26 +547,28 @@
 
 /*
  * ia64_mca_wakeup
+ *
  *	Send an inter-cpu interrupt to wake-up a particular cpu
  *	and mark that cpu to be out of rendez.
- * Inputs
- *	cpuid
- * Outputs
- *	None
+ *
+ *  Inputs  :   cpuid
+ *  Outputs :   None
  */
 void
 ia64_mca_wakeup(int cpu)
 {
 	platform_send_ipi(cpu, IA64_MCA_WAKEUP_VECTOR, IA64_IPI_DM_INT, 0);
 	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
+
 }
+
 /*
  * ia64_mca_wakeup_all
+ *
  *	Wakeup all the cpus which have rendez'ed previously.
- * Inputs
- *	None
- * Outputs
- *	None
+ *
+ *  Inputs  :   None
+ *  Outputs :   None
  */
 void
 ia64_mca_wakeup_all(void)
@@ -389,15 +581,16 @@
 			ia64_mca_wakeup(cpu);
 
 }
+
 /*
  * ia64_mca_rendez_interrupt_handler
+ *
  *	This is handler used to put slave processors into spinloop
  *	while the monarch processor does the mca handling and later
  *	wake each slave up once the monarch is done.
- * Inputs
- *	None
- * Outputs
- *	None
+ *
+ *  Inputs  :   None
+ *  Outputs :   None
  */
 void
 ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs)
@@ -423,23 +616,22 @@
 
 	/* Enable all interrupts */
 	restore_flags(flags);
-
-
 }
 
 
 /*
  * ia64_mca_wakeup_int_handler
+ *
  *	The interrupt handler for processing the inter-cpu interrupt to the
  *	slave cpu which was spinning in the rendez loop.
  *	Since this spinning is done by turning off the interrupts and
  *	polling on the wakeup-interrupt bit in the IRR, there is
  *	nothing useful to be done in the handler.
- *  Inputs
- *	wakeup_irq	(Wakeup-interrupt bit)
+ *
+ *  Inputs  :   wakeup_irq  (Wakeup-interrupt bit)
  *	arg		(Interrupt handler specific argument)
  *	ptregs		(Exception frame at the time of the interrupt)
- *  Outputs
+ *  Outputs :   None
  *
  */
 void
@@ -450,16 +642,16 @@
 
 /*
  * ia64_return_to_sal_check
+ *
  *	This is function called before going back from the OS_MCA handler
  *	to the OS_MCA dispatch code which finally takes the control back
  *	to the SAL.
  *	The main purpose of this routine is to setup the OS_MCA to SAL
  *	return state which can be used by the OS_MCA dispatch code
  *	just before going back to SAL.
- * Inputs
- *	None
- * Outputs
- *	None
+ *
+ *  Inputs  :   None
+ *  Outputs :   None
  */
 
 void
@@ -474,11 +666,13 @@
 	ia64_os_to_sal_handoff_state.imots_sal_check_ra =
 		ia64_sal_to_os_handoff_state.imsto_sal_check_ra;
 
-	/* For now ignore the MCA */
-	ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_CORRECTED;
+	/* Cold Boot for uncorrectable MCA */
+	ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_COLD_BOOT;
 }
+
 /*
  * ia64_mca_ucmc_handler
+ *
  *	This is uncorrectable machine check handler called from OS_MCA
  *	dispatch code which is in turn called from SAL_CHECK().
  *	This is the place where the core of OS MCA handling is done.
@@ -487,93 +681,92 @@
  *	monarch processor. Once the  monarch is done with MCA handling
  *	further MCA logging is enabled by clearing logs.
  *	Monarch also has the duty of sending wakeup-IPIs to pull the
- *	slave processors out of rendez. spinloop.
- * Inputs
- *	None
- * Outputs
- *	None
+ *  slave processors out of rendezvous spinloop.
+ *
+ *  Inputs  :   None
+ *  Outputs :   None
  */
 void
 ia64_mca_ucmc_handler(void)
 {
+#if 0   /* stubbed out @FVL */
+	/*
+	 *  Attempting to log a DBE error Causes "reserved register/field panic"
+	 *  in printk.
+	 */
 
-	/* Get the MCA processor log */
-	ia64_log_get(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PROCESSOR, (prfunc_t)printk);
-	/* Get the MCA platform log */
-	ia64_log_get(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PLATFORM, (prfunc_t)printk);
-
-	ia64_log_print(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PROCESSOR, (prfunc_t)printk);
+	/* Get the MCA error record and log it */
+	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA);
+#endif  /* stubbed out @FVL */
 
 	/*
-	 * Do some error handling - Platform-specific mca handler is called at this point
+	 *  Do Platform-specific mca error handling if required.
 	 */
-
 	mca_handler_platform() ;
 
-	/* Clear the SAL MCA logs */
-	ia64_log_clear(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PROCESSOR, 1, printk);
-	ia64_log_clear(SAL_INFO_TYPE_MCA, SAL_SUB_INFO_TYPE_PLATFORM, 1, printk);
-
-	/* Wakeup all the processors which are spinning in the rendezvous
-	 * loop.
+	/*
+	 *  Wakeup all the processors which are spinning in the rendezvous
+	 *  loop.
 	 */
 	ia64_mca_wakeup_all();
+
+	/* Return to SAL */
 	ia64_return_to_sal_check();
 }
 
 /*
  * ia64_mca_cmc_int_handler
- *	This is correctable machine check interrupt handler.
+ *
+ *  This is corrected machine check interrupt handler.
  *	Right now the logs are extracted and displayed in a well-defined
  *	format.
+ *
  * Inputs
- *	None
+ *      interrupt number
+ *      client data arg ptr
+ *      saved registers ptr
+ *
  * Outputs
  *	None
  */
 void
 ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs)
 {
-	/* Get the CMC processor log */
-	ia64_log_get(SAL_INFO_TYPE_CMC, SAL_SUB_INFO_TYPE_PROCESSOR, (prfunc_t)printk);
-	/* Get the CMC platform log */
-	ia64_log_get(SAL_INFO_TYPE_CMC, SAL_SUB_INFO_TYPE_PLATFORM, (prfunc_t)printk);
-
+	IA64_MCA_DEBUG("ia64_mca_cmc_int_handler: received interrupt vector = %#x on CPU %d\n",
+		       cmc_irq, smp_processor_id());
 
-	ia64_log_print(SAL_INFO_TYPE_CMC, SAL_SUB_INFO_TYPE_PROCESSOR, (prfunc_t)printk);
-	cmci_handler_platform(cmc_irq, arg, ptregs);
-
-	/* Clear the CMC SAL logs now that they have been saved in the OS buffer */
-	ia64_sal_clear_state_info(SAL_INFO_TYPE_CMC);
+	/* Get the CMC error record and log it */
+	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC);
 }
 
 /*
  * IA64_MCA log support
  */
 #define IA64_MAX_LOGS		2	/* Double-buffering for nested MCAs */
-#define IA64_MAX_LOG_TYPES	3	/* MCA, CMC, INIT */
-#define IA64_MAX_LOG_SUBTYPES	2	/* Processor, Platform */
+#define IA64_MAX_LOG_TYPES      4   /* MCA, INIT, CMC, CPE */
 
-typedef struct ia64_state_log_s {
+typedef struct ia64_state_log_s
+{
 	spinlock_t	isl_lock;
 	int		isl_index;
-	ia64_psilog_t	isl_log[IA64_MAX_LOGS];	/* need space to store header + error log */
+	ia64_err_rec_t  isl_log[IA64_MAX_LOGS]; /* need space to store header + error log */
 } ia64_state_log_t;
 
-static ia64_state_log_t	ia64_state_log[IA64_MAX_LOG_TYPES][IA64_MAX_LOG_SUBTYPES];
+static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES];
 
-#define IA64_LOG_LOCK_INIT(it, sit)	spin_lock_init(&ia64_state_log[it][sit].isl_lock)
-#define IA64_LOG_LOCK(it, sit)		spin_lock_irqsave(&ia64_state_log[it][sit].isl_lock, s)
-#define IA64_LOG_UNLOCK(it, sit)	spin_unlock_irqrestore(&ia64_state_log[it][sit].isl_lock,\
-							       s)
-#define IA64_LOG_NEXT_INDEX(it, sit)	ia64_state_log[it][sit].isl_index
-#define IA64_LOG_CURR_INDEX(it, sit)	1 - ia64_state_log[it][sit].isl_index
-#define IA64_LOG_INDEX_INC(it, sit)	\
-	ia64_state_log[it][sit].isl_index = 1 - ia64_state_log[it][sit].isl_index
-#define IA64_LOG_INDEX_DEC(it, sit)	\
-	ia64_state_log[it][sit].isl_index = 1 - ia64_state_log[it][sit].isl_index
-#define IA64_LOG_NEXT_BUFFER(it, sit)	(void *)(&(ia64_state_log[it][sit].isl_log[IA64_LOG_NEXT_INDEX(it,sit)]))
-#define IA64_LOG_CURR_BUFFER(it, sit)	(void *)(&(ia64_state_log[it][sit].isl_log[IA64_LOG_CURR_INDEX(it,sit)]))
+/* Note:  Some of these macros assume IA64_MAX_LOGS is always 2.  Should be */
+/* fixed. @FVL                                                              */
+#define IA64_LOG_LOCK_INIT(it) spin_lock_init(&ia64_state_log[it].isl_lock)
+#define IA64_LOG_LOCK(it)      spin_lock_irqsave(&ia64_state_log[it].isl_lock, s)
+#define IA64_LOG_UNLOCK(it)    spin_unlock_irqrestore(&ia64_state_log[it].isl_lock,s)
+#define IA64_LOG_NEXT_INDEX(it)    ia64_state_log[it].isl_index
+#define IA64_LOG_CURR_INDEX(it)    1 - ia64_state_log[it].isl_index
+#define IA64_LOG_INDEX_INC(it) \
+    ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index
+#define IA64_LOG_INDEX_DEC(it) \
+    ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index
+#define IA64_LOG_NEXT_BUFFER(it)   (void *)(&(ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)]))
+#define IA64_LOG_CURR_BUFFER(it)   (void *)(&(ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)]))
 
 /*
  * C portion of the OS INIT handler
@@ -584,123 +777,217 @@
  *
  * Returns:
  *   0 if SAL must warm boot the System
- *   1 if SAL must retrun to interrupted context using PAL_MC_RESUME
+ *   1 if SAL must return to interrupted context using PAL_MC_RESUME
  *
  */
-
 void
 ia64_init_handler (struct pt_regs *regs)
 {
 	sal_log_processor_info_t *proc_ptr;
-	ia64_psilog_t *plog_ptr;
+	ia64_err_rec_t *plog_ptr;
 
 	printk("Entered OS INIT handler\n");
 
 	/* Get the INIT processor log */
-	ia64_log_get(SAL_INFO_TYPE_INIT, SAL_SUB_INFO_TYPE_PROCESSOR, (prfunc_t)printk);
-	/* Get the INIT platform log */
-	ia64_log_get(SAL_INFO_TYPE_INIT, SAL_SUB_INFO_TYPE_PLATFORM, (prfunc_t)printk);
+	if (!ia64_log_get(SAL_INFO_TYPE_INIT, (prfunc_t)printk))
+		return;                 // no record retrieved
 
 #ifdef IA64_DUMP_ALL_PROC_INFO
-	ia64_log_print(SAL_INFO_TYPE_INIT, SAL_SUB_INFO_TYPE_PROCESSOR, (prfunc_t)printk);
+	ia64_log_print(SAL_INFO_TYPE_INIT, (prfunc_t)printk);
 #endif
 
 	/*
 	 * get pointer to min state save area
 	 *
 	 */
-	plog_ptr=(ia64_psilog_t *)IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_INIT,
-						       SAL_SUB_INFO_TYPE_PROCESSOR);
-	proc_ptr = &plog_ptr->devlog.proclog;
+	plog_ptr=(ia64_err_rec_t *)IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_INIT);
+	proc_ptr = &plog_ptr->proc_err;
 
-	ia64_process_min_state_save(&proc_ptr->slpi_min_state_area,regs);
-
-	init_handler_platform(regs);              /* call platform specific routines */
+	ia64_process_min_state_save(&proc_ptr->processor_static_info.min_state_area,
+				    regs);
 
 	/* Clear the INIT SAL logs now that they have been saved in the OS buffer */
 	ia64_sal_clear_state_info(SAL_INFO_TYPE_INIT);
+
+	init_handler_platform(regs);              /* call platform specific routines */
+}
+
+/*
+ *  ia64_log_prt_guid
+ *
+ *  Print a formatted GUID.
+ *
+ * Inputs   :   p_guid      (ptr to the GUID)
+ *              prfunc      (print function)
+ * Outputs  :   None
+ *
+ */
+void
+ia64_log_prt_guid (efi_guid_t *p_guid, prfunc_t prfunc)
+{
+	printk("GUID = { %08x, %04x, %04x, { %#02x, %#02x, %#02x, %#02x, "
+	       "%#02x, %#02x, %#02x, %#02x, } } \n ", p_guid->data1,
+	       p_guid->data2, p_guid->data3, p_guid->data4[0], p_guid->data4[1],
+	       p_guid->data4[2], p_guid->data4[3], p_guid->data4[4],
+	       p_guid->data4[5], p_guid->data4[6], p_guid->data4[7]);
+}
+
+static void
+ia64_log_hexdump(unsigned char *p, unsigned long n_ch, prfunc_t prfunc)
+{
+	int i, j;
+
+	if (!p)
+		return;
+
+	for (i = 0; i < n_ch;) {
+		prfunc("%p ", (void *)p);
+		for (j = 0; (j < 16) && (i < n_ch); i++, j++, p++) {
+			prfunc("%02x ", *p);
+		}
+		prfunc("\n");
+	}
+}
+
+#ifdef MCA_PRT_XTRA_DATA    // for test only @FVL
+
+static void
+ia64_log_prt_record_header (sal_log_record_header_t *rh, prfunc_t prfunc)
+{
+	prfunc("SAL RECORD HEADER:  Record buffer = %p,  header size = %ld\n",
+	       (void *)rh, sizeof(sal_log_record_header_t));
+	ia64_log_hexdump((unsigned char *)rh, sizeof(sal_log_record_header_t),
+			 (prfunc_t)prfunc);
+	prfunc("Total record length = %d\n", rh->len);
+	ia64_log_prt_guid(&rh->platform_guid, prfunc);
+	prfunc("End of SAL RECORD HEADER\n");
+}
+
+static void
+ia64_log_prt_section_header (sal_log_section_hdr_t *sh, prfunc_t prfunc)
+{
+	prfunc("SAL SECTION HEADER:  Record buffer = %p,  header size = %ld\n",
+	       (void *)sh, sizeof(sal_log_section_hdr_t));
+	ia64_log_hexdump((unsigned char *)sh, sizeof(sal_log_section_hdr_t),
+			 (prfunc_t)prfunc);
+	prfunc("Length of section & header = %d\n", sh->len);
+	ia64_log_prt_guid(&sh->guid, prfunc);
+	prfunc("End of SAL SECTION HEADER\n");
 }
+#endif  // MCA_PRT_XTRA_DATA for test only @FVL
 
 /*
  * ia64_log_init
  *	Reset the OS ia64 log buffer
- * Inputs	:	info_type	(SAL_INFO_TYPE_{MCA,INIT,CMC})
- *			sub_info_type	(SAL_SUB_INFO_TYPE_{PROCESSOR,PLATFORM})
+ * Inputs   :   info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
  * Outputs	:	None
  */
 void
-ia64_log_init(int sal_info_type, int sal_sub_info_type)
+ia64_log_init(int sal_info_type)
 {
-	IA64_LOG_LOCK_INIT(sal_info_type, sal_sub_info_type);
-	IA64_LOG_NEXT_INDEX(sal_info_type, sal_sub_info_type) = 0;
-	memset(IA64_LOG_NEXT_BUFFER(sal_info_type, sal_sub_info_type), 0,
-	       sizeof(ia64_psilog_t) * IA64_MAX_LOGS);
+	IA64_LOG_LOCK_INIT(sal_info_type);
+	IA64_LOG_NEXT_INDEX(sal_info_type) = 0;
+	memset(IA64_LOG_NEXT_BUFFER(sal_info_type), 0,
+	       sizeof(ia64_err_rec_t) * IA64_MAX_LOGS);
 }
 
 /*
  * ia64_log_get
+ *
  *	Get the current MCA log from SAL and copy it into the OS log buffer.
- * Inputs	:	info_type	(SAL_INFO_TYPE_{MCA,INIT,CMC})
- *			sub_info_type	(SAL_SUB_INFO_TYPE_{PROCESSOR,PLATFORM})
- * Outputs	:	None
+ *
+ *  Inputs  :   info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
+ *              prfunc      (fn ptr of log output function)
+ *  Outputs :   size        (total record length)
  *
  */
-void
-ia64_log_get(int sal_info_type, int sal_sub_info_type, prfunc_t prfunc)
+u64
+ia64_log_get(int sal_info_type, prfunc_t prfunc)
 {
-	sal_log_header_t	*log_buffer;
-	int			s,total_len=0;
-
-	IA64_LOG_LOCK(sal_info_type, sal_sub_info_type);
+	sal_log_record_header_t     *log_buffer;
+	u64                         total_len = 0;
+	int                         s;
 
+	IA64_LOG_LOCK(sal_info_type);
 
 	/* Get the process state information */
-	log_buffer = IA64_LOG_NEXT_BUFFER(sal_info_type, sal_sub_info_type);
-
-	if (!(total_len=ia64_sal_get_state_info(sal_info_type,(u64 *)log_buffer)))
-		prfunc("ia64_mca_log_get : Getting processor log failed\n");
+	log_buffer = IA64_LOG_NEXT_BUFFER(sal_info_type);
 
-	IA64_MCA_DEBUG("ia64_log_get: retrieved %d bytes of error information\n",total_len);
-
-	IA64_LOG_INDEX_INC(sal_info_type, sal_sub_info_type);
-
-	IA64_LOG_UNLOCK(sal_info_type, sal_sub_info_type);
+	total_len = ia64_sal_get_state_info(sal_info_type, (u64 *)log_buffer);
 
+	if (total_len) {
+		IA64_LOG_INDEX_INC(sal_info_type);
+		IA64_LOG_UNLOCK(sal_info_type);
+		IA64_MCA_DEBUG("ia64_log_get: SAL error record type %d retrieved. "
+			       "Record length = %ld\n", sal_info_type, total_len);
+		return total_len;
+	} else {
+		IA64_LOG_UNLOCK(sal_info_type);
+		prfunc("ia64_log_get: Failed to retrieve SAL error record type %d\n",
+		       sal_info_type);
+		return 0;
+	}
 }
 
 /*
- * ia64_log_clear
- *	Clear the current MCA log from SAL and dpending on the clear_os_buffer flags
- *	clear the OS log buffer also
- * Inputs	:	info_type	(SAL_INFO_TYPE_{MCA,INIT,CMC})
- *			sub_info_type	(SAL_SUB_INFO_TYPE_{PROCESSOR,PLATFORM})
- *			clear_os_buffer
+ *  ia64_log_prt_oem_data
+ *
+ *  Print OEM specific data if included.
+ *
+ * Inputs   :   header_len  (length passed in section header)
+ *              sect_len    (default length of section type)
+ *              p_data      (ptr to data)
  *			prfunc		(print function)
  * Outputs	:	None
  *
  */
 void
-ia64_log_clear(int sal_info_type, int sal_sub_info_type, int clear_os_buffer, prfunc_t prfunc)
+ia64_log_prt_oem_data (int header_len, int sect_len, u8 *p_data, prfunc_t prfunc)
 {
-	if (ia64_sal_clear_state_info(sal_info_type))
-		prfunc("ia64_mca_log_get : Clearing processor log failed\n");
-
-	if (clear_os_buffer) {
-		sal_log_header_t	*log_buffer;
-		int			s;
-
-		IA64_LOG_LOCK(sal_info_type, sal_sub_info_type);
-
-		/* Get the process state information */
-		log_buffer = IA64_LOG_CURR_BUFFER(sal_info_type, sal_sub_info_type);
-
-		memset(log_buffer, 0, sizeof(ia64_psilog_t));
+	int oem_data_len, i;
 
-		IA64_LOG_INDEX_DEC(sal_info_type, sal_sub_info_type);
-
-		IA64_LOG_UNLOCK(sal_info_type, sal_sub_info_type);
+	if ((oem_data_len = header_len - sect_len) > 0) {
+		prfunc(" OEM Specific Data:");
+		for (i = 0; i < oem_data_len; i++, p_data++)
+			prfunc(" %02x", *p_data);
 	}
+	prfunc("\n");
+}
 
+/*
+ *  ia64_log_rec_header_print
+ *
+ *  Log info from the SAL error record header.
+ *
+ *  Inputs  :   lh *    (ptr to SAL log error record header)
+ *              prfunc  (fn ptr of log output function to use)
+ *  Outputs :   None
+ */
+void
+ia64_log_rec_header_print (sal_log_record_header_t *lh, prfunc_t prfunc)
+{
+	char str_buf[32];
+
+	sprintf(str_buf, "%2d.%02d",
+		(lh->revision.major >> 4) * 10 + (lh->revision.major & 0xf),
+		(lh->revision.minor >> 4) * 10 + (lh->revision.minor & 0xf));
+	prfunc("+Err Record ID: %d    SAL Rev: %s\n", lh->id, str_buf);
+	sprintf(str_buf, "%02d/%02d/%04d/ %02d:%02d:%02d",
+		(lh->timestamp.slh_month >> 4) * 10 +
+		(lh->timestamp.slh_month & 0xf),
+		(lh->timestamp.slh_day >> 4) * 10 +
+		(lh->timestamp.slh_day & 0xf),
+		(lh->timestamp.slh_century >> 4) * 1000 +
+		(lh->timestamp.slh_century & 0xf) * 100 +
+		(lh->timestamp.slh_year >> 4) * 10 +
+		(lh->timestamp.slh_year & 0xf),
+		(lh->timestamp.slh_hour >> 4) * 10 +
+		(lh->timestamp.slh_hour & 0xf),
+		(lh->timestamp.slh_minute >> 4) * 10 +
+		(lh->timestamp.slh_minute & 0xf),
+		(lh->timestamp.slh_second >> 4) * 10 +
+		(lh->timestamp.slh_second & 0xf));
+	prfunc("+Time: %s    Severity %d\n", str_buf, lh->severity);
 }
 
 /*
@@ -729,6 +1016,33 @@
 		prfunc("+ %s[%d] 0x%lx\n", reg_prefix, i, regs[i]);
 }
 
+/*
+ * ia64_log_processor_fp_regs_print
+ *  Print the contents of the saved floating page register(s) in the format
+ *      <reg_prefix>[<index>] <value>
+ *
+ * Inputs:  ia64_fpreg  (Register save buffer)
+ *          reg_num     (# of registers)
+ *          reg_class   (application/banked/control/bank1_general)
+ *          reg_prefix  (ar/br/cr/b1_gr)
+ * Outputs: None
+ *
+ */
+void
+ia64_log_processor_fp_regs_print (struct ia64_fpreg *regs,
+                                  int               reg_num,
+                                  char              *reg_class,
+                                  char              *reg_prefix,
+                                  prfunc_t          prfunc)
+{
+	int i;
+
+	prfunc("+%s Registers\n", reg_class);
+	for (i = 0; i < reg_num; i++)
+		prfunc("+ %s[%d] 0x%lx%016lx\n", reg_prefix, i, regs[i].u.bits[1],
+		       regs[i].u.bits[0]);
+}
+
 static char *pal_mesi_state[] = {
 	"Invalid",
 	"Shared",
@@ -754,69 +1068,91 @@
 /*
  * ia64_log_cache_check_info_print
  *	Display the machine check information related to cache error(s).
- * Inputs	:	i		(Multiple errors are logged, i - index of logged error)
- *			info		(Machine check info logged by the PAL and later
+ * Inputs:  i           (Multiple errors are logged, i - index of logged error)
+ *          cc_info *   (Ptr to cache check info logged by the PAL and later
  *					 captured by the SAL)
- *			target_addr	(Address which caused the cache error)
- * Outputs	:	None
+ *          prfunc      (fn ptr of print function to be used for output)
+ * Outputs: None
  */
 void
-ia64_log_cache_check_info_print(int			i,
-				pal_cache_check_info_t	info,
-				u64			target_addr,
-				prfunc_t		prfunc)
+ia64_log_cache_check_info_print (int                      i,
+                                 sal_log_mod_error_info_t *cache_check_info,
+				 prfunc_t		prfunc)
 {
+	pal_cache_check_info_t  *info;
+	u64                     target_addr;
+
+	if (!cache_check_info->valid.check_info) {
+		IA64_MCA_DEBUG("ia64_mca_log_print: invalid cache_check_info[%d]\n",i);
+		return;                 /* If check info data not valid, skip it */
+	}
+
+	info        = (pal_cache_check_info_t *)&cache_check_info->check_info;
+	target_addr = cache_check_info->target_identifier;
+
 	prfunc("+ Cache check info[%d]\n+", i);
-	prfunc("  Level: L%d",info.level);
-	if (info.mv)
-		prfunc(" ,Mesi: %s",pal_mesi_state[info.mesi]);
-	prfunc(" ,Index: %d,", info.index);
-	if (info.ic)
-		prfunc(" ,Cache: Instruction");
-	if (info.dc)
-		prfunc(" ,Cache: Data");
-	if (info.tl)
-		prfunc(" ,Line: Tag");
-	if (info.dl)
-		prfunc(" ,Line: Data");
-	prfunc(" ,Operation: %s,", pal_cache_op[info.op]);
-	if (info.wv)
-		prfunc(" ,Way: %d,", info.way);
-	if (info.tv)
-		prfunc(" ,Target Addr: 0x%lx", target_addr);
-	if (info.mc)
-		prfunc(" ,MC: Corrected");
+	prfunc("  Level: L%d,",info->level);
+	if (info->mv)
+		prfunc(" Mesi: %s,",pal_mesi_state[info->mesi]);
+	prfunc(" Index: %d,", info->index);
+	if (info->ic)
+		prfunc(" Cache: Instruction,");
+	if (info->dc)
+		prfunc(" Cache: Data,");
+	if (info->tl)
+		prfunc(" Line: Tag,");
+	if (info->dl)
+		prfunc(" Line: Data,");
+	prfunc(" Operation: %s,", pal_cache_op[info->op]);
+	if (info->wv)
+		prfunc(" Way: %d,", info->way);
+	if (cache_check_info->valid.target_identifier)
+		/* Hope target address is saved in target_identifier */
+		if (info->tv)
+			prfunc(" Target Addr: 0x%lx,", target_addr);
+	if (info->mc)
+		prfunc(" MC: Corrected");
 	prfunc("\n");
 }
 
 /*
  * ia64_log_tlb_check_info_print
  *	Display the machine check information related to tlb error(s).
- * Inputs	:	i		(Multiple errors are logged, i - index of logged error)
- *			info		(Machine check info logged by the PAL and later
+ * Inputs:  i           (Multiple errors are logged, i - index of logged error)
+ *          tlb_info *  (Ptr to machine check info logged by the PAL and later
  *					 captured by the SAL)
- * Outputs	:	None
+ *          prfunc      (fn ptr of print function to be used for output)
+ * Outputs: None
  */
-
 void
-ia64_log_tlb_check_info_print(int			i,
-			      pal_tlb_check_info_t	info,
-			      prfunc_t			prfunc)
+ia64_log_tlb_check_info_print (int                      i,
+                               sal_log_mod_error_info_t *tlb_check_info,
+                               prfunc_t                 prfunc)
+
 {
+	pal_tlb_check_info_t    *info;
+
+	if (!tlb_check_info->valid.check_info) {
+		IA64_MCA_DEBUG("ia64_mca_log_print: invalid tlb_check_info[%d]\n", i);
+		return;                 /* If check info data not valid, skip it */
+	}
+
+	info = (pal_tlb_check_info_t *)&tlb_check_info->check_info;
+
 	prfunc("+ TLB Check Info [%d]\n+", i);
-	if (info.itc)
+	if (info->itc)
 		prfunc("  Failure: Instruction Translation Cache");
-	if (info.dtc)
+	if (info->dtc)
 		prfunc("  Failure: Data Translation Cache");
-	if (info.itr) {
+	if (info->itr) {
 		prfunc("  Failure: Instruction Translation Register");
-		prfunc(" ,Slot: %d", info.tr_slot);
+		prfunc(" ,Slot: %d", info->tr_slot);
 	}
-	if (info.dtr) {
+	if (info->dtr) {
 		prfunc("  Failure: Data Translation Register");
-		prfunc(" ,Slot: %d", info.tr_slot);
+		prfunc(" ,Slot: %d", info->tr_slot);
 	}
-	if (info.mc)
+	if (info->mc)
 		prfunc(" ,MC: Corrected");
 	prfunc("\n");
 }
@@ -824,159 +1160,721 @@
 /*
  * ia64_log_bus_check_info_print
  *	Display the machine check information related to bus error(s).
- * Inputs	:	i		(Multiple errors are logged, i - index of logged error)
- *			info		(Machine check info logged by the PAL and later
+ * Inputs:  i           (Multiple errors are logged, i - index of logged error)
+ *          bus_info *  (Ptr to machine check info logged by the PAL and later
  *					 captured by the SAL)
- *			req_addr	(Address of the requestor of the transaction)
- *			resp_addr	(Address of the responder of the transaction)
- *			target_addr	(Address where the data was to be delivered to  or
- *					 obtained from)
- * Outputs	:	None
+ *          prfunc      (fn ptr of print function to be used for output)
+ * Outputs: None
  */
 void
-ia64_log_bus_check_info_print(int			i,
-			      pal_bus_check_info_t	info,
-			      u64			req_addr,
-			      u64			resp_addr,
-			      u64			targ_addr,
-			      prfunc_t			prfunc)
-{
+ia64_log_bus_check_info_print (int                      i,
+                               sal_log_mod_error_info_t *bus_check_info,
+                               prfunc_t                 prfunc)
+{
+	pal_bus_check_info_t *info;
+	u64         req_addr;   /* Address of the requestor of the transaction */
+	u64         resp_addr;  /* Address of the responder of the transaction */
+	u64         targ_addr;  /* Address where the data was to be delivered to */
+	/* or obtained from */
+
+	if (!bus_check_info->valid.check_info) {
+		IA64_MCA_DEBUG("ia64_mca_log_print: invalid bus_check_info[%d]\n", i);
+		return;                 /* If check info data not valid, skip it */
+	}
+
+	info      = (pal_bus_check_info_t *)&bus_check_info->check_info;
+	req_addr  = bus_check_info->requestor_identifier;
+	resp_addr = bus_check_info->responder_identifier;
+	targ_addr = bus_check_info->target_identifier;
+
 	prfunc("+ BUS Check Info [%d]\n+", i);
-	prfunc(" Status Info: %d", info.bsi);
-	prfunc(" ,Severity: %d", info.sev);
-	prfunc(" ,Transaction Type: %d", info.type);
-	prfunc(" ,Transaction Size: %d", info.size);
-	if (info.cc)
+	prfunc(" Status Info: %d", info->bsi);
+	prfunc(" ,Severity: %d", info->sev);
+	prfunc(" ,Transaction Type: %d", info->type);
+	prfunc(" ,Transaction Size: %d", info->size);
+	if (info->cc)
 		prfunc(" ,Cache-cache-transfer");
-	if (info.ib)
+	if (info->ib)
 		prfunc(" ,Error: Internal");
-	if (info.eb)
+	if (info->eb)
 		prfunc(" ,Error: External");
-	if (info.mc)
+	if (info->mc)
 		prfunc(" ,MC: Corrected");
-	if (info.tv)
+	if (info->tv)
 		prfunc(" ,Target Address: 0x%lx", targ_addr);
-	if (info.rq)
+	if (info->rq)
 		prfunc(" ,Requestor Address: 0x%lx", req_addr);
-	if (info.tv)
+	if (info->tv)
 		prfunc(" ,Responder Address: 0x%lx", resp_addr);
 	prfunc("\n");
 }
 
 /*
+ *  ia64_log_mem_dev_err_info_print
+ *
+ *  Format and log the platform memory device error record section data.
+ *
+ *  Inputs:  mem_dev_err_info * (Ptr to memory device error record section
+ *                               returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_mem_dev_err_info_print (sal_log_mem_dev_err_info_t *mdei,
+                                 prfunc_t                   prfunc)
+{
+	prfunc("+ Mem Error Detail: ");
+
+	if (mdei->valid.error_status)
+		prfunc(" Error Status: %#lx,", mdei->error_status);
+	if (mdei->valid.physical_addr)
+		prfunc(" Physical Address: %#lx,", mdei->physical_addr);
+	if (mdei->valid.addr_mask)
+		prfunc(" Address Mask: %#lx,", mdei->addr_mask);
+	if (mdei->valid.node)
+		prfunc(" Node: %d,", mdei->node);
+	if (mdei->valid.card)
+		prfunc(" Card: %d,", mdei->card);
+	if (mdei->valid.module)
+		prfunc(" Module: %d,", mdei->module);
+	if (mdei->valid.bank)
+		prfunc(" Bank: %d,", mdei->bank);
+	if (mdei->valid.device)
+		prfunc(" Device: %d,", mdei->device);
+	if (mdei->valid.row)
+		prfunc(" Row: %d,", mdei->row);
+	if (mdei->valid.column)
+		prfunc(" Column: %d,", mdei->column);
+	if (mdei->valid.bit_position)
+		prfunc(" Bit Position: %d,", mdei->bit_position);
+	if (mdei->valid.target_id)
+		prfunc(" ,Target Address: %#lx,", mdei->target_id);
+	if (mdei->valid.requestor_id)
+		prfunc(" ,Requestor Address: %#lx,", mdei->requestor_id);
+	if (mdei->valid.responder_id)
+		prfunc(" ,Responder Address: %#lx,", mdei->responder_id);
+	if (mdei->valid.bus_spec_data)
+		prfunc(" Bus Specific Data: %#lx,", mdei->bus_spec_data);
+	prfunc("\n");
+
+	if (mdei->valid.oem_id) {
+		u8  *p_data = &(mdei->oem_id[0]);
+		int i;
+
+		prfunc(" OEM Memory Controller ID:");
+		for (i = 0; i < 16; i++, p_data++)
+			prfunc(" %02x", *p_data);
+		prfunc("\n");
+	}
+
+	if (mdei->valid.oem_data) {
+		ia64_log_prt_oem_data((int)mdei->header.len,
+				      (int)sizeof(sal_log_mem_dev_err_info_t) - 1,
+				      &(mdei->oem_data[0]), prfunc);
+	}
+}
+
+/*
+ *  ia64_log_sel_dev_err_info_print
+ *
+ *  Format and log the platform SEL device error record section data.
+ *
+ *  Inputs:  sel_dev_err_info * (Ptr to the SEL device error record section
+ *                               returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_sel_dev_err_info_print (sal_log_sel_dev_err_info_t *sdei,
+                                 prfunc_t                   prfunc)
+{
+	int     i;
+
+	prfunc("+ SEL Device Error Detail: ");
+
+	if (sdei->valid.record_id)
+		prfunc(" Record ID: %#x", sdei->record_id);
+	if (sdei->valid.record_type)
+		prfunc(" Record Type: %#x", sdei->record_type);
+	prfunc(" Time Stamp: ");
+	for (i = 0; i < 4; i++)
+		prfunc("%1d", sdei->timestamp[i]);
+	if (sdei->valid.generator_id)
+		prfunc(" Generator ID: %#x", sdei->generator_id);
+	if (sdei->valid.evm_rev)
+		prfunc(" Message Format Version: %#x", sdei->evm_rev);
+	if (sdei->valid.sensor_type)
+		prfunc(" Sensor Type: %#x", sdei->sensor_type);
+	if (sdei->valid.sensor_num)
+		prfunc(" Sensor Number: %#x", sdei->sensor_num);
+	if (sdei->valid.event_dir)
+		prfunc(" Event Direction Type: %#x", sdei->event_dir);
+	if (sdei->valid.event_data1)
+		prfunc(" Data1: %#x", sdei->event_data1);
+	if (sdei->valid.event_data2)
+		prfunc(" Data2: %#x", sdei->event_data2);
+	if (sdei->valid.event_data3)
+		prfunc(" Data3: %#x", sdei->event_data3);
+	prfunc("\n");
+
+}
+
+/*
+ *  ia64_log_pci_bus_err_info_print
+ *
+ *  Format and log the platform PCI bus error record section data.
+ *
+ *  Inputs:  pci_bus_err_info * (Ptr to the PCI bus error record section
+ *                               returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_pci_bus_err_info_print (sal_log_pci_bus_err_info_t *pbei,
+                                 prfunc_t                   prfunc)
+{
+	prfunc("+ PCI Bus Error Detail: ");
+
+	if (pbei->valid.err_status)
+		prfunc(" Error Status: %#lx", pbei->err_status);
+	if (pbei->valid.err_type)
+		prfunc(" Error Type: %#x", pbei->err_type);
+	if (pbei->valid.bus_id)
+		prfunc(" Bus ID: %#x", pbei->bus_id);
+	if (pbei->valid.bus_address)
+		prfunc(" Bus Address: %#lx", pbei->bus_address);
+	if (pbei->valid.bus_data)
+		prfunc(" Bus Data: %#lx", pbei->bus_data);
+	if (pbei->valid.bus_cmd)
+		prfunc(" Bus Command: %#lx", pbei->bus_cmd);
+	if (pbei->valid.requestor_id)
+		prfunc(" Requestor ID: %#lx", pbei->requestor_id);
+	if (pbei->valid.responder_id)
+		prfunc(" Responder ID: %#lx", pbei->responder_id);
+	if (pbei->valid.target_id)
+		prfunc(" Target ID: %#lx", pbei->target_id);
+	if (pbei->valid.oem_data)
+		prfunc("\n");
+
+	if (pbei->valid.oem_data) {
+		ia64_log_prt_oem_data((int)pbei->header.len,
+				      (int)sizeof(sal_log_pci_bus_err_info_t) - 1,
+				      &(pbei->oem_data[0]), prfunc);
+	}
+}
+
+/*
+ *  ia64_log_smbios_dev_err_info_print
+ *
+ *  Format and log the platform SMBIOS device error record section data.
+ *
+ *  Inputs:  smbios_dev_err_info * (Ptr to the SMBIOS device error record
+ *                                  section returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_smbios_dev_err_info_print (sal_log_smbios_dev_err_info_t *sdei,
+                                    prfunc_t                      prfunc)
+{
+	u8      i;
+
+	prfunc("+ SMBIOS Device Error Detail: ");
+
+	if (sdei->valid.event_type)
+		prfunc(" Event Type: %#x", sdei->event_type);
+	if (sdei->valid.time_stamp) {
+		prfunc(" Time Stamp: ");
+		for (i = 0; i < 6; i++)
+			prfunc("%d", sdei->time_stamp[i]);
+	}
+	if ((sdei->valid.data) && (sdei->valid.length)) {
+		prfunc(" Data: ");
+		for (i = 0; i < sdei->length; i++)
+			prfunc(" %02x", sdei->data[i]);
+	}
+	prfunc("\n");
+}
+
+/*
+ *  ia64_log_pci_comp_err_info_print
+ *
+ *  Format and log the platform PCI component error record section data.
+ *
+ *  Inputs:  pci_comp_err_info * (Ptr to the PCI component error record section
+ *                                returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_pci_comp_err_info_print(sal_log_pci_comp_err_info_t *pcei,
+				 prfunc_t                     prfunc)
+{
+	u32     n_mem_regs, n_io_regs;
+	u64     i, n_pci_data;
+	u64     *p_reg_data;
+	u8      *p_oem_data;
+
+	prfunc("+ PCI Component Error Detail: ");
+
+	if (pcei->valid.err_status)
+		prfunc(" Error Status: %#lx\n", pcei->err_status);
+	if (pcei->valid.comp_info)
+		prfunc(" Component Info: Vendor Id = %#x, Device Id = %#x,"
+		       " Class Code = %#x, Seg/Bus/Dev/Func = %d/%d/%d/%d\n",
+		       pcei->comp_info.vendor_id, pcei->comp_info.device_id,
+		       pcei->comp_info.class_code, pcei->comp_info.seg_num,
+		       pcei->comp_info.bus_num, pcei->comp_info.dev_num,
+		       pcei->comp_info.func_num);
+
+	n_mem_regs = (pcei->valid.num_mem_regs) ? pcei->num_mem_regs : 0;
+	n_io_regs =  (pcei->valid.num_io_regs)  ? pcei->num_io_regs  : 0;
+	p_reg_data = &(pcei->reg_data_pairs[0]);
+	p_oem_data = (u8 *)p_reg_data +
+		(n_mem_regs + n_io_regs) * 2 * sizeof(u64);
+	n_pci_data = p_oem_data - (u8 *)pcei;
+
+	if (n_pci_data > pcei->header.len) {
+		prfunc(" Invalid PCI Component Error Record format: length = %ld, "
+		       " Size PCI Data = %d, Num Mem-Map/IO-Map Regs = %ld/%ld\n",
+		       pcei->header.len, n_pci_data, n_mem_regs, n_io_regs);
+		return;
+	}
+
+	if (n_mem_regs) {
+		prfunc(" Memory Mapped Registers\n Address \tValue\n");
+		for (i = 0; i < pcei->num_mem_regs; i++) {
+			prfunc(" %#lx %#lx\n", p_reg_data[0], p_reg_data[1]);
+			p_reg_data += 2;
+		}
+	}
+	if (n_io_regs) {
+		prfunc(" I/O Mapped Registers\n Address \tValue\n");
+		for (i = 0; i < pcei->num_io_regs; i++) {
+			prfunc(" %#lx %#lx\n", p_reg_data[0], p_reg_data[1]);
+			p_reg_data += 2;
+		}
+	}
+	if (pcei->valid.oem_data) {
+		ia64_log_prt_oem_data((int)pcei->header.len, n_pci_data,
+				      p_oem_data, prfunc);
+		prfunc("\n");
+	}
+}
+
+/*
+ *  ia64_log_plat_specific_err_info_print
+ *
+ *  Format and log the platform specifie error record section data.
+ *
+ *  Inputs:  sel_dev_err_info * (Ptr to the platform specific error record
+ *                               section returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_plat_specific_err_info_print (sal_log_plat_specific_err_info_t *psei,
+                                       prfunc_t                         prfunc)
+{
+	prfunc("+ Platform Specific Error Detail: ");
+
+	if (psei->valid.err_status)
+		prfunc(" Error Status: %#lx", psei->err_status);
+	if (psei->valid.guid) {
+		prfunc(" GUID: ");
+		ia64_log_prt_guid(&psei->guid, prfunc);
+	}
+	if (psei->valid.oem_data) {
+		ia64_log_prt_oem_data((int)psei->header.len,
+				      (int)sizeof(sal_log_plat_specific_err_info_t) - 1,
+				      &(psei->oem_data[0]), prfunc);
+	}
+	prfunc("\n");
+}
+
+/*
+ *  ia64_log_host_ctlr_err_info_print
+ *
+ *  Format and log the platform host controller error record section data.
+ *
+ *  Inputs:  host_ctlr_err_info * (Ptr to the host controller error record
+ *                                 section returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_host_ctlr_err_info_print (sal_log_host_ctlr_err_info_t *hcei,
+                                   prfunc_t                     prfunc)
+{
+	prfunc("+ Host Controller Error Detail: ");
+
+	if (hcei->valid.err_status)
+		prfunc(" Error Status: %#lx", hcei->err_status);
+	if (hcei->valid.requestor_id)
+		prfunc(" Requestor ID: %#lx", hcei->requestor_id);
+	if (hcei->valid.responder_id)
+		prfunc(" Responder ID: %#lx", hcei->responder_id);
+	if (hcei->valid.target_id)
+		prfunc(" Target ID: %#lx", hcei->target_id);
+	if (hcei->valid.bus_spec_data)
+		prfunc(" Bus Specific Data: %#lx", hcei->bus_spec_data);
+	if (hcei->valid.oem_data) {
+		ia64_log_prt_oem_data((int)hcei->header.len,
+				      (int)sizeof(sal_log_host_ctlr_err_info_t) - 1,
+				      &(hcei->oem_data[0]), prfunc);
+	}
+	prfunc("\n");
+}
+
+/*
+ *  ia64_log_plat_bus_err_info_print
+ *
+ *  Format and log the platform bus error record section data.
+ *
+ *  Inputs:  plat_bus_err_info * (Ptr to the platform bus error record section
+ *                                returned by SAL)
+ *           prfunc             (fn ptr of print function to be used for output)
+ *  Outputs: None
+ */
+void
+ia64_log_plat_bus_err_info_print (sal_log_plat_bus_err_info_t *pbei,
+                                  prfunc_t                    prfunc)
+{
+	prfunc("+ Platform Bus Error Detail: ");
+
+	if (pbei->valid.err_status)
+		prfunc(" Error Status: %#lx", pbei->err_status);
+	if (pbei->valid.requestor_id)
+		prfunc(" Requestor ID: %#lx", pbei->requestor_id);
+	if (pbei->valid.responder_id)
+		prfunc(" Responder ID: %#lx", pbei->responder_id);
+	if (pbei->valid.target_id)
+		prfunc(" Target ID: %#lx", pbei->target_id);
+	if (pbei->valid.bus_spec_data)
+		prfunc(" Bus Specific Data: %#lx", pbei->bus_spec_data);
+	if (pbei->valid.oem_data) {
+		ia64_log_prt_oem_data((int)pbei->header.len,
+				      (int)sizeof(sal_log_plat_bus_err_info_t) - 1,
+				      &(pbei->oem_data[0]), prfunc);
+	}
+	prfunc("\n");
+}
+
+/*
+ *  ia64_log_proc_dev_err_info_print
+ *
+ *  Display the processor device error record.
+ *
+ *  Inputs:  sal_log_processor_info_t * (Ptr to processor device error record
+ *                                       section body).
+ *           prfunc                     (fn ptr of print function to be used
+ *                                       for output).
+ *  Outputs: None
+ */
+void
+ia64_log_proc_dev_err_info_print (sal_log_processor_info_t  *slpi,
+                                  prfunc_t                  prfunc)
+{
+#ifdef MCA_PRT_XTRA_DATA
+	size_t  d_len = slpi->header.len - sizeof(sal_log_section_hdr_t);
+#endif
+	sal_processor_static_info_t *spsi;
+	int                         i;
+	sal_log_mod_error_info_t    *p_data;
+
+	prfunc("+Processor Device Error Info Section\n");
+
+#ifdef MCA_PRT_XTRA_DATA    // for test only @FVL
+	{
+		char    *p_data = (char *)&slpi->valid;
+
+		prfunc("SAL_PROC_DEV_ERR SECTION DATA:  Data buffer = %p, "
+		       "Data size = %ld\n", (void *)p_data, d_len);
+		ia64_log_hexdump(p_data, d_len, prfunc);
+		prfunc("End of SAL_PROC_DEV_ERR SECTION DATA\n");
+	}
+#endif  // MCA_PRT_XTRA_DATA for test only @FVL
+
+	if (slpi->valid.proc_error_map)
+		prfunc(" Processor Error Map: %#lx\n", slpi->proc_error_map);
+
+	if (slpi->valid.proc_state_param)
+		prfunc(" Processor State Param: %#lx\n", slpi->proc_state_parameter);
+
+	if (slpi->valid.proc_cr_lid)
+		prfunc(" Processor LID: %#lx\n", slpi->proc_cr_lid);
+
+	/*
+	 *  Note: March 2001 SAL spec states that if the number of elements in any
+	 *  of  the MOD_ERROR_INFO_STRUCT arrays is zero, the entire array is
+	 *  absent. Also, current implementations only allocate space for number of
+	 *  elements used.  So we walk the data pointer from here on.
+	 */
+	p_data = &slpi->cache_check_info[0];
+
+	/* Print the cache check information if any*/
+	for (i = 0 ; i < slpi->valid.num_cache_check; i++, p_data++)
+		ia64_log_cache_check_info_print(i, p_data, prfunc);
+
+	/* Print the tlb check information if any*/
+	for (i = 0 ; i < slpi->valid.num_tlb_check; i++, p_data++)
+		ia64_log_tlb_check_info_print(i, p_data, prfunc);
+
+	/* Print the bus check information if any*/
+	for (i = 0 ; i < slpi->valid.num_bus_check; i++, p_data++)
+		ia64_log_bus_check_info_print(i, p_data, prfunc);
+
+	/* Print the reg file check information if any*/
+	for (i = 0 ; i < slpi->valid.num_reg_file_check; i++, p_data++)
+		ia64_log_hexdump((u8 *)p_data, sizeof(sal_log_mod_error_info_t),
+				 prfunc);    /* Just hex dump for now */
+
+	/* Print the ms check information if any*/
+	for (i = 0 ; i < slpi->valid.num_ms_check; i++, p_data++)
+		ia64_log_hexdump((u8 *)p_data, sizeof(sal_log_mod_error_info_t),
+				 prfunc);    /* Just hex dump for now */
+
+	/* Print CPUID registers if any*/
+	if (slpi->valid.cpuid_info) {
+		u64     *p = (u64 *)p_data;
+
+		prfunc(" CPUID Regs: %#lx %#lx %#lx %#lx\n", p[0], p[1], p[2], p[3]);
+		p_data++;
+	}
+
+	/* Print processor static info if any */
+	if (slpi->valid.psi_static_struct) {
+		spsi = (sal_processor_static_info_t *)p_data;
+
+		/* Print branch register contents if valid */
+		if (spsi->valid.br)
+			ia64_log_processor_regs_print(spsi->br, 8, "Branch", "br",
+						      prfunc);
+
+		/* Print control register contents if valid */
+		if (spsi->valid.cr)
+			ia64_log_processor_regs_print(spsi->cr, 128, "Control", "cr",
+						      prfunc);
+
+		/* Print application register contents if valid */
+		if (spsi->valid.ar)
+			ia64_log_processor_regs_print(spsi->ar, 128, "Application",
+						      "ar", prfunc);
+
+		/* Print region register contents if valid */
+		if (spsi->valid.rr)
+			ia64_log_processor_regs_print(spsi->rr, 8, "Region", "rr",
+						      prfunc);
+
+		/* Print floating-point register contents if valid */
+		if (spsi->valid.fr)
+			ia64_log_processor_fp_regs_print(spsi->fr, 128, "Floating-point", "fr",
+							 prfunc);
+	}
+}
+
+/*
  * ia64_log_processor_info_print
+ *
  *	Display the processor-specific information logged by PAL as a part
  *	of MCA or INIT or CMC.
- * Inputs	:	lh	(Pointer of the sal log header which specifies the format
- *				 of SAL state info as specified by the SAL spec).
+ *
+ *  Inputs   :  lh      (Pointer of the sal log header which specifies the
+ *                       format of SAL state info as specified by the SAL spec).
+ *              prfunc  (fn ptr of print function to be used for output).
  * Outputs	:	None
  */
 void
-ia64_log_processor_info_print(sal_log_header_t *lh, prfunc_t prfunc)
+ia64_log_processor_info_print(sal_log_record_header_t *lh, prfunc_t prfunc)
 {
-	sal_log_processor_info_t	*slpi;
-	int				i;
+	sal_log_section_hdr_t       *slsh;
+	int                         n_sects;
+	int                         ercd_pos;
 
 	if (!lh)
 		return;
 
-	if (lh->slh_log_type != SAL_SUB_INFO_TYPE_PROCESSOR)
+#ifdef MCA_PRT_XTRA_DATA    // for test only @FVL
+	ia64_log_prt_record_header(lh, prfunc);
+#endif  // MCA_PRT_XTRA_DATA for test only @FVL
+
+	if ((ercd_pos = sizeof(sal_log_record_header_t)) >= lh->len) {
+		IA64_MCA_DEBUG("ia64_mca_log_print: "
+			       "truncated SAL CMC error record. len = %d\n",
+			       lh->len);
 		return;
+	}
 
-	slpi = (sal_log_processor_info_t *)((char *)lh+sizeof(sal_log_header_t));  /* point to proc info */
+	/* Print record header info */
+	ia64_log_rec_header_print(lh, prfunc);
 
-	if (!slpi) {
-		prfunc("No Processor Error Log found\n");
-		return;
+	for (n_sects = 0; (ercd_pos < lh->len); n_sects++, ercd_pos += slsh->len) {
+		/* point to next section header */
+		slsh = (sal_log_section_hdr_t *)((char *)lh + ercd_pos);
+
+#ifdef MCA_PRT_XTRA_DATA    // for test only @FVL
+		ia64_log_prt_section_header(slsh, prfunc);
+#endif  // MCA_PRT_XTRA_DATA for test only @FVL
+
+		if (verify_guid((void *)&slsh->guid, (void *)&(SAL_PROC_DEV_ERR_SECT_GUID))) {
+			IA64_MCA_DEBUG("ia64_mca_log_print: unsupported record section\n");
+			continue;
+		}
+
+		/*
+		 *  Now process processor device error record section
+		 */
+		ia64_log_proc_dev_err_info_print((sal_log_processor_info_t *)slsh,
+						 printk);
 	}
 
-	/* Print branch register contents if valid */
-	if (slpi->slpi_valid.slpi_br)
-		ia64_log_processor_regs_print(slpi->slpi_br, 8, "Branch", "br", prfunc);
+	IA64_MCA_DEBUG("ia64_mca_log_print: "
+		       "found %d sections in SAL CMC error record. len = %d\n",
+		       n_sects, lh->len);
+	if (!n_sects) {
+		prfunc("No Processor Device Error Info Section found\n");
+		return;
+	}
+}
 
-	/* Print control register contents if valid */
-	if (slpi->slpi_valid.slpi_cr)
-		ia64_log_processor_regs_print(slpi->slpi_cr, 128, "Control", "cr", prfunc);
+/*
+ *  ia64_log_platform_info_print
+ *
+ *  Format and Log the SAL Platform Error Record.
+ *
+ *  Inputs  :   lh      (Pointer to the sal error record header with format
+ *                       specified by the SAL spec).
+ *              prfunc  (fn ptr of log output function to use)
+ *  Outputs :   None
+ */
+void
+ia64_log_platform_info_print (sal_log_record_header_t *lh, prfunc_t prfunc)
+{
+	sal_log_section_hdr_t       *slsh;
+	int                         n_sects;
+	int                         ercd_pos;
 
-	/* Print application register contents if valid */
-	if (slpi->slpi_valid.slpi_ar)
-		ia64_log_processor_regs_print(slpi->slpi_br, 128, "Application", "ar", prfunc);
+	if (!lh)
+		return;
 
-	/* Print region register contents if valid */
-	if (slpi->slpi_valid.slpi_rr)
-		ia64_log_processor_regs_print(slpi->slpi_rr, 8, "Region", "rr", prfunc);
+#ifdef MCA_PRT_XTRA_DATA    // for test only @FVL
+	ia64_log_prt_record_header(lh, prfunc);
+#endif  // MCA_PRT_XTRA_DATA for test only @FVL
+
+	if ((ercd_pos = sizeof(sal_log_record_header_t)) >= lh->len) {
+		IA64_MCA_DEBUG("ia64_mca_log_print: "
+			       "truncated SAL error record. len = %d\n",
+			       lh->len);
+		return;
+	}
 
-	/* Print floating-point register contents if valid */
-	if (slpi->slpi_valid.slpi_fr)
-		ia64_log_processor_regs_print(slpi->slpi_fr, 128, "Floating-point", "fr",
-					      prfunc);
+	/* Print record header info */
+	ia64_log_rec_header_print(lh, prfunc);
 
-	/* Print the cache check information if any*/
-	for (i = 0 ; i < MAX_CACHE_ERRORS; i++)
-		ia64_log_cache_check_info_print(i,
-					slpi->slpi_cache_check_info[i].slpi_cache_check,
-					slpi->slpi_cache_check_info[i].slpi_target_address,
-						prfunc);
-	/* Print the tlb check information if any*/
-	for (i = 0 ; i < MAX_TLB_ERRORS; i++)
-		ia64_log_tlb_check_info_print(i,slpi->slpi_tlb_check_info[i], prfunc);
+	for (n_sects = 0; (ercd_pos < lh->len); n_sects++, ercd_pos += slsh->len) {
+		/* point to next section header */
+		slsh = (sal_log_section_hdr_t *)((char *)lh + ercd_pos);
+
+#ifdef MCA_PRT_XTRA_DATA    // for test only @FVL
+		ia64_log_prt_section_header(slsh, prfunc);
+
+		if (efi_guidcmp(slsh->guid, SAL_PROC_DEV_ERR_SECT_GUID) != 0) {
+			size_t  d_len = slsh->len - sizeof(sal_log_section_hdr_t);
+			char    *p_data = (char *)&((sal_log_mem_dev_err_info_t *)slsh)->valid;
+
+			prfunc("Start of Platform Err Data Section:  Data buffer = %p, "
+			       "Data size = %ld\n", (void *)p_data, d_len);
+			ia64_log_hexdump(p_data, d_len, prfunc);
+			prfunc("End of Platform Err Data Section\n");
+		}
+#endif  // MCA_PRT_XTRA_DATA for test only @FVL
 
-	/* Print the bus check information if any*/
-	for (i = 0 ; i < MAX_BUS_ERRORS; i++)
-		ia64_log_bus_check_info_print(i,
-					slpi->slpi_bus_check_info[i].slpi_bus_check,
-					slpi->slpi_bus_check_info[i].slpi_requestor_addr,
-					slpi->slpi_bus_check_info[i].slpi_responder_addr,
-					slpi->slpi_bus_check_info[i].slpi_target_addr,
-					      prfunc);
+		/*
+		 *  Now process CPE error record section
+		 */
+		if (efi_guidcmp(slsh->guid, SAL_PROC_DEV_ERR_SECT_GUID) == 0) {
+			ia64_log_proc_dev_err_info_print((sal_log_processor_info_t *)slsh,
+							 prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform Memory Device Error Info Section\n");
+			ia64_log_mem_dev_err_info_print((sal_log_mem_dev_err_info_t *)slsh,
+							prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_SEL_DEV_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform SEL Device Error Info Section\n");
+			ia64_log_sel_dev_err_info_print((sal_log_sel_dev_err_info_t *)slsh,
+							prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_PCI_BUS_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform PCI Bus Error Info Section\n");
+			ia64_log_pci_bus_err_info_print((sal_log_pci_bus_err_info_t *)slsh,
+							prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform SMBIOS Device Error Info Section\n");
+			ia64_log_smbios_dev_err_info_print((sal_log_smbios_dev_err_info_t *)slsh,
+							   prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_PCI_COMP_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform PCI Component Error Info Section\n");
+			ia64_log_pci_comp_err_info_print((sal_log_pci_comp_err_info_t *)slsh,
+							 prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform Specific Error Info Section\n");
+			ia64_log_plat_specific_err_info_print((sal_log_plat_specific_err_info_t *)
+							      slsh,
+							      prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_HOST_CTLR_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform Host Controller Error Info Section\n");
+			ia64_log_host_ctlr_err_info_print((sal_log_host_ctlr_err_info_t *)slsh,
+							  prfunc);
+		} else if (efi_guidcmp(slsh->guid, SAL_PLAT_BUS_ERR_SECT_GUID) == 0) {
+			prfunc("+Platform Bus Error Info Section\n");
+			ia64_log_plat_bus_err_info_print((sal_log_plat_bus_err_info_t *)slsh,
+							 prfunc);
+		} else {
+			IA64_MCA_DEBUG("ia64_mca_log_print: unsupported record section\n");
+			continue;
+		}
+	}
 
+	IA64_MCA_DEBUG("ia64_mca_log_print: found %d sections in SAL error record. len = %d\n",
+		       n_sects, lh->len);
+	if (!n_sects) {
+		prfunc("No Platform Error Info Sections found\n");
+		return;
+	}
 }
 
 /*
  * ia64_log_print
- *	Display the contents of the OS error log information
- * Inputs	:	info_type	(SAL_INFO_TYPE_{MCA,INIT,CMC})
- *			sub_info_type	(SAL_SUB_INFO_TYPE_{PROCESSOR,PLATFORM})
+ *
+ *  Displays the contents of the OS error log information
+ *
+ *  Inputs   :  info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
+ *              prfunc      (fn ptr of log output function to use)
  * Outputs	:	None
  */
 void
-ia64_log_print(int sal_info_type, int sal_sub_info_type, prfunc_t prfunc)
+ia64_log_print(int sal_info_type, prfunc_t prfunc)
 {
-	char	*info_type, *sub_info_type;
-
 	switch(sal_info_type) {
-	case SAL_INFO_TYPE_MCA:
-		info_type = "MCA";
+	      case SAL_INFO_TYPE_MCA:
+		prfunc("+BEGIN HARDWARE ERROR STATE AT MCA\n");
+		ia64_log_platform_info_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc);
+		prfunc("+END HARDWARE ERROR STATE AT MCA\n");
 		break;
-	case SAL_INFO_TYPE_INIT:
-		info_type = "INIT";
+	      case SAL_INFO_TYPE_INIT:
+		prfunc("+MCA INIT ERROR LOG (UNIMPLEMENTED)\n");
 		break;
-	case SAL_INFO_TYPE_CMC:
-		info_type = "CMC";
+	      case SAL_INFO_TYPE_CMC:
+		prfunc("+BEGIN HARDWARE ERROR STATE AT CMC\n");
+		ia64_log_processor_info_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc);
+		prfunc("+END HARDWARE ERROR STATE AT CMC\n");
 		break;
-	default:
-		info_type = "UNKNOWN";
+	      case SAL_INFO_TYPE_CPE:
+		prfunc("+BEGIN HARDWARE ERROR STATE AT CPE\n");
+		ia64_log_platform_info_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc);
+		prfunc("+END HARDWARE ERROR STATE AT CPE\n");
 		break;
-	}
-
-	switch(sal_sub_info_type) {
-	case SAL_SUB_INFO_TYPE_PROCESSOR:
-		sub_info_type = "PROCESSOR";
-		break;
-	case SAL_SUB_INFO_TYPE_PLATFORM:
-		sub_info_type = "PLATFORM";
-		break;
-	default:
-		sub_info_type = "UNKNOWN";
+	      default:
+		prfunc("+MCA UNKNOWN ERROR LOG (UNIMPLEMENTED)\n");
 		break;
 	}
-
-	prfunc("+BEGIN HARDWARE ERROR STATE [%s %s]\n", info_type, sub_info_type);
-	if (sal_sub_info_type == SAL_SUB_INFO_TYPE_PROCESSOR)
-		ia64_log_processor_info_print(
-				      IA64_LOG_CURR_BUFFER(sal_info_type, sal_sub_info_type),
-				      prfunc);
-	else
-		log_print_platform(IA64_LOG_CURR_BUFFER(sal_info_type, sal_sub_info_type),prfunc);
-	prfunc("+END HARDWARE ERROR STATE [%s %s]\n", info_type, sub_info_type);
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/mca_asm.S linux/arch/ia64/kernel/mca_asm.S
--- v2.4.14/linux/arch/ia64/kernel/mca_asm.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/mca_asm.S	Fri Nov  9 14:26:17 2001
@@ -9,6 +9,7 @@
 //
 #include <linux/config.h>
 
+#include <asm/asmmacro.h>
 #include <asm/pgtable.h>
 #include <asm/processor.h>
 #include <asm/mca_asm.h>
@@ -23,7 +24,7 @@
 #include "minstate.h"
 
 /*
- *	SAL_TO_OS_MCA_HANDOFF_STATE
+ *  SAL_TO_OS_MCA_HANDOFF_STATE (SAL 3.0 spec)
  *		1. GR1 = OS GP
  *		2. GR8 = PAL_PROC physical address
  *		3. GR9 = SAL_PROC physical address
@@ -33,6 +34,7 @@
  */
 #define SAL_TO_OS_MCA_HANDOFF_STATE_SAVE(_tmp)		\
 	movl	_tmp=ia64_sal_to_os_handoff_state;;	\
+	DATA_VA_TO_PA(_tmp);;				\
 	st8	[_tmp]=r1,0x08;;			\
 	st8	[_tmp]=r8,0x08;;			\
 	st8	[_tmp]=r9,0x08;;			\
@@ -41,47 +43,29 @@
 	st8	[_tmp]=r12,0x08;;
 
 /*
- *	OS_MCA_TO_SAL_HANDOFF_STATE
- *		1. GR8 = OS_MCA status
- *		2. GR9 = SAL GP (physical)
- *		3. GR22 = New min state save area pointer
+ *  OS_MCA_TO_SAL_HANDOFF_STATE (SAL 3.0 spec)
+ *      1. GR8 = OS_MCA return status
+ *	2. GR9 = SAL GP (physical)
+ *      3. GR10 = 0/1 returning same/new context
+ *      4. GR22 = New min state save area pointer
+ *      returns ptr to SAL rtn save loc in _tmp
  */
-#define OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(_tmp)	\
-	movl	_tmp=ia64_os_to_sal_handoff_state;;	\
-	DATA_VA_TO_PA(_tmp);;				\
-	ld8	r8=[_tmp],0x08;;			\
-	ld8	r9=[_tmp],0x08;;			\
-	ld8	r22=[_tmp],0x08;;
-
-/*
- *	BRANCH
- *		Jump to the instruction referenced by
- *	"to_label".
- *		Branch is taken only if the predicate
- *	register "p" is true.
- *		"ip" is the address of the instruction
- *	located at "from_label".
- *		"temp" is a scratch register like r2
- *		"adjust" needed for HP compiler.
- *	A screwup somewhere with constant arithmetic.
- */
-#define BRANCH(to_label, temp, p, adjust)		\
-100:	(p)	mov		temp=ip;		\
-		;;					\
-	(p)	adds		temp=to_label-100b,temp;\
-		;;					\
-	(p)	adds		temp=adjust,temp;	\
-		;;					\
-	(p)	mov		b1=temp	;		\
-	(p)	br		b1
+#define OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(_tmp)				\
+	movl	_tmp=ia64_os_to_sal_handoff_state;;				\
+	DATA_VA_TO_PA(_tmp);;							\
+	ld8	r8=[_tmp],0x08;;						\
+	ld8	r9=[_tmp],0x08;;						\
+	ld8     r10=[_tmp],0x08;;						\
+	ld8     r22=[_tmp],0x08;;						\
+	movl    _tmp=ia64_sal_to_os_handoff_state;;				\
+	DATA_VA_TO_PA(_tmp);;							\
+	add     _tmp=0x28,_tmp;;            // point to SAL rtn save location
 
 	.global ia64_os_mca_dispatch
 	.global ia64_os_mca_dispatch_end
 	.global ia64_sal_to_os_handoff_state
 	.global	ia64_os_to_sal_handoff_state
-	.global	ia64_os_mca_ucmc_handler
 	.global	ia64_mca_proc_state_dump
-	.global ia64_mca_proc_state_restore
 	.global	ia64_mca_stack
 	.global	ia64_mca_stackframe
 	.global	ia64_mca_bspstore
@@ -100,7 +84,7 @@
 #endif	/* #if defined(MCA_TEST) */
 
 	// Save the SAL to OS MCA handoff state as defined
-	// by SAL SPEC 2.5
+	// by SAL SPEC 3.0
 	// NOTE : The order in which the state gets saved
 	//	  is dependent on the way the C-structure
 	//	  for ia64_mca_sal_to_os_state_t has been
@@ -110,15 +94,20 @@
 	// LOG PROCESSOR STATE INFO FROM HERE ON..
 	;;
 begin_os_mca_dump:
-	BRANCH(ia64_os_mca_proc_state_dump, r2, p0, 0x0)
-	;;
+	br	ia64_os_mca_proc_state_dump;;
+
 ia64_os_mca_done_dump:
 
 	// Setup new stack frame for OS_MCA handling
-	movl        r2=ia64_mca_bspstore		// local bspstore area location in r2
-	movl        r3=ia64_mca_stackframe		// save stack frame to memory in r3
+	movl    r2=ia64_mca_bspstore;;      // local bspstore area location in r2
+	DATA_VA_TO_PA(r2);;
+	movl    r3=ia64_mca_stackframe;;    // save stack frame to memory in r3
+	DATA_VA_TO_PA(r3);;
 	rse_switch_context(r6,r3,r2);;                  // RSC management in this new context
 	movl        r12=ia64_mca_stack;;
+	mov     r2=8*1024;;                 // stack size must be same as c array
+	add     r12=r2,r12;;                // stack base @ bottom of array
+	DATA_VA_TO_PA(r12);;
 
 	// Enter virtual mode from physical mode
 	VIRTUAL_MODE_ENTER(r2, r3, ia64_os_mca_virtual_begin, r4)
@@ -127,7 +116,7 @@
 	// call our handler
 	movl		r2=ia64_mca_ucmc_handler;;
 	mov		b6=r2;;
-	br.call.sptk.few	b0=b6
+	br.call.sptk.many    b0=b6;;
 .ret0:
 	// Revert back to physical mode before going back to SAL
 	PHYSICAL_MODE_ENTER(r2, r3, ia64_os_mca_virtual_end, r4)
@@ -135,9 +124,9 @@
 
 #if defined(MCA_TEST)
 	// Pretend that we are in interrupt context
-	mov		r2=psr
-	dep		r2=0, r2, PSR_IC, 2;
-	mov		psr.l = r2
+	mov	r2=psr;;
+	dep	r2=0, r2, PSR_IC, 2;;
+	mov	psr.l = r2;;
 #endif	/* #if defined(MCA_TEST) */
 
 	// restore the original stack frame here
@@ -152,15 +141,14 @@
 	mov		r8=gp
 	;;
 begin_os_mca_restore:
-	BRANCH(ia64_os_mca_proc_state_restore, r2, p0, 0x0)
-	;;
+	br	ia64_os_mca_proc_state_restore;;
 
 ia64_os_mca_done_restore:
 	;;
 	// branch back to SALE_CHECK
 	OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(r2)
 	ld8		r3=[r2];;
-	mov		b0=r3                       // SAL_CHECK return address
+	mov		b0=r3;;			      // SAL_CHECK return address
 	br		b0
 	;;
 ia64_os_mca_dispatch_end:
@@ -178,8 +166,10 @@
 //--
 
 ia64_os_mca_proc_state_dump:
-// Get and save GR0-31 from Proc. Min. State Save Area to SAL PSI
+// Save bank 1 GRs 16-31 which will be used by c-language code when we switch
+//  to virtual addressing mode.
 	movl		r2=ia64_mca_proc_state_dump;;           // Os state dump area
+        DATA_VA_TO_PA(r2)                   // convert to to physical address
 
 // save ar.NaT
 	mov		r5=ar.unat                  // ar.unat
@@ -250,16 +240,16 @@
 // if PSR.ic=0, reading interruption registers causes an illegal operation fault
 	mov		r3=psr;;
 	tbit.nz.unc	p6,p0=r3,PSR_IC;;           // PSI Valid Log bit pos. test
-(p6)    st8		[r2]=r0,9*8+160             // increment by 168 byte inc.
+(p6)    st8     [r2]=r0,9*8+160             // increment by 232 byte inc.
 begin_skip_intr_regs:
-	BRANCH(SkipIntrRegs,  r9, p6, 0x0)
-	;;
+(p6)	br		SkipIntrRegs;;
+
 	add		r4=8,r2                  // duplicate r2 in r4
 	add		r6=2*8,r2                // duplicate r2 in r6
 
 	mov		r3=cr16                     // cr.ipsr
 	mov		r5=cr17                     // cr.isr
-	mov		r7=r0;;                     // cr.ida => cr18
+        mov     r7=r0;;                     // cr.ida => cr18 (reserved)
 	st8		[r2]=r3,3*8
 	st8		[r4]=r5,3*8
 	st8		[r6]=r7,3*8;;
@@ -394,8 +384,7 @@
 	br.cloop.sptk.few	cStRR
 	;;
 end_os_mca_dump:
-	BRANCH(ia64_os_mca_done_dump, r2, p0, -0x10)
-	;;
+	br	ia64_os_mca_done_dump;;
 
 //EndStub//////////////////////////////////////////////////////////////////////
 
@@ -484,11 +473,10 @@
 // if PSR.ic=1, reading interruption registers causes an illegal operation fault
 	mov		r3=psr;;
 	tbit.nz.unc	p6,p0=r3,PSR_IC;;           // PSI Valid Log bit pos. test
-(p6)    st8		[r2]=r0,9*8+160             // increment by 160 byte inc.
+(p6)    st8     [r2]=r0,9*8+160             // increment by 232 byte inc.
 
 begin_rskip_intr_regs:
-	BRANCH(rSkipIntrRegs, r9, p6, 0x0)
-	;;
+(p6)	br		rSkipIntrRegs;;
 
 	add		r4=8,r2                  // duplicate r2 in r4
 	add		r6=2*8,r2;;              // duplicate r2 in r4
@@ -498,7 +486,7 @@
 	ld8		r7=[r6],3*8;;
 	mov		cr16=r3                     // cr.ipsr
 	mov		cr17=r5                     // cr.isr is read only
-//      mov		cr18=r7;;                   // cr.ida
+//      mov     cr18=r7;;                   // cr.ida (reserved - don't restore)
 
 	ld8		r3=[r2],3*8
 	ld8		r5=[r4],3*8
@@ -629,8 +617,8 @@
 	mov		ar.lc=r5
 	;;
 end_os_mca_restore:
-	BRANCH(ia64_os_mca_done_restore, r2, p0, -0x20)
-	;;
+	br	ia64_os_mca_done_restore;;
+
 //EndStub//////////////////////////////////////////////////////////////////////
 
 // ok, the issue here is that we need to save state information so
@@ -660,12 +648,7 @@
 //		6. GR12 = Return address to location within SAL_INIT procedure
 
 
-	.text
-	.align 16
-.global ia64_monarch_init_handler
-.proc ia64_monarch_init_handler
-ia64_monarch_init_handler:
-
+GLOBAL_ENTRY(ia64_monarch_init_handler)
 #if defined(CONFIG_SMP) && defined(SAL_MPINIT_WORKAROUND)
 	//
 	// work around SAL bug that sends all processors to monarch entry
@@ -741,13 +724,12 @@
 	adds out0=16,sp				// out0 = pointer to pt_regs
 	;;
 
-	br.call.sptk.few rp=ia64_init_handler
+	br.call.sptk.many rp=ia64_init_handler
 .ret1:
 
 return_from_init:
 	br.sptk return_from_init
-
-	.endp
+END(ia64_monarch_init_handler)
 
 //
 // SAL to OS entry point for INIT on the slave processor
@@ -755,14 +737,6 @@
 // as a part of ia64_mca_init.
 //
 
-	.text
-	.align 16
-.global ia64_slave_init_handler
-.proc ia64_slave_init_handler
-ia64_slave_init_handler:
-
-
-slave_init_spin_me:
-	br.sptk slave_init_spin_me
-	;;
-	.endp
+GLOBAL_ENTRY(ia64_slave_init_handler)
+1:	br.sptk 1b
+END(ia64_slave_init_handler)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/pal.S linux/arch/ia64/kernel/pal.S
--- v2.4.14/linux/arch/ia64/kernel/pal.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/kernel/pal.S	Fri Nov  9 14:26:17 2001
@@ -4,8 +4,9 @@
  *
  * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 1999-2000 David Mosberger <davidm@hpl.hp.com>
- * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
+ * Copyright (C) 1999-2001 Hewlett-Packard Co
+ *	David Mosberger <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
  *
  * 05/22/2000 eranian Added support for stacked register calls
  * 05/24/2000 eranian Added support for physical mode static calls
@@ -31,7 +32,7 @@
 	movl r2=pal_entry_point
 	;;
 	st8 [r2]=in0
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(ia64_pal_handler_init)
 
 /*
@@ -41,7 +42,7 @@
  */
 GLOBAL_ENTRY(ia64_pal_default_handler)
 	mov r8=-1
-	br.cond.sptk.few rp
+	br.cond.sptk.many rp
 END(ia64_pal_default_handler)
 
 /*
@@ -79,13 +80,13 @@
 	;;
 (p6)	srlz.i
 	mov rp = r8
-	br.cond.sptk.few b7
+	br.cond.sptk.many b7
 1:	mov psr.l = loc3
 	mov ar.pfs = loc1
 	mov rp = loc0
 	;;
 	srlz.d				// seralize restoration of psr.l
-	br.ret.sptk.few	b0
+	br.ret.sptk.many b0
 END(ia64_pal_call_static)
 
 /*
@@ -120,7 +121,7 @@
 	mov rp = loc0
 	;;
 	srlz.d				// serialize restoration of psr.l
-	br.ret.sptk.few	b0
+	br.ret.sptk.many b0
 END(ia64_pal_call_stacked)
 
 /*
@@ -173,13 +174,13 @@
 	or loc3=loc3,r17		// add in psr the bits to set
 	;;
 	andcm r16=loc3,r16		// removes bits to clear from psr
-	br.call.sptk.few rp=ia64_switch_mode
+	br.call.sptk.many rp=ia64_switch_mode
 .ret1:	mov rp = r8			// install return address (physical)
-	br.cond.sptk.few b7
+	br.cond.sptk.many b7
 1:
 	mov ar.rsc=0			// put RSE in enforced lazy, LE mode
 	mov r16=loc3			// r16= original psr
-	br.call.sptk.few rp=ia64_switch_mode // return to virtual mode
+	br.call.sptk.many rp=ia64_switch_mode // return to virtual mode
 .ret2:
 	mov psr.l = loc3		// restore init PSR
 
@@ -188,7 +189,7 @@
 	;;
 	mov ar.rsc=loc4			// restore RSE configuration
 	srlz.d				// seralize restoration of psr.l
-	br.ret.sptk.few	b0
+	br.ret.sptk.many b0
 END(ia64_pal_call_phys_static)
 
 /*
@@ -227,13 +228,13 @@
 	mov b7 = loc2			// install target to branch reg
 	;;
 	andcm r16=loc3,r16		// removes bits to clear from psr
-	br.call.sptk.few rp=ia64_switch_mode
+	br.call.sptk.many rp=ia64_switch_mode
 .ret6:
 	br.call.sptk.many rp=b7		// now make the call
 .ret7:
 	mov ar.rsc=0			// put RSE in enforced lazy, LE mode
 	mov r16=loc3			// r16= original psr
-	br.call.sptk.few rp=ia64_switch_mode	// return to virtual mode
+	br.call.sptk.many rp=ia64_switch_mode	// return to virtual mode
 
 .ret8:	mov psr.l  = loc3		// restore init PSR
 	mov ar.pfs = loc1
@@ -241,6 +242,6 @@
 	;;
 	mov ar.rsc=loc4			// restore RSE configuration
 	srlz.d				// seralize restoration of psr.l
-	br.ret.sptk.few	b0
+	br.ret.sptk.many b0
 END(ia64_pal_call_phys_stacked)
 
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/palinfo.c linux/arch/ia64/kernel/palinfo.c
--- v2.4.14/linux/arch/ia64/kernel/palinfo.c	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/kernel/palinfo.c	Fri Nov  9 14:26:17 2001
@@ -6,12 +6,13 @@
  * Intel IA-64 Architecture Software Developer's Manual v1.0.
  *
  *
- * Copyright (C) 2000 Hewlett-Packard Co
- * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
+ * Copyright (C) 2000-2001 Hewlett-Packard Co
+ *	Stephane Eranian <eranian@hpl.hp.com>
  *
  * 05/26/2000	S.Eranian	initial release
  * 08/21/2000	S.Eranian	updated to July 2000 PAL specs
  * 02/05/2001   S.Eranian	fixed module support
+ * 10/23/2001	S.Eranian	updated pal_perf_mon_info bug fixes
  */
 #include <linux/config.h>
 #include <linux/types.h>
@@ -32,8 +33,9 @@
 
 MODULE_AUTHOR("Stephane Eranian <eranian@hpl.hp.com>");
 MODULE_DESCRIPTION("/proc interface to IA-64 PAL");
+MODULE_LICENSE("GPL");
 
-#define PALINFO_VERSION "0.4"
+#define PALINFO_VERSION "0.5"
 
 #ifdef CONFIG_SMP
 #define cpu_is_online(i) (cpu_online_map & (1UL << i))
@@ -606,15 +608,6 @@
 
 	if (ia64_pal_perf_mon_info(pm_buffer, &pm_info) != 0) return 0;
 
-#ifdef IA64_PAL_PERF_MON_INFO_BUG
-	/*
-	 * This bug has been fixed in PAL 2.2.9 and higher
-	 */
-	pm_buffer[5]=0x3;
-	pm_info.pal_perf_mon_info_s.cycles  = 0x12;
-	pm_info.pal_perf_mon_info_s.retired = 0x08;
-#endif
-
 	p += sprintf(p, "PMC/PMD pairs                 : %d\n" \
 			"Counter width                 : %d bits\n" \
 			"Cycle event number            : %d\n" \
@@ -636,6 +629,14 @@
 	p = bitregister_process(p, pm_buffer+8, 256);
 
 	p += sprintf(p, "\nRetired bundles count capable : ");
+
+#ifdef CONFIG_ITANIUM
+	/*
+	 * PAL_PERF_MON_INFO reports that only PMC4 can be used to count CPU_CYCLES
+	 * which is wrong, both PMC4 and PMD5 support it.
+	 */
+	if (pm_buffer[12] == 0x10) pm_buffer[12]=0x30;
+#endif
 
 	p = bitregister_process(p, pm_buffer+12, 256);
 
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/pci.c linux/arch/ia64/kernel/pci.c
--- v2.4.14/linux/arch/ia64/kernel/pci.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/pci.c	Fri Nov  9 14:26:17 2001
@@ -38,6 +38,10 @@
 #define DBG(x...)
 #endif
 
+#ifdef CONFIG_IA64_MCA
+extern void ia64_mca_check_errors( void );
+#endif
+
 /*
  * This interrupt-safe spinlock protects all accesses to PCI
  * configuration space.
@@ -122,6 +126,10 @@
 #	define PCI_BUSES_TO_SCAN 255
 	int i;
 
+#ifdef CONFIG_IA64_MCA
+	ia64_mca_check_errors();    /* For post-failure MCA error logging */
+#endif
+
 	platform_pci_fixup(0);	/* phase 0 initialization (before PCI bus has been scanned) */
 
 	printk("PCI: Probing PCI hardware\n");
@@ -194,4 +202,40 @@
 pcibios_setup (char *str)
 {
 	return NULL;
+}
+
+int
+pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma,
+		     enum pci_mmap_state mmap_state, int write_combine)
+{
+	/*
+	 * I/O space cannot be accessed via normal processor loads and stores on this
+	 * platform.
+	 */
+	if (mmap_state == pci_mmap_io)
+		/*
+		 * XXX we could relax this for I/O spaces for which ACPI indicates that
+		 * the space is 1-to-1 mapped.  But at the moment, we don't support
+		 * multiple PCI address spaces and the legacy I/O space is not 1-to-1
+		 * mapped, so this is moot.
+		 */
+		return -EINVAL;
+
+	/*
+	 * Leave vm_pgoff as-is, the PCI space address is the physical address on this
+	 * platform.
+	 */
+	vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO);
+
+	if (write_combine)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+	else
+		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+	if (remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
+			     vma->vm_end - vma->vm_start,
+			     vma->vm_page_prot))
+		return -EAGAIN;
+
+	return 0;
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/perfmon.c linux/arch/ia64/kernel/perfmon.c
--- v2.4.14/linux/arch/ia64/kernel/perfmon.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/perfmon.c	Fri Nov  9 14:26:17 2001
@@ -38,7 +38,7 @@
 
 #ifdef CONFIG_PERFMON
 
-#define PFM_VERSION		"0.2"
+#define PFM_VERSION		"0.3"
 #define PFM_SMPL_HDR_VERSION	1
 
 #define PMU_FIRST_COUNTER	4	/* first generic counter */
@@ -52,6 +52,7 @@
 #define PFM_DISABLE		0xa6	/* freeze only */
 #define PFM_RESTART		0xcf
 #define PFM_CREATE_CONTEXT	0xa7
+#define PFM_DESTROY_CONTEXT	0xa8
 /*
  * Those 2 are just meant for debugging. I considered using sysctl() for
  * that but it is a little bit too pervasive. This solution is at least
@@ -60,6 +61,8 @@
 #define PFM_DEBUG_ON		0xe0
 #define PFM_DEBUG_OFF		0xe1
 
+#define PFM_DEBUG_BASE		PFM_DEBUG_ON
+
 
 /*
  * perfmon API flags
@@ -68,7 +71,8 @@
 #define PFM_FL_INHERIT_ONCE	 0x01	/* clone pfm_context only once across fork() */
 #define PFM_FL_INHERIT_ALL	 0x02	/* always clone pfm_context across fork() */
 #define PFM_FL_SMPL_OVFL_NOBLOCK 0x04	/* do not block on sampling buffer overflow */
-#define PFM_FL_SYSTEMWIDE	 0x08	/* create a systemwide context */
+#define PFM_FL_SYSTEM_WIDE	 0x08	/* create a system wide context */
+#define PFM_FL_EXCL_INTR	 0x10	/* exclude interrupt from system wide monitoring */
 
 /*
  * PMC API flags
@@ -87,7 +91,7 @@
 #endif
 
 #define PMC_IS_IMPL(i)		(i < pmu_conf.num_pmcs && pmu_conf.impl_regs[i>>6] & (1<< (i&~(64-1))))
-#define PMD_IS_IMPL(i)	(i < pmu_conf.num_pmds &&  pmu_conf.impl_regs[4+(i>>6)] & (1<< (i&~(64-1))))
+#define PMD_IS_IMPL(i)		(i < pmu_conf.num_pmds &&  pmu_conf.impl_regs[4+(i>>6)] & (1<< (i&~(64-1))))
 #define PMD_IS_COUNTER(i)	(i>=PMU_FIRST_COUNTER && i < (PMU_FIRST_COUNTER+pmu_conf.max_counters))
 #define PMC_IS_COUNTER(i)	(i>=PMU_FIRST_COUNTER && i < (PMU_FIRST_COUNTER+pmu_conf.max_counters))
 
@@ -197,7 +201,8 @@
 	unsigned int noblock:1;	/* block/don't block on overflow with notification */
 	unsigned int system:1;	/* do system wide monitoring */
 	unsigned int frozen:1;	/* pmu must be kept frozen on ctxsw in */
-	unsigned int reserved:27;
+	unsigned int exclintr:1;/* exlcude interrupts from system wide monitoring */
+	unsigned int reserved:26;
 } pfm_context_flags_t;
 
 typedef struct pfm_context {
@@ -207,26 +212,33 @@
 	unsigned long		ctx_iear_counter;	/* which PMD holds I-EAR */
 	unsigned long		ctx_btb_counter;	/* which PMD holds BTB */
 
-	pid_t			ctx_notify_pid;	/* who to notify on overflow */
-	int			ctx_notify_sig;	/* XXX: SIGPROF or other */
-	pfm_context_flags_t	ctx_flags;	/* block/noblock */
-	pid_t			ctx_creator;	/* pid of creator (debug) */
-	unsigned long		ctx_ovfl_regs;	/* which registers just overflowed (notification) */
-	unsigned long		ctx_smpl_regs;	/* which registers to record on overflow */
+	spinlock_t		ctx_notify_lock;
+	pfm_context_flags_t	ctx_flags;		/* block/noblock */
+	int			ctx_notify_sig;		/* XXX: SIGPROF or other */
+	struct task_struct	*ctx_notify_task;	/* who to notify on overflow */
+	struct task_struct	*ctx_creator;		/* pid of creator (debug) */
+
+	unsigned long		ctx_ovfl_regs;		/* which registers just overflowed (notification) */
+	unsigned long		ctx_smpl_regs;		/* which registers to record on overflow */
+
+	struct semaphore	ctx_restart_sem; 	/* use for blocking notification mode */
 
-	struct semaphore	ctx_restart_sem; /* use for blocking notification mode */
+	unsigned long		ctx_used_pmds[4]; 	/* bitmask of used PMD (speedup ctxsw) */
+	unsigned long		ctx_used_pmcs[4]; 	/* bitmask of used PMC (speedup ctxsw) */
 
 	pfm_counter_t		ctx_pmds[IA64_NUM_PMD_COUNTERS]; /* XXX: size should be dynamic */
+
 } pfm_context_t;
 
+#define CTX_USED_PMD(ctx,n) (ctx)->ctx_used_pmds[(n)>>6] |= 1<< ((n) % 64)
+#define CTX_USED_PMC(ctx,n) (ctx)->ctx_used_pmcs[(n)>>6] |= 1<< ((n) % 64)
+
 #define ctx_fl_inherit	ctx_flags.inherit
 #define ctx_fl_noblock	ctx_flags.noblock
 #define ctx_fl_system	ctx_flags.system
 #define ctx_fl_frozen	ctx_flags.frozen
+#define ctx_fl_exclintr	ctx_flags.exclintr
 
-#define CTX_IS_DEAR(c,n)	((c)->ctx_dear_counter == (n))
-#define CTX_IS_IEAR(c,n)	((c)->ctx_iear_counter == (n))
-#define CTX_IS_BTB(c,n)		((c)->ctx_btb_counter == (n))
 #define CTX_OVFL_NOBLOCK(c)	((c)->ctx_fl_noblock == 1)
 #define CTX_INHERIT_MODE(c)	((c)->ctx_fl_inherit)
 #define CTX_HAS_SMPL(c)		((c)->ctx_smpl_buf != NULL)
@@ -234,17 +246,15 @@
 static pmu_config_t pmu_conf;
 
 /* for debug only */
-static unsigned long pfm_debug=0;	/* 0= nodebug, >0= debug output on */
+static int pfm_debug=0;	/* 0= nodebug, >0= debug output on */
+
 #define DBprintk(a) \
 	do { \
-		if (pfm_debug >0) { printk(__FUNCTION__" "); printk a; } \
+		if (pfm_debug >0) { printk(__FUNCTION__" %d: ", __LINE__); printk a; } \
 	} while (0);
 
-static void perfmon_softint(unsigned long ignored);
 static void ia64_reset_pmu(void);
 
-DECLARE_TASKLET(pfm_tasklet, perfmon_softint, 0);
-
 /*
  * structure used to pass information between the interrupt handler
  * and the tasklet.
@@ -256,26 +266,42 @@
 	unsigned long	bitvect;	/* which counters have overflowed */
 } notification_info_t;
 
-#define notification_is_invalid(i)	(i->to_pid < 2)
 
-/* will need to be cache line padded */
-static notification_info_t notify_info[NR_CPUS];
+typedef struct {
+	unsigned long pfs_proc_sessions;
+	unsigned long pfs_sys_session; /* can only be 0/1 */
+	unsigned long pfs_dfl_dcr;	/* XXX: hack */
+	unsigned int  pfs_pp;
+} pfm_session_t;
 
-/*
- * We force cache line alignment to avoid false sharing
- * given that we have one entry per CPU.
- */
-static struct {
+struct {
 	struct task_struct *owner;
 } ____cacheline_aligned pmu_owners[NR_CPUS];
-/* helper macros */
+
+
+/* 
+ * helper macros
+ */
 #define SET_PMU_OWNER(t)	do { pmu_owners[smp_processor_id()].owner = (t); } while(0);
 #define PMU_OWNER()		pmu_owners[smp_processor_id()].owner
 
+#ifdef CONFIG_SMP
+#define PFM_CAN_DO_LAZY()	(smp_num_cpus==1 && pfs_info.pfs_sys_session==0)
+#else
+#define PFM_CAN_DO_LAZY()	(pfs_info.pfs_sys_session==0)
+#endif
+
+static void pfm_lazy_save_regs (struct task_struct *ta);
+
 /* for debug only */
 static struct proc_dir_entry *perfmon_dir;
 
 /*
+ * XXX: hack to indicate that a system wide monitoring session is active
+ */
+static pfm_session_t pfs_info;
+
+/*
  * finds the number of PM(C|D) registers given
  * the bitvector returned by PAL
  */
@@ -339,8 +365,7 @@
 static inline unsigned long
 kvirt_to_pa(unsigned long adr)
 {
-	__u64 pa;
-	__asm__ __volatile__ ("tpa %0 = %1" : "=r"(pa) : "r"(adr) : "memory");
+	__u64 pa = ia64_tpa(adr);
 	DBprintk(("kv2pa(%lx-->%lx)\n", adr, pa));
 	return pa;
 }
@@ -568,25 +593,44 @@
 static int
 pfx_is_sane(pfreq_context_t *pfx)
 {
+	int ctx_flags;
+
 	/* valid signal */
-	if (pfx->notify_sig < 1 || pfx->notify_sig >= _NSIG) return 0;
+	//if (pfx->notify_sig < 1 || pfx->notify_sig >= _NSIG) return -EINVAL;
+	if (pfx->notify_sig !=0 && pfx->notify_sig != SIGPROF) return -EINVAL;
 
 	/* cannot send to process 1, 0 means do not notify */
-	if (pfx->notify_pid < 0 || pfx->notify_pid == 1) return 0;
+	if (pfx->notify_pid < 0 || pfx->notify_pid == 1) return -EINVAL;
+
+	ctx_flags = pfx->flags;
 
+	if (ctx_flags & PFM_FL_SYSTEM_WIDE) {
+#ifdef CONFIG_SMP
+		if (smp_num_cpus > 1) {
+			printk("perfmon: system wide monitoring on SMP not yet supported\n");
+			return -EINVAL;
+		}
+#endif
+		if ((ctx_flags & PFM_FL_SMPL_OVFL_NOBLOCK) == 0) {
+			printk("perfmon: system wide monitoring cannot use blocking notification mode\n");
+			return -EINVAL;
+		}
+	}
 	/* probably more to add here */
 
-	return 1;
+	return 0;
 }
 
 static int
-pfm_context_create(struct task_struct *task, int flags, perfmon_req_t *req)
+pfm_context_create(int flags, perfmon_req_t *req)
 {
 	pfm_context_t *ctx;
+	struct task_struct *task = NULL;
 	perfmon_req_t tmp;
 	void *uaddr = NULL;
-	int ret = -EFAULT;
+	int ret;
 	int ctx_flags;
+	pid_t pid;
 
 	/* to go away */
 	if (flags) {
@@ -595,48 +639,156 @@
 
 	if (copy_from_user(&tmp, req, sizeof(tmp))) return -EFAULT;
 
+	ret = pfx_is_sane(&tmp.pfr_ctx);
+	if (ret < 0) return ret;
+
 	ctx_flags = tmp.pfr_ctx.flags;
 
-	/* not yet supported */
-	if (ctx_flags & PFM_FL_SYSTEMWIDE) return -EINVAL;
+	if (ctx_flags & PFM_FL_SYSTEM_WIDE) {
+		/*
+		 * XXX: This is not AT ALL SMP safe
+		 */
+		if (pfs_info.pfs_proc_sessions > 0) return -EBUSY;
+		if (pfs_info.pfs_sys_session > 0) return -EBUSY;
+
+		pfs_info.pfs_sys_session = 1;
 
-	if (!pfx_is_sane(&tmp.pfr_ctx)) return -EINVAL;
+	} else if (pfs_info.pfs_sys_session >0) {
+		/* no per-process monitoring while there is a system wide session */
+		return -EBUSY;
+	} else
+		pfs_info.pfs_proc_sessions++;
 
 	ctx = pfm_context_alloc();
-	if (!ctx) return -ENOMEM;
+	if (!ctx) goto error;
+
+	/* record the creator (debug only) */
+	ctx->ctx_creator = current;
+
+	pid = tmp.pfr_ctx.notify_pid;
+
+	spin_lock_init(&ctx->ctx_notify_lock);
+
+	if (pid == current->pid) {
+		ctx->ctx_notify_task = task = current;
+		current->thread.pfm_context = ctx;
+
+		atomic_set(&current->thread.pfm_notifiers_check, 1);
+
+	} else if (pid!=0) {
+		read_lock(&tasklist_lock);
+
+		task = find_task_by_pid(pid);
+		if (task) {
+			/*
+		 	 * record who to notify
+		 	 */
+			ctx->ctx_notify_task = task;
+
+			/* 
+		 	 * make visible
+		 	 * must be done inside critical section
+		 	 *
+		 	 * if the initialization does not go through it is still
+		 	 * okay because child will do the scan for nothing which
+		 	 * won't hurt.
+		 	 */
+			current->thread.pfm_context = ctx;
+
+			/*
+			 * will cause task to check on exit for monitored
+			 * processes that would notify it. see release_thread()
+			 * Note: the scan MUST be done in release thread, once the
+			 * task has been detached from the tasklist otherwise you are
+			 * exposed to race conditions.
+			 */
+			atomic_add(1, &task->thread.pfm_notifiers_check);
+		}
+		read_unlock(&tasklist_lock);
+	}
 
-	/* record who the creator is (for debug) */
-	ctx->ctx_creator = task->pid;
+	/*
+	 * notification process does not exist
+	 */
+	if (pid != 0 && task == NULL) {
+		ret = -EINVAL;
+		goto buffer_error;
+	}
 
-	ctx->ctx_notify_pid = tmp.pfr_ctx.notify_pid;
 	ctx->ctx_notify_sig = SIGPROF;	/* siginfo imposes a fixed signal */
 
 	if (tmp.pfr_ctx.smpl_entries) {
 		DBprintk((" sampling entries=%ld\n",tmp.pfr_ctx.smpl_entries));
-		if ((ret=pfm_smpl_buffer_alloc(ctx, tmp.pfr_ctx.smpl_regs, tmp.pfr_ctx.smpl_entries, &uaddr)) ) goto buffer_error;
+
+		ret = pfm_smpl_buffer_alloc(ctx, tmp.pfr_ctx.smpl_regs, 
+						 tmp.pfr_ctx.smpl_entries, &uaddr);
+		if (ret<0) goto buffer_error;
+
 		tmp.pfr_ctx.smpl_vaddr = uaddr;
 	}
 	/* initialization of context's flags */
-	ctx->ctx_fl_inherit = ctx_flags & PFM_FL_INHERIT_MASK;
-	ctx->ctx_fl_noblock = (ctx_flags & PFM_FL_SMPL_OVFL_NOBLOCK) ? 1 : 0;
-	ctx->ctx_fl_system  = (ctx_flags & PFM_FL_SYSTEMWIDE) ? 1: 0;
-	ctx->ctx_fl_frozen  = 0;
+	ctx->ctx_fl_inherit  = ctx_flags & PFM_FL_INHERIT_MASK;
+	ctx->ctx_fl_noblock  = (ctx_flags & PFM_FL_SMPL_OVFL_NOBLOCK) ? 1 : 0;
+	ctx->ctx_fl_system   = (ctx_flags & PFM_FL_SYSTEM_WIDE) ? 1: 0;
+	ctx->ctx_fl_exclintr = (ctx_flags & PFM_FL_EXCL_INTR) ? 1: 0;
+	ctx->ctx_fl_frozen   = 0;
+
+	/* 
+	 * Keep track of the pmds we want to sample
+	 * XXX: may be we don't need to save/restore the DEAR/IEAR pmds
+	 * but we do need the BTB for sure. This is because of a hardware
+	 * buffer of 1 only for non-BTB pmds.
+	 */
+	ctx->ctx_used_pmds[0] = tmp.pfr_ctx.smpl_regs;
+	ctx->ctx_used_pmcs[0] = 1; /* always save/restore PMC[0] */
 
 	sema_init(&ctx->ctx_restart_sem, 0); /* init this semaphore to locked */
 
-	if (copy_to_user(req, &tmp, sizeof(tmp))) goto buffer_error;
 
-	DBprintk((" context=%p, pid=%d notify_sig %d notify_pid=%d\n",(void *)ctx, task->pid, ctx->ctx_notify_sig, ctx->ctx_notify_pid));
-	DBprintk((" context=%p, pid=%d flags=0x%x inherit=%d noblock=%d system=%d\n",(void *)ctx, task->pid, ctx_flags, ctx->ctx_fl_inherit, ctx->ctx_fl_noblock, ctx->ctx_fl_system));
+	if (copy_to_user(req, &tmp, sizeof(tmp))) {
+		ret = -EFAULT;
+		goto buffer_error;
+	}
+
+	DBprintk((" context=%p, pid=%d notify_sig %d notify_task=%p\n",(void *)ctx, current->pid, ctx->ctx_notify_sig, ctx->ctx_notify_task));
+	DBprintk((" context=%p, pid=%d flags=0x%x inherit=%d noblock=%d system=%d\n",(void *)ctx, current->pid, ctx_flags, ctx->ctx_fl_inherit, ctx->ctx_fl_noblock, ctx->ctx_fl_system));
+
+	/*
+	 * when no notification is required, we can make this visible at the last moment
+	 */
+	if (pid == 0) current->thread.pfm_context = ctx;
+
+	/*
+	 * by default, we always include interrupts for system wide
+	 * DCR.pp is set by default to zero by kernel  in cpu_init()
+	 */
+	if (ctx->ctx_fl_system) {
+		if (ctx->ctx_fl_exclintr == 0) {
+			unsigned long dcr = ia64_get_dcr();
+
+			ia64_set_dcr(dcr|IA64_DCR_PP);
+			/*
+			* keep track of the kernel default value
+			 */
+			pfs_info.pfs_dfl_dcr = dcr;
 
-	/* link with task */
-	task->thread.pfm_context = ctx;
+			DBprintk((" dcr.pp is set\n"));
+		}
+	} 
 
 	return 0;
 
 buffer_error:
-	vfree(ctx);
-
+	pfm_context_free(ctx);
+error:
+	/*
+	 * undo session reservation
+	 */
+	if (ctx_flags & PFM_FL_SYSTEM_WIDE) {
+		pfs_info.pfs_sys_session = 0;
+	} else {
+		pfs_info.pfs_proc_sessions--;
+	}
 	return ret;
 }
 
@@ -656,8 +808,20 @@
 
 			/* upper part is ignored on rval */
 			ia64_set_pmd(cnum, ctx->ctx_pmds[i].smpl_rval);
+
+			/*
+			 * we must reset BTB index (clears pmd16.full to make
+			 * sure we do not report the same branches twice.
+			 * The non-blocking case in handled in update_counters()
+			 */
+			if (cnum == ctx->ctx_btb_counter) {
+				DBprintk(("reseting PMD16\n"));
+				ia64_set_pmd(16, 0);
+			}
 		}
 	}
+	/* just in case ! */
+	ctx->ctx_ovfl_regs = 0;
 }
 
 static int
@@ -695,20 +859,23 @@
 			} else if (PMC_IS_BTB(&tmp.pfr_reg.reg_value)) {
 				ctx->ctx_btb_counter = cnum;
 			}
-
+#if 0
 			if (tmp.pfr_reg.reg_flags & PFM_REGFL_OVFL_NOTIFY)
 				ctx->ctx_pmds[cnum - PMU_FIRST_COUNTER].flags |= PFM_REGFL_OVFL_NOTIFY;
+#endif
 		}
-
+		/* keep track of what we use */
+		CTX_USED_PMC(ctx, cnum);
 		ia64_set_pmc(cnum, tmp.pfr_reg.reg_value);
-			DBprintk((" setting PMC[%ld]=0x%lx flags=0x%x\n", cnum, tmp.pfr_reg.reg_value, ctx->ctx_pmds[cnum - PMU_FIRST_COUNTER].flags));
+
+		DBprintk((" setting PMC[%ld]=0x%lx flags=0x%x used_pmcs=0%lx\n", cnum, tmp.pfr_reg.reg_value, ctx->ctx_pmds[cnum - PMU_FIRST_COUNTER].flags, ctx->ctx_used_pmcs[0]));
 
 	}
 	/*
 	 * we have to set this here event hough we haven't necessarily started monitoring
 	 * because we may be context switched out
 	 */
-	th->flags |= IA64_THREAD_PM_VALID;
+	if (ctx->ctx_fl_system==0) th->flags |= IA64_THREAD_PM_VALID;
 
 	return 0;
 }
@@ -741,25 +908,32 @@
 			ctx->ctx_pmds[k].val  = tmp.pfr_reg.reg_value & ~pmu_conf.perf_ovfl_val;
 			ctx->ctx_pmds[k].smpl_rval = tmp.pfr_reg.reg_smpl_reset;
 			ctx->ctx_pmds[k].ovfl_rval = tmp.pfr_reg.reg_ovfl_reset;
+
+			if (tmp.pfr_reg.reg_flags & PFM_REGFL_OVFL_NOTIFY)
+				ctx->ctx_pmds[cnum - PMU_FIRST_COUNTER].flags |= PFM_REGFL_OVFL_NOTIFY;
 		}
+		/* keep track of what we use */
+		CTX_USED_PMD(ctx, cnum);
 
 		/* writes to unimplemented part is ignored, so this is safe */
 		ia64_set_pmd(cnum, tmp.pfr_reg.reg_value);
 
 		/* to go away */
 		ia64_srlz_d();
-		DBprintk((" setting PMD[%ld]:  pmd.val=0x%lx pmd.ovfl_rval=0x%lx pmd.smpl_rval=0x%lx pmd=%lx\n",
+		DBprintk((" setting PMD[%ld]:  ovfl_notify=%d pmd.val=0x%lx pmd.ovfl_rval=0x%lx pmd.smpl_rval=0x%lx pmd=%lx used_pmds=0%lx\n",
 					cnum,
+					PMD_OVFL_NOTIFY(ctx, cnum - PMU_FIRST_COUNTER),
 					ctx->ctx_pmds[k].val,
 					ctx->ctx_pmds[k].ovfl_rval,
 					ctx->ctx_pmds[k].smpl_rval,
-					ia64_get_pmd(cnum) & pmu_conf.perf_ovfl_val));
+					ia64_get_pmd(cnum) & pmu_conf.perf_ovfl_val,
+					ctx->ctx_used_pmds[0]));
 	}
 	/*
 	 * we have to set this here event hough we haven't necessarily started monitoring
 	 * because we may be context switched out
 	 */
-	th->flags |= IA64_THREAD_PM_VALID;
+	if (ctx->ctx_fl_system==0) th->flags |= IA64_THREAD_PM_VALID;
 
 	return 0;
 }
@@ -783,6 +957,8 @@
 	/* XXX: ctx locking may be required here */
 
 	for (i = 0; i < count; i++, req++) {
+		unsigned long reg_val = ~0, ctx_val = ~0;
+
 		if (copy_from_user(&tmp, req, sizeof(tmp))) return -EFAULT;
 
 		if (!PMD_IS_IMPL(tmp.pfr_reg.reg_num)) return -EINVAL;
@@ -791,23 +967,25 @@
 			if (ta == current){
 				val = ia64_get_pmd(tmp.pfr_reg.reg_num);
 			} else {
-				val = th->pmd[tmp.pfr_reg.reg_num];
+				val = reg_val = th->pmd[tmp.pfr_reg.reg_num];
 			}
 			val &= pmu_conf.perf_ovfl_val;
 			/*
 			 * lower part of .val may not be zero, so we must be an addition because of
 			 * residual count (see update_counters).
 			 */
-			val += ctx->ctx_pmds[tmp.pfr_reg.reg_num - PMU_FIRST_COUNTER].val;
+			val += ctx_val = ctx->ctx_pmds[tmp.pfr_reg.reg_num - PMU_FIRST_COUNTER].val;
 		} else {
 			/* for now */
 			if (ta != current) return -EINVAL;
 
+			ia64_srlz_d();
 			val = ia64_get_pmd(tmp.pfr_reg.reg_num);
 		}
 		tmp.pfr_reg.reg_value = val;
 
-		DBprintk((" reading PMD[%ld]=0x%lx\n", tmp.pfr_reg.reg_num, val));
+		DBprintk((" reading PMD[%ld]=0x%lx reg=0x%lx ctx_val=0x%lx pmc=0x%lx\n", 
+					tmp.pfr_reg.reg_num, val, reg_val, ctx_val, ia64_get_pmc(tmp.pfr_reg.reg_num)));
 
 		if (copy_to_user(req, &tmp, sizeof(tmp))) return -EFAULT;
 	}
@@ -822,7 +1000,7 @@
 	void *sem = &ctx->ctx_restart_sem;
 
 	if (task == current) {
-		DBprintk((" restartig self %d frozen=%d \n", current->pid, ctx->ctx_fl_frozen));
+		DBprintk((" restarting self %d frozen=%d \n", current->pid, ctx->ctx_fl_frozen));
 
 		pfm_reset_regs(ctx);
 
@@ -871,6 +1049,23 @@
 	return 0;
 }
 
+/*
+ * system-wide mode: propagate activation/desactivation throughout the tasklist
+ *
+ * XXX: does not work for SMP, of course
+ */
+static void
+pfm_process_tasklist(int cmd)
+{
+	struct task_struct *p;
+	struct pt_regs *regs;
+
+	for_each_task(p) {
+		regs = (struct pt_regs *)((unsigned long)p + IA64_STK_OFFSET);
+		regs--;
+		ia64_psr(regs)->pp = cmd;
+	}
+}
 
 static int
 do_perfmonctl (struct task_struct *task, int cmd, int flags, perfmon_req_t *req, int count, struct pt_regs *regs)
@@ -881,19 +1076,26 @@
 
 	memset(&tmp, 0, sizeof(tmp));
 
+	if (ctx == NULL && cmd != PFM_CREATE_CONTEXT && cmd < PFM_DEBUG_BASE) {
+		DBprintk((" PFM_WRITE_PMCS: no context for task %d\n", task->pid));
+		return -EINVAL;
+	}
+
 	switch (cmd) {
 		case PFM_CREATE_CONTEXT:
 			/* a context has already been defined */
 			if (ctx) return -EBUSY;
 
-			/* may be a temporary limitation */
+			/*
+			 * cannot directly create a context in another process
+			 */
 			if (task != current) return -EINVAL;
 
 			if (req == NULL || count != 1) return -EINVAL;
 
 			if (!access_ok(VERIFY_READ, req, sizeof(struct perfmon_req_t)*count)) return -EFAULT;
 
-			return pfm_context_create(task, flags, req);
+			return pfm_context_create(flags, req);
 
 		case PFM_WRITE_PMCS:
 			/* we don't quite support this right now */
@@ -901,10 +1103,6 @@
 
 			if (!access_ok(VERIFY_READ, req, sizeof(struct perfmon_req_t)*count)) return -EFAULT;
 
-			if (!ctx) {
-				DBprintk((" PFM_WRITE_PMCS: no context for task %d\n", task->pid));
-				return -EINVAL;
-			}
 			return pfm_write_pmcs(task, req, count);
 
 		case PFM_WRITE_PMDS:
@@ -913,45 +1111,41 @@
 
 			if (!access_ok(VERIFY_READ, req, sizeof(struct perfmon_req_t)*count)) return -EFAULT;
 
-			if (!ctx) {
-				DBprintk((" PFM_WRITE_PMDS: no context for task %d\n", task->pid));
-				return -EINVAL;
-			}
 			return pfm_write_pmds(task, req, count);
 
 		case PFM_START:
 			/* we don't quite support this right now */
 			if (task != current) return -EINVAL;
 
-			if (!ctx) {
-				DBprintk((" PFM_START: no context for task %d\n", task->pid));
-				return -EINVAL;
-			}
+			if (PMU_OWNER()  && PMU_OWNER() != current && PFM_CAN_DO_LAZY()) pfm_lazy_save_regs(PMU_OWNER());
 
 			SET_PMU_OWNER(current);
 
 			/* will start monitoring right after rfi */
 			ia64_psr(regs)->up = 1;
+			ia64_psr(regs)->pp = 1;
+
+			if (ctx->ctx_fl_system) {
+				pfm_process_tasklist(1);
+				pfs_info.pfs_pp = 1;
+			}
 
 			/*
 			 * mark the state as valid.
 			 * this will trigger save/restore at context switch
 			 */
-			th->flags |= IA64_THREAD_PM_VALID;
+			if (ctx->ctx_fl_system==0) th->flags |= IA64_THREAD_PM_VALID;
 
 			ia64_set_pmc(0, 0);
 			ia64_srlz_d();
 
-		break;
+			break;
 
 		case PFM_ENABLE:
 			/* we don't quite support this right now */
 			if (task != current) return -EINVAL;
 
-			if (!ctx) {
-				DBprintk((" PFM_ENABLE: no context for task %d\n", task->pid));
-				return -EINVAL;
-			}
+			if (PMU_OWNER()  && PMU_OWNER() != current && PFM_CAN_DO_LAZY()) pfm_lazy_save_regs(PMU_OWNER());
 
 			/* reset all registers to stable quiet state */
 			ia64_reset_pmu();
@@ -969,7 +1163,7 @@
 			 * mark the state as valid.
 			 * this will trigger save/restore at context switch
 			 */
-			th->flags |= IA64_THREAD_PM_VALID;
+			if (ctx->ctx_fl_system==0) th->flags |= IA64_THREAD_PM_VALID;
 
 			/* simply unfreeze */
 			ia64_set_pmc(0, 0);
@@ -983,54 +1177,41 @@
 			/* simply freeze */
 			ia64_set_pmc(0, 1);
 			ia64_srlz_d();
+			/*
+			 * XXX: cannot really toggle IA64_THREAD_PM_VALID
+			 * but context is still considered valid, so any 
+			 * read request would return something valid. Same
+			 * thing when this task terminates (pfm_flush_regs()).
+			 */
 			break;
 
 		case PFM_READ_PMDS:
 			if (!access_ok(VERIFY_READ, req, sizeof(struct perfmon_req_t)*count)) return -EFAULT;
 			if (!access_ok(VERIFY_WRITE, req, sizeof(struct perfmon_req_t)*count)) return -EFAULT;
 
-			if (!ctx) {
-				DBprintk((" PFM_READ_PMDS: no context for task %d\n", task->pid));
-				return -EINVAL;
-			}
 			return pfm_read_pmds(task, req, count);
 
 	      case PFM_STOP:
 			/* we don't quite support this right now */
 			if (task != current) return -EINVAL;
 
-			ia64_set_pmc(0, 1);
-			ia64_srlz_d();
-
+			/* simply stop monitors, not PMU */
 			ia64_psr(regs)->up = 0;
+			ia64_psr(regs)->pp = 0;
 
-			th->flags &= ~IA64_THREAD_PM_VALID;
-
-			SET_PMU_OWNER(NULL);
-
-			/* we probably will need some more cleanup here */
-			break;
-
-	      case PFM_DEBUG_ON:
-			printk(" debugging on\n");
-			pfm_debug = 1;
-			break;
+			if (ctx->ctx_fl_system) {
+				pfm_process_tasklist(0);
+				pfs_info.pfs_pp = 0;
+			}
 
-	      case PFM_DEBUG_OFF:
-			printk(" debugging off\n");
-			pfm_debug = 0;
 			break;
 
 	      case PFM_RESTART: /* temporary, will most likely end up as a PFM_ENABLE */
 
-			if ((th->flags & IA64_THREAD_PM_VALID) == 0) {
+			if ((th->flags & IA64_THREAD_PM_VALID) == 0 && ctx->ctx_fl_system==0) {
 				printk(" PFM_RESTART not monitoring\n");
 				return -EINVAL;
 			}
-			if (!ctx) {
-				printk(" PFM_RESTART no ctx for %d\n", task->pid);
-				return -EINVAL;
-			}
 			if (CTX_OVFL_NOBLOCK(ctx) == 0 && ctx->ctx_fl_frozen==0) {
 				printk("task %d without pmu_frozen set\n", task->pid);
 				return -EINVAL;
@@ -1038,6 +1219,37 @@
 
 			return pfm_do_restart(task); /* we only look at first entry */
 
+	      case PFM_DESTROY_CONTEXT:
+			/* we don't quite support this right now */
+			if (task != current) return -EINVAL;
+
+			/* first stop monitors */
+			ia64_psr(regs)->up = 0;
+			ia64_psr(regs)->pp = 0;
+
+			/* then freeze PMU */
+			ia64_set_pmc(0, 1);
+			ia64_srlz_d();
+
+			/* don't save/restore on context switch */
+			if (ctx->ctx_fl_system ==0) task->thread.flags &= ~IA64_THREAD_PM_VALID;
+
+			SET_PMU_OWNER(NULL);
+
+			/* now free context and related state */
+			pfm_context_exit(task);
+			break;
+
+	      case PFM_DEBUG_ON:
+			printk("perfmon debugging on\n");
+			pfm_debug = 1;
+			break;
+
+	      case PFM_DEBUG_OFF:
+			printk("perfmon debugging off\n");
+			pfm_debug = 0;
+			break;
+
 	      default:
 			DBprintk((" UNknown command 0x%x\n", cmd));
 			return -EINVAL;
@@ -1074,11 +1286,8 @@
 	/* XXX: pid interface is going away in favor of pfm context */
 	if (pid != current->pid) {
 		read_lock(&tasklist_lock);
-		{
-			child = find_task_by_pid(pid);
-			if (child)
-				get_task_struct(child);
-		}
+
+		child = find_task_by_pid(pid);
 
 		if (!child) goto abort_call;
 
@@ -1101,93 +1310,44 @@
 	return ret;
 }
 
-
-/*
- * This function is invoked on the exit path of the kernel. Therefore it must make sure
- * it does does modify the caller's input registers (in0-in7) in case of entry by system call
- * which can be restarted. That's why it's declared as a system call and all 8 possible args
- * are declared even though not used.
- */
 #if __GNUC__ >= 3
 void asmlinkage
-pfm_overflow_notify(void)
+pfm_block_on_overflow(void)
 #else
 void asmlinkage
-pfm_overflow_notify(u64 arg0, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7)
+pfm_block_on_overflow(u64 arg0, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7)
 #endif
 {
-	struct task_struct *task;
 	struct thread_struct *th = &current->thread;
 	pfm_context_t *ctx = current->thread.pfm_context;
-	struct siginfo si;
 	int ret;
 
 	/*
-	 * do some sanity checks first
-	 */
-	if (!ctx) {
-		printk("perfmon: process %d has no PFM context\n", current->pid);
-		return;
-	}
-	if (ctx->ctx_notify_pid < 2) {
-		printk("perfmon: process %d invalid notify_pid=%d\n", current->pid, ctx->ctx_notify_pid);
-		return;
-	}
-
-	DBprintk((" current=%d ctx=%p bv=0%lx\n", current->pid, (void *)ctx, ctx->ctx_ovfl_regs));
-	/*
 	 * NO matter what notify_pid is,
 	 * we clear overflow, won't notify again
 	 */
-	th->pfm_pend_notify = 0;
+	th->pfm_must_block = 0;
 
 	/*
-	 * When measuring in kernel mode and non-blocking fashion, it is possible to
-	 * get an overflow while executing this code. Therefore the state of pend_notify
-	 * and ovfl_regs can be altered. The important point is not to loose any notification.
-	 * It is fine to get called for nothing. To make sure we do collect as much state as
-	 * possible, update_counters() always uses |= to add bit to the ovfl_regs field.
-	 *
-	 * In certain cases, it is possible to come here, with ovfl_regs == 0;
-	 *
-	 * XXX: pend_notify and ovfl_regs could be merged maybe !
+	 * do some sanity checks first
 	 */
-	if (ctx->ctx_ovfl_regs == 0) {
-		printk("perfmon: spurious overflow notification from pid %d\n", current->pid);
+	if (!ctx) {
+		printk("perfmon: process %d has no PFM context\n", current->pid);
 		return;
 	}
-	read_lock(&tasklist_lock);
-
-	task = find_task_by_pid(ctx->ctx_notify_pid);
-
-	if (task) {
-		si.si_signo    = ctx->ctx_notify_sig;
-		si.si_errno    = 0;
-		si.si_code     = PROF_OVFL; /* goes to user */
-		si.si_addr     = NULL;
-		si.si_pid      = current->pid; /* who is sending */
-		si.si_pfm_ovfl = ctx->ctx_ovfl_regs;
-
-		DBprintk((" SIGPROF to %d @ %p\n", task->pid, (void *)task));
-
-		/* must be done with tasklist_lock locked */
-		ret = send_sig_info(ctx->ctx_notify_sig, &si, task);
-		if (ret != 0) {
-			DBprintk((" send_sig_info(process %d, SIGPROF)=%d\n", ctx->ctx_notify_pid, ret));
-			task = NULL; /* will cause return */
-		}
-	} else {
-		printk("perfmon: notify_pid %d not found\n", ctx->ctx_notify_pid);
+	if (ctx->ctx_notify_task == 0) {
+		printk("perfmon: process %d has no task to notify\n", current->pid);
+		return;
 	}
 
-	read_unlock(&tasklist_lock);
+	DBprintk((" current=%d task=%d\n", current->pid, ctx->ctx_notify_task->pid));
 
-	/* now that we have released the lock handle error condition */
-	if (!task || CTX_OVFL_NOBLOCK(ctx)) {
-		/* we clear all pending overflow bits in noblock mode */
-		ctx->ctx_ovfl_regs = 0;
+	/* should not happen */
+	if (CTX_OVFL_NOBLOCK(ctx)) {
+		printk("perfmon: process %d non-blocking ctx should not be here\n", current->pid);
 		return;
 	}
+
 	DBprintk((" CPU%d %d before sleep\n", smp_processor_id(), current->pid));
 
 	/*
@@ -1211,9 +1371,6 @@
 
 		pfm_reset_regs(ctx);
 
-		/* now we can clear this mask */
-		ctx->ctx_ovfl_regs = 0;
-
 		/*
 		 * Unlock sampling buffer and reset index atomically
 		 * XXX: not really needed when blocking
@@ -1232,84 +1389,14 @@
 	}
 }
 
-static void
-perfmon_softint(unsigned long ignored)
-{
-	notification_info_t *info;
-	int my_cpu = smp_processor_id();
-	struct task_struct *task;
-	struct siginfo si;
-
-	info = notify_info+my_cpu;
-
-	DBprintk((" CPU%d current=%d to_pid=%d from_pid=%d bv=0x%lx\n", \
-		smp_processor_id(), current->pid, info->to_pid, info->from_pid, info->bitvect));
-
-	/* assumption check */
-	if (info->from_pid == info->to_pid) {
-		DBprintk((" Tasklet assumption error: from=%d tor=%d\n", info->from_pid, info->to_pid));
-		return;
-	}
-
-	if (notification_is_invalid(info)) {
-		DBprintk((" invalid notification information\n"));
-		return;
-	}
-
-	/* sanity check */
-	if (info->to_pid == 1) {
-		DBprintk((" cannot notify init\n"));
-		return;
-	}
-	/*
-	 * XXX: needs way more checks here to make sure we send to a task we have control over
-	 */
-	read_lock(&tasklist_lock);
-
-	task = find_task_by_pid(info->to_pid);
-
-	DBprintk((" after find %p\n", (void *)task));
-
-	if (task) {
-		int ret;
-
-		si.si_signo    = SIGPROF;
-		si.si_errno    = 0;
-		si.si_code     = PROF_OVFL; /* goes to user */
-		si.si_addr     =  NULL;
-		si.si_pid      = info->from_pid; /* who is sending */
-		si.si_pfm_ovfl = info->bitvect;
-
-		DBprintk((" SIGPROF to %d @ %p\n", task->pid, (void *)task));
-
-		/* must be done with tasklist_lock locked */
-		ret = send_sig_info(SIGPROF, &si, task);
-		if (ret != 0)
-			DBprintk((" send_sig_info(process %d, SIGPROF)=%d\n", info->to_pid, ret));
-
-		/* invalidate notification */
-		info->to_pid  = info->from_pid = 0;
-		info->bitvect = 0;
-	}
-
-	read_unlock(&tasklist_lock);
-
-	DBprintk((" after unlock %p\n", (void *)task));
-
-	if (!task) {
-		printk("perfmon: CPU%d cannot find process %d\n", smp_processor_id(), info->to_pid);
-	}
-}
-
 /*
  * main overflow processing routine.
  * it can be called from the interrupt path or explicitely during the context switch code
  * Return:
- *	0 : do not unfreeze the PMU
- *	1 : PMU can be unfrozen
+ *	new value of pmc[0]. if 0x0 then unfreeze, else keep frozen
  */
-static unsigned long
-update_counters (struct task_struct *ta, u64 pmc0, struct pt_regs *regs)
+unsigned long
+update_counters (struct task_struct *task, u64 pmc0, struct pt_regs *regs)
 {
 	unsigned long mask, i, cnum;
 	struct thread_struct *th;
@@ -1317,7 +1404,9 @@
 	unsigned long bv = 0;
 	int my_cpu = smp_processor_id();
 	int ret = 1, buffer_is_full = 0;
-	int ovfl_is_smpl, can_notify, need_reset_pmd16=0;
+	int ovfl_has_long_recovery, can_notify, need_reset_pmd16=0;
+	struct siginfo si;
+
 	/*
 	 * It is never safe to access the task for which the overflow interrupt is destinated
 	 * using the current variable as the interrupt may occur in the middle of a context switch
@@ -1331,23 +1420,23 @@
 	 * valid one, i.e. the one that caused the interrupt.
 	 */
 
-	if (ta == NULL) {
+	if (task == NULL) {
 		DBprintk((" owners[%d]=NULL\n", my_cpu));
 		return 0x1;
 	}
-	th  = &ta->thread;
+	th  = &task->thread;
 	ctx = th->pfm_context;
 
 	/*
 	 * XXX: debug test
 	 * Don't think this could happen given upfront tests
 	 */
-	if ((th->flags & IA64_THREAD_PM_VALID) == 0) {
-		printk("perfmon: Spurious overflow interrupt: process %d not using perfmon\n", ta->pid);
+	if ((th->flags & IA64_THREAD_PM_VALID) == 0 && ctx->ctx_fl_system == 0) {
+		printk("perfmon: Spurious overflow interrupt: process %d not using perfmon\n", task->pid);
 		return 0x1;
 	}
 	if (!ctx) {
-		printk("perfmon: Spurious overflow interrupt: process %d has no PFM context\n", ta->pid);
+		printk("perfmon: Spurious overflow interrupt: process %d has no PFM context\n", task->pid);
 		return 0;
 	}
 
@@ -1355,16 +1444,21 @@
 	 * sanity test. Should never happen
 	 */
 	if ((pmc0 & 0x1 )== 0) {
-		printk("perfmon: pid %d pmc0=0x%lx assumption error for freeze bit\n", ta->pid, pmc0);
+		printk("perfmon: pid %d pmc0=0x%lx assumption error for freeze bit\n", task->pid, pmc0);
 		return 0x0;
 	}
 
 	mask = pmc0 >> PMU_FIRST_COUNTER;
 
-	DBprintk(("pmc0=0x%lx pid=%d\n", pmc0, ta->pid));
-
-	DBprintk(("ctx is in %s mode\n", CTX_OVFL_NOBLOCK(ctx) ? "NO-BLOCK" : "BLOCK"));
+	DBprintk(("pmc0=0x%lx pid=%d owner=%d iip=0x%lx, ctx is in %s mode used_pmds=0x%lx used_pmcs=0x%lx\n", 
+				pmc0, task->pid, PMU_OWNER()->pid, regs->cr_iip, 
+				CTX_OVFL_NOBLOCK(ctx) ? "NO-BLOCK" : "BLOCK",
+				ctx->ctx_used_pmds[0],
+				ctx->ctx_used_pmcs[0]));
 
+	/*
+	 * XXX: need to record sample only when an EAR/BTB has overflowed
+	 */
 	if (CTX_HAS_SMPL(ctx)) {
 		pfm_smpl_buffer_desc_t *psb = ctx->ctx_smpl_buf;
 		unsigned long *e, m, idx=0;
@@ -1372,11 +1466,15 @@
 		int j;
 
 		idx = ia64_fetch_and_add(1, &psb->psb_index);
-		DBprintk((" trying to record index=%ld entries=%ld\n", idx, psb->psb_entries));
+		DBprintk((" recording index=%ld entries=%ld\n", idx, psb->psb_entries));
 
 		/*
 		 * XXX: there is a small chance that we could run out on index before resetting
 		 * but index is unsigned long, so it will take some time.....
+		 * We use > instead of == because fetch_and_add() is off by one (see below)
+		 *
+		 * This case can happen in non-blocking mode or with multiple processes.
+		 * For non-blocking, we need to reload and continue.
 		 */
 		if (idx > psb->psb_entries) {
 			buffer_is_full = 1;
@@ -1388,7 +1486,7 @@
 
 		h = (perfmon_smpl_entry_t *)(((char *)psb->psb_addr) + idx*(psb->psb_entry_size));
 
-		h->pid  = ta->pid;
+		h->pid  = task->pid;
 		h->cpu  = my_cpu;
 		h->rate = 0;
 		h->ip   = regs ? regs->cr_iip : 0x0; /* where did the fault happened */
@@ -1398,6 +1496,7 @@
 		h->stamp = perfmon_get_stamp();
 
 		e = (unsigned long *)(h+1);
+
 		/*
 		 * selectively store PMDs in increasing index number
 		 */
@@ -1406,35 +1505,66 @@
 				if (PMD_IS_COUNTER(j))
 					*e =  ctx->ctx_pmds[j-PMU_FIRST_COUNTER].val
 					    + (ia64_get_pmd(j) & pmu_conf.perf_ovfl_val);
-				else
+				else {
 					*e = ia64_get_pmd(j); /* slow */
+				}
 				DBprintk((" e=%p pmd%d =0x%lx\n", (void *)e, j, *e));
 				e++;
 			}
 		}
-		/* make the new entry visible to user, needs to be atomic */
+		/*
+		 * make the new entry visible to user, needs to be atomic
+		 */
 		ia64_fetch_and_add(1, &psb->psb_hdr->hdr_count);
 
 		DBprintk((" index=%ld entries=%ld hdr_count=%ld\n", idx, psb->psb_entries, psb->psb_hdr->hdr_count));
-
-		/* sampling buffer full ? */
+		/* 
+		 * sampling buffer full ? 
+		 */
 		if (idx == (psb->psb_entries-1)) {
-			bv = mask;
+			/*
+			 * will cause notification, cannot be 0
+			 */
+			bv = mask << PMU_FIRST_COUNTER;
+
 			buffer_is_full = 1;
 
 			DBprintk((" sampling buffer full must notify bv=0x%lx\n", bv));
 
-			if (!CTX_OVFL_NOBLOCK(ctx)) goto buffer_full;
+			/*
+			 * we do not reload here, when context is blocking
+			 */
+			if (!CTX_OVFL_NOBLOCK(ctx)) goto no_reload;
+
 			/*
 			 * here, we have a full buffer but we are in non-blocking mode
-			 * so we need to reloads overflowed PMDs with sampling reset values
-			 * and restart
+			 * so we need to reload overflowed PMDs with sampling reset values
+			 * and restart right away.
 			 */
 		}
+		/* FALL THROUGH */
 	}
 reload_pmds:
-	ovfl_is_smpl = CTX_OVFL_NOBLOCK(ctx) && buffer_is_full;
-	can_notify   = CTX_HAS_SMPL(ctx) == 0 && ctx->ctx_notify_pid;
+
+	/*
+	 * in the case of a non-blocking context, we reload
+	 * with the ovfl_rval when no user notification is taking place (short recovery)
+	 * otherwise when the buffer is full which requires user interaction) then we use
+	 * smpl_rval which is the long_recovery path (disturbance introduce by user execution).
+	 *
+	 * XXX: implies that when buffer is full then there is always notification.
+	 */
+	ovfl_has_long_recovery = CTX_OVFL_NOBLOCK(ctx) && buffer_is_full;
+
+	/*
+	 * XXX: CTX_HAS_SMPL() should really be something like CTX_HAS_SMPL() and is activated,i.e.,
+	 * one of the PMC is configured for EAR/BTB.
+	 *
+	 * When sampling, we can only notify when the sampling buffer is full.
+	 */
+	can_notify   = CTX_HAS_SMPL(ctx) == 0 && ctx->ctx_notify_task;
+
+	DBprintk((" ovfl_has_long_recovery=%d can_notify=%d\n", ovfl_has_long_recovery, can_notify));
 
 	for (i = 0, cnum = PMU_FIRST_COUNTER; mask ; cnum++, i++, mask >>= 1) {
 
@@ -1456,7 +1586,7 @@
 		DBprintk((" pmod[%ld].val=0x%lx pmd=0x%lx\n", i, ctx->ctx_pmds[i].val, ia64_get_pmd(cnum)&pmu_conf.perf_ovfl_val));
 
 		if (can_notify && PMD_OVFL_NOTIFY(ctx, i)) {
-			DBprintk((" CPU%d should notify process %d with signal %d\n", my_cpu, ctx->ctx_notify_pid, ctx->ctx_notify_sig));
+			DBprintk((" CPU%d should notify task %p with signal %d\n", my_cpu, ctx->ctx_notify_task, ctx->ctx_notify_sig));
 			bv |= 1 << i;
 		} else {
 			DBprintk((" CPU%d PMD[%ld] overflow, no notification\n", my_cpu, cnum));
@@ -1467,93 +1597,150 @@
 			 */
 
 			/* writes to upper part are ignored, so this is safe */
-			if (ovfl_is_smpl) {
-				DBprintk((" CPU%d PMD[%ld] reloaded with smpl_val=%lx\n", my_cpu, cnum,ctx->ctx_pmds[i].smpl_rval));
+			if (ovfl_has_long_recovery) {
+				DBprintk((" CPU%d PMD[%ld] reload with smpl_val=%lx\n", my_cpu, cnum,ctx->ctx_pmds[i].smpl_rval));
 				ia64_set_pmd(cnum, ctx->ctx_pmds[i].smpl_rval);
 			} else {
-				DBprintk((" CPU%d PMD[%ld] reloaded with ovfl_val=%lx\n", my_cpu, cnum,ctx->ctx_pmds[i].smpl_rval));
+				DBprintk((" CPU%d PMD[%ld] reload with ovfl_val=%lx\n", my_cpu, cnum,ctx->ctx_pmds[i].smpl_rval));
 				ia64_set_pmd(cnum, ctx->ctx_pmds[i].ovfl_rval);
 			}
 		}
 		if (cnum == ctx->ctx_btb_counter) need_reset_pmd16=1;
 	}
 	/*
-	 * In case of BTB, overflow
-	 * we need to reset the BTB index.
+	 * In case of BTB overflow we need to reset the BTB index.
 	 */
 	if (need_reset_pmd16) {
 		DBprintk(("reset PMD16\n"));
 		ia64_set_pmd(16, 0);
 	}
-buffer_full:
-	/* see pfm_overflow_notify() on details for why we use |= here */
-	ctx->ctx_ovfl_regs  |= bv;
 
-	/* nobody to notify, return and unfreeze */
+no_reload:
+
+	/*
+	 * some counters overflowed, but they did not require
+	 * user notification, so after having reloaded them above
+	 * we simply restart
+	 */
 	if (!bv) return 0x0;
 
+	ctx->ctx_ovfl_regs  = bv; /* keep track of what to reset when unblocking */
+	/*
+	 * Now we know that:
+	 * 	- we have some counters which overflowed (contains in bv)
+	 * 	- someone has asked to be notified on overflow. 
+	 */
+
+	
+	/*
+	 * If the notification task is still present, then notify_task is non
+	 * null. It is clean by that task if it ever exits before we do. 
+	 */
 
-	if (ctx->ctx_notify_pid == ta->pid) {
-		struct siginfo si;
+	if (ctx->ctx_notify_task) {
 
 		si.si_errno    = 0;
 		si.si_addr     = NULL;
-		si.si_pid      = ta->pid; /* who is sending */
-
+		si.si_pid      = task->pid; /* who is sending */
 
 		si.si_signo    = ctx->ctx_notify_sig; /* is SIGPROF */
 		si.si_code     = PROF_OVFL; /* goes to user */
 		si.si_pfm_ovfl = bv;
 
 
+	
 		/*
-		 * in this case, we don't stop the task, we let it go on. It will
-		 * necessarily go to the signal handler (if any) when it goes back to
-		 * user mode.
+		 * when the target of the signal is not ourself, we have to be more
+		 * careful. The notify_task may being cleared by the target task itself
+		 * in release_thread(). We must ensure mutual exclusion here such that
+		 * the signal is delivered (even to a dying task) safely.
 		 */
-		DBprintk((" sending %d notification to self %d\n", si.si_signo, ta->pid));
-
 
-		/* this call is safe in an interrupt handler */
-		ret = send_sig_info(ctx->ctx_notify_sig, &si, ta);
-		if (ret != 0)
-			printk(" send_sig_info(process %d, SIGPROF)=%d\n", ta->pid, ret);
-		/*
-		 * no matter if we block or not, we keep PMU frozen and do not unfreeze on ctxsw
-		 */
-		ctx->ctx_fl_frozen = 1;
+		if (ctx->ctx_notify_task != current) {
+			/*
+			 * grab the notification lock for this task
+			 */
+			spin_lock(&ctx->ctx_notify_lock);
 
-	} else {
-#if 0
 			/*
-			 * The tasklet is guaranteed to be scheduled for this CPU only
+			 * now notify_task cannot be modified until we're done
+			 * if NULL, they it got modified while we were in the handler
 			 */
-			notify_info[my_cpu].to_pid   = ctx->notify_pid;
-			notify_info[my_cpu].from_pid = ta->pid; /* for debug only */
-			notify_info[my_cpu].bitvect  = bv;
-			/* tasklet is inserted and active */
-			tasklet_schedule(&pfm_tasklet);
-#endif
+			if (ctx->ctx_notify_task == NULL) {
+				spin_unlock(&ctx->ctx_notify_lock);
+				goto lost_notify;
+			}
 			/*
-			 * stored the vector of overflowed registers for use in notification
-			 * mark that a notification/blocking is pending (arm the trap)
+			 * required by send_sig_info() to make sure the target
+			 * task does not disappear on us.
 			 */
-		th->pfm_pend_notify = 1;
+			read_lock(&tasklist_lock);
+		}
+		/*
+	 	 * in this case, we don't stop the task, we let it go on. It will
+	 	 * necessarily go to the signal handler (if any) when it goes back to
+	 	 * user mode.
+	 	 */
+		DBprintk((" %d sending %d notification to %d\n", task->pid, si.si_signo, ctx->ctx_notify_task->pid));
+
+
+		/* 
+		 * this call is safe in an interrupt handler, so does read_lock() on tasklist_lock
+		 */
+		ret = send_sig_info(ctx->ctx_notify_sig, &si, ctx->ctx_notify_task);
+		if (ret != 0) printk(" send_sig_info(process %d, SIGPROF)=%d\n",  ctx->ctx_notify_task->pid, ret);
+		/*
+		 * now undo the protections in order
+		 */
+		if (ctx->ctx_notify_task != current) {
+			read_unlock(&tasklist_lock);
+			spin_unlock(&ctx->ctx_notify_lock);
+		}
 
 		/*
-		 * if we do block, then keep PMU frozen until restart
+		 * if we block set the pfm_must_block bit
+		 * when in block mode, we can effectively block only when the notified
+		 * task is not self, otherwise we would deadlock. 
+		 * in this configuration, the notification is sent, the task will not 
+		 * block on the way back to user mode, but the PMU will be kept frozen
+		 * until PFM_RESTART.
+		 * Note that here there is still a race condition with notify_task
+		 * possibly being nullified behind our back, but this is fine because
+		 * it can only be changed to NULL which by construction, can only be
+		 * done when notify_task != current. So if it was already different
+		 * before, changing it to NULL will still maintain this invariant.
+		 * Of course, when it is equal to current it cannot change at this point.
 		 */
-		if (!CTX_OVFL_NOBLOCK(ctx)) ctx->ctx_fl_frozen = 1;
+		if (!CTX_OVFL_NOBLOCK(ctx) && ctx->ctx_notify_task != current) {
+				th->pfm_must_block = 1; /* will cause blocking */
+		}
+	} else {
+lost_notify:
+		DBprintk((" notification task has disappeared !\n"));
+		/*
+		 * for a non-blocking context, we make sure we do not fall into the pfm_overflow_notify()
+		 * trap. Also in the case of a blocking context with lost notify process, then we do not
+		 * want to block either (even though it is interruptible). In this case, the PMU will be kept
+		 * frozen and the process will run to completion without monitoring enabled.
+		 *
+		 * Of course, we cannot loose notify process when self-monitoring.
+		 */
+		th->pfm_must_block = 0; 
 
-		DBprintk((" process %d notify ovfl_regs=0x%lx\n", ta->pid, bv));
 	}
 	/*
-	 * keep PMU frozen (and overflowed bits cleared) when we have to stop,
-	 * otherwise return a resume 'value' for PMC[0]
-	 *
-	 * XXX: maybe that's enough to get rid of ctx_fl_frozen ?
+	 * if we block, we keep the PMU frozen. If non-blocking we restart.
+	 * in the case of non-blocking were the notify process is lost, we also 
+	 * restart. 
 	 */
-	DBprintk((" will return pmc0=0x%x\n",ctx->ctx_fl_frozen ? 0x1 : 0x0));
+	if (!CTX_OVFL_NOBLOCK(ctx)) 
+		ctx->ctx_fl_frozen  = 1;
+	else
+		ctx->ctx_fl_frozen = 0;
+
+	DBprintk((" reload pmc0=0x%x must_block=%ld\n",
+				ctx->ctx_fl_frozen ? 0x1 : 0x0, th->pfm_must_block));
+
 	return ctx->ctx_fl_frozen ? 0x1 : 0x0;
 }
 
@@ -1595,10 +1782,17 @@
 	u64 pmc0 = ia64_get_pmc(0);
 	int i;
 
-	p += sprintf(p, "PMC[0]=%lx\nPerfmon debug: %s\n", pmc0, pfm_debug ? "On" : "Off");
+	p += sprintf(p, "CPU%d.pmc[0]=%lx\nPerfmon debug: %s\n", smp_processor_id(), pmc0, pfm_debug ? "On" : "Off");
+	p += sprintf(p, "proc_sessions=%lu sys_sessions=%lu\n", 
+			pfs_info.pfs_proc_sessions, 
+			pfs_info.pfs_sys_session);
+
 	for(i=0; i < NR_CPUS; i++) {
-		if (cpu_is_online(i))
-			p += sprintf(p, "CPU%d.PMU %d\n", i, pmu_owners[i].owner ? pmu_owners[i].owner->pid: 0);
+		if (cpu_is_online(i)) {
+			p += sprintf(p, "CPU%d.pmu_owner: %-6d\n",
+					i, 
+					pmu_owners[i].owner ? pmu_owners[i].owner->pid: -1);
+		}
 	}
 	return p - page;
 }
@@ -1648,8 +1842,8 @@
 	}
 	pmu_conf.perf_ovfl_val = (1L << pm_info.pal_perf_mon_info_s.width) - 1;
 	pmu_conf.max_counters  = pm_info.pal_perf_mon_info_s.generic;
-	pmu_conf.num_pmds      = find_num_pm_regs(pmu_conf.impl_regs);
-	pmu_conf.num_pmcs      = find_num_pm_regs(&pmu_conf.impl_regs[4]);
+	pmu_conf.num_pmcs      = find_num_pm_regs(pmu_conf.impl_regs);
+	pmu_conf.num_pmds      = find_num_pm_regs(&pmu_conf.impl_regs[4]);
 
 	printk("perfmon: %d bits counters (max value 0x%lx)\n", pm_info.pal_perf_mon_info_s.width, pmu_conf.perf_ovfl_val);
 	printk("perfmon: %ld PMC/PMD pairs, %ld PMCs, %ld PMDs\n", pmu_conf.max_counters, pmu_conf.num_pmcs, pmu_conf.num_pmds);
@@ -1681,21 +1875,19 @@
 	ia64_srlz_d();
 }
 
-/*
- * XXX: for system wide this function MUST never be called
- */
 void
 pfm_save_regs (struct task_struct *ta)
 {
 	struct task_struct *owner;
+	pfm_context_t *ctx;
 	struct thread_struct *t;
 	u64 pmc0, psr;
+	unsigned long mask;
 	int i;
 
-	if (ta == NULL) {
-		panic(__FUNCTION__" task is NULL\n");
-	}
-	t = &ta->thread;
+	t   = &ta->thread;
+	ctx = ta->thread.pfm_context;
+
 	/*
 	 * We must make sure that we don't loose any potential overflow
 	 * interrupt while saving PMU context. In this code, external
@@ -1715,7 +1907,7 @@
 	 * in kernel.
 	 * By now, we could still have an overflow interrupt in-flight.
 	 */
-	__asm__ __volatile__ ("rum psr.up;;"::: "memory");
+	__asm__ __volatile__ ("rsm psr.up|psr.pp;;"::: "memory");
 
 	/*
 	 * Mark the PMU as not owned
@@ -1744,7 +1936,6 @@
 	 * next process does not start with monitoring on if not requested
 	 */
 	ia64_set_pmc(0, 1);
-	ia64_srlz_d();
 
 	/*
 	 * Check for overflow bits and proceed manually if needed
@@ -1755,94 +1946,111 @@
 	 * next time the task exits from the kernel.
 	 */
 	if (pmc0 & ~0x1) {
-		if (owner != ta) printk(__FUNCTION__" owner=%p task=%p\n", (void *)owner, (void *)ta);
-		printk(__FUNCTION__" Warning: pmc[0]=0x%lx explicit call\n", pmc0);
-
-		pmc0 = update_counters(owner, pmc0, NULL);
+		update_counters(owner, pmc0, NULL);
 		/* we will save the updated version of pmc0 */
 	}
-
 	/*
 	 * restore PSR for context switch to save
 	 */
 	__asm__ __volatile__ ("mov psr.l=%0;; srlz.i;;"::"r"(psr): "memory");
 
+	/*
+	 * we do not save registers if we can do lazy
+	 */
+	if (PFM_CAN_DO_LAZY()) {
+		SET_PMU_OWNER(owner);
+		return;
+	}
 
 	/*
 	 * XXX needs further optimization.
 	 * Also must take holes into account
 	 */
-	for (i=0; i< pmu_conf.num_pmds; i++) {
-		t->pmd[i] = ia64_get_pmd(i);
+	mask = ctx->ctx_used_pmds[0];
+	for (i=0; mask; i++, mask>>=1) {
+		if (mask & 0x1) t->pmd[i] =ia64_get_pmd(i);
 	}
 
 	/* skip PMC[0], we handle it separately */
-	for (i=1; i< pmu_conf.num_pmcs; i++) {
-		t->pmc[i] = ia64_get_pmc(i);
+	mask = ctx->ctx_used_pmcs[0]>>1;
+	for (i=1; mask; i++, mask>>=1) {
+		if (mask & 0x1) t->pmc[i] = ia64_get_pmc(i);
 	}
-
 	/*
 	 * Throughout this code we could have gotten an overflow interrupt. It is transformed
 	 * into a spurious interrupt as soon as we give up pmu ownership.
 	 */
 }
 
-void
-pfm_load_regs (struct task_struct *ta)
+static void
+pfm_lazy_save_regs (struct task_struct *ta)
 {
-	struct thread_struct *t = &ta->thread;
-	pfm_context_t *ctx = ta->thread.pfm_context;
+	pfm_context_t *ctx;
+	struct thread_struct *t;
+	unsigned long mask;
 	int i;
 
+	DBprintk(("  on [%d] by [%d]\n", ta->pid, current->pid));
+
+	t   = &ta->thread;
+	ctx = ta->thread.pfm_context;
 	/*
 	 * XXX needs further optimization.
 	 * Also must take holes into account
 	 */
-	for (i=0; i< pmu_conf.num_pmds; i++) {
-		ia64_set_pmd(i, t->pmd[i]);
+	mask = ctx->ctx_used_pmds[0];
+	for (i=0; mask; i++, mask>>=1) {
+		if (mask & 0x1) t->pmd[i] =ia64_get_pmd(i);
 	}
-
-	/* skip PMC[0] to avoid side effects */
-	for (i=1; i< pmu_conf.num_pmcs; i++) {
-		ia64_set_pmc(i, t->pmc[i]);
+	
+	/* skip PMC[0], we handle it separately */
+	mask = ctx->ctx_used_pmcs[0]>>1;
+	for (i=1; mask; i++, mask>>=1) {
+		if (mask & 0x1) t->pmc[i] = ia64_get_pmc(i);
 	}
+	SET_PMU_OWNER(NULL);
+}
+
+void
+pfm_load_regs (struct task_struct *ta)
+{
+	struct thread_struct *t = &ta->thread;
+	pfm_context_t *ctx = ta->thread.pfm_context;
+	struct task_struct *owner;
+	unsigned long mask;
+	int i;
+
+	owner = PMU_OWNER();
+	if (owner == ta) goto skip_restore;
+	if (owner) pfm_lazy_save_regs(owner);
 
-	/*
-	 * we first restore ownership of the PMU to the 'soon to be current'
-	 * context. This way, if, as soon as we unfreeze the PMU at the end
-	 * of this function, we get an interrupt, we attribute it to the correct
-	 * task
-	 */
 	SET_PMU_OWNER(ta);
 
-#if 0
-	/*
-	 * check if we had pending overflow before context switching out
-	 * If so, we invoke the handler manually, i.e. simulate interrupt.
-	 *
-	 * XXX: given that we do not use the tasklet anymore to stop, we can
-	 * move this back to the pfm_save_regs() routine.
-	 */
-	if (t->pmc[0] & ~0x1) {
-		/* freeze set in pfm_save_regs() */
-		DBprintk((" pmc[0]=0x%lx manual interrupt\n",t->pmc[0]));
-		update_counters(ta, t->pmc[0], NULL);
+	mask = ctx->ctx_used_pmds[0];
+	for (i=0; mask; i++, mask>>=1) {
+		if (mask & 0x1) ia64_set_pmd(i, t->pmd[i]);
 	}
-#endif
 
+	/* skip PMC[0] to avoid side effects */
+	mask = ctx->ctx_used_pmcs[0]>>1;
+	for (i=1; mask; i++, mask>>=1) {
+		if (mask & 0x1) ia64_set_pmc(i, t->pmc[i]);
+	}
+skip_restore:
 	/*
 	 * unfreeze only when possible
 	 */
 	if (ctx->ctx_fl_frozen == 0) {
 		ia64_set_pmc(0, 0);
 		ia64_srlz_d();
+		/* place where we potentially (kernel level) start monitoring again */
 	}
 }
 
 
 /*
  * This function is called when a thread exits (from exit_thread()).
- * This is a simplified pfm_save_regs() that simply flushes hthe current
+ * This is a simplified pfm_save_regs() that simply flushes the current
  * register state into the save area taking into account any pending
  * overflow. This time no notification is sent because the taks is dying
  * anyway. The inline processing of overflows avoids loosing some counts.
@@ -1933,12 +2141,20 @@
 		/* collect latest results */
 		ctx->ctx_pmds[i].val += ia64_get_pmd(j) & pmu_conf.perf_ovfl_val;
 
+		/*
+		 * now everything is in ctx_pmds[] and we need
+		 * to clear the saved context from save_regs() such that
+		 * pfm_read_pmds() gets the correct value
+		 */
+		ta->thread.pmd[j] = 0;
+
 		/* take care of overflow inline */
 		if (mask & 0x1) {
 			ctx->ctx_pmds[i].val += 1 + pmu_conf.perf_ovfl_val;
 			DBprintk((" PMD[%d] overflowed pmd=0x%lx pmds.val=0x%lx\n",
 			j, ia64_get_pmd(j), ctx->ctx_pmds[i].val));
 		}
+		mask >>=1;
 	}
 }
 
@@ -1977,7 +2193,7 @@
 
 	/* clears all PMD registers */
 	for(i=0;i< pmu_conf.num_pmds; i++) {
-		if (PMD_IS_IMPL(i)) ia64_set_pmd(i,0);
+		if (PMD_IS_IMPL(i))  ia64_set_pmd(i,0);
 	}
 	ia64_srlz_d();
 }
@@ -1986,7 +2202,7 @@
  * task is the newly created task
  */
 int
-pfm_inherit(struct task_struct *task)
+pfm_inherit(struct task_struct *task, struct pt_regs *regs)
 {
 	pfm_context_t *ctx = current->thread.pfm_context;
 	pfm_context_t *nctx;
@@ -1994,12 +2210,22 @@
 	int i, cnum;
 
 	/*
+	 * bypass completely for system wide
+	 */
+	if (pfs_info.pfs_sys_session) {
+		DBprintk((" enabling psr.pp for %d\n", task->pid));
+		ia64_psr(regs)->pp = pfs_info.pfs_pp;
+		return 0;
+	}
+
+	/*
 	 * takes care of easiest case first
 	 */
 	if (CTX_INHERIT_MODE(ctx) == PFM_FL_INHERIT_NONE) {
 		DBprintk((" removing PFM context for %d\n", task->pid));
 		task->thread.pfm_context     = NULL;
-		task->thread.pfm_pend_notify = 0;
+		task->thread.pfm_must_block  = 0;
+		atomic_set(&task->thread.pfm_notifiers_check, 0);
 		/* copy_thread() clears IA64_THREAD_PM_VALID */
 		return 0;
 	}
@@ -2009,9 +2235,11 @@
 	/* copy content */
 	*nctx = *ctx;
 
-	if (ctx->ctx_fl_inherit == PFM_FL_INHERIT_ONCE) {
+	if (CTX_INHERIT_MODE(ctx) == PFM_FL_INHERIT_ONCE) {
 		nctx->ctx_fl_inherit = PFM_FL_INHERIT_NONE;
+		atomic_set(&task->thread.pfm_notifiers_check, 0);
 		DBprintk((" downgrading to INHERIT_NONE for %d\n", task->pid));
+		pfs_info.pfs_proc_sessions++;
 	}
 
 	/* initialize counters in new context */
@@ -2033,7 +2261,7 @@
 	sema_init(&nctx->ctx_restart_sem, 0); /* reset this semaphore to locked */
 
 	/* clear pending notification */
-	th->pfm_pend_notify = 0;
+	th->pfm_must_block = 0;
 
 	/* link with new task */
 	th->pfm_context     = nctx;
@@ -2052,7 +2280,10 @@
 	return 0;
 }
 
-/* called from exit_thread() */
+/* 
+ * called from release_thread(), at this point this task is not in the 
+ * tasklist anymore
+ */
 void
 pfm_context_exit(struct task_struct *task)
 {
@@ -2068,16 +2299,126 @@
 		pfm_smpl_buffer_desc_t *psb = ctx->ctx_smpl_buf;
 
 		/* if only user left, then remove */
-		DBprintk((" pid %d: task %d sampling psb->refcnt=%d\n", current->pid, task->pid, psb->psb_refcnt.counter));
+		DBprintk((" [%d] [%d] psb->refcnt=%d\n", current->pid, task->pid, psb->psb_refcnt.counter));
 
 		if (atomic_dec_and_test(&psb->psb_refcnt) ) {
 			rvfree(psb->psb_hdr, psb->psb_size);
 			vfree(psb);
-			DBprintk((" pid %d: cleaning task %d sampling buffer\n", current->pid, task->pid ));
+			DBprintk((" [%d] cleaning [%d] sampling buffer\n", current->pid, task->pid ));
+		}
+	}
+	DBprintk((" [%d] cleaning [%d] pfm_context @%p\n", current->pid, task->pid, (void *)ctx));
+
+	/*
+	 * To avoid getting the notified task scan the entire process list
+	 * when it exits because it would have pfm_notifiers_check set, we 
+	 * decrease it by 1 to inform the task, that one less task is going
+	 * to send it notification. each new notifer increases this field by
+	 * 1 in pfm_context_create(). Of course, there is race condition between
+	 * decreasing the value and the notified task exiting. The danger comes
+	 * from the fact that we have a direct pointer to its task structure
+	 * thereby bypassing the tasklist. We must make sure that if we have 
+	 * notify_task!= NULL, the target task is still somewhat present. It may
+	 * already be detached from the tasklist but that's okay. Note that it is
+	 * okay if we 'miss the deadline' and the task scans the list for nothing,
+	 * it will affect performance but not correctness. The correctness is ensured
+	 * by using the notify_lock whic prevents the notify_task from changing on us.
+	 * Once holdhing this lock, if we see notify_task!= NULL, then it will stay like
+	 * that until we release the lock. If it is NULL already then we came too late.
+	 */
+	spin_lock(&ctx->ctx_notify_lock);
+
+	if (ctx->ctx_notify_task) {
+		DBprintk((" [%d] [%d] atomic_sub on [%d] notifiers=%u\n", current->pid, task->pid,
+					ctx->ctx_notify_task->pid, 
+					atomic_read(&ctx->ctx_notify_task->thread.pfm_notifiers_check)));
+
+		atomic_sub(1, &ctx->ctx_notify_task->thread.pfm_notifiers_check);
+	}
+
+	spin_unlock(&ctx->ctx_notify_lock);
+
+	if (ctx->ctx_fl_system) {
+		/*
+		 * if included interrupts (true by default), then reset
+		 * to get default value
+		 */
+		if (ctx->ctx_fl_exclintr == 0) {
+			/*
+			 * reload kernel default DCR value
+			 */
+			ia64_set_dcr(pfs_info.pfs_dfl_dcr);
+			DBprintk((" restored dcr to 0x%lx\n", pfs_info.pfs_dfl_dcr));
 		}
+		/* 
+		 * free system wide session slot
+		 */
+		pfs_info.pfs_sys_session = 0;
+	} else {
+		pfs_info.pfs_proc_sessions--;
 	}
-	DBprintk((" pid %d: task %d pfm_context is freed @%p\n", current->pid, task->pid, (void *)ctx));
+
 	pfm_context_free(ctx);
+	/* 
+	 *  clean pfm state in thread structure,
+	 */
+	task->thread.pfm_context    = NULL;
+	task->thread.pfm_must_block = 0;
+	/* pfm_notifiers is cleaned in pfm_cleanup_notifiers() */
+
+}
+
+void
+pfm_cleanup_notifiers(struct task_struct *task)
+{
+	struct task_struct *p;
+	pfm_context_t *ctx;
+
+	DBprintk((" [%d] called\n", task->pid));
+
+	read_lock(&tasklist_lock);
+
+	for_each_task(p) {
+		/*
+		 * It is safe to do the 2-step test here, because thread.ctx
+		 * is cleaned up only in release_thread() and at that point
+		 * the task has been detached from the tasklist which is an
+		 * operation which uses the write_lock() on the tasklist_lock
+		 * so it cannot run concurrently to this loop. So we have the
+		 * guarantee that if we find p and it has a perfmon ctx then
+		 * it is going to stay like this for the entire execution of this
+		 * loop.
+		 */
+		ctx = p->thread.pfm_context;
+
+		DBprintk((" [%d] scanning task [%d] ctx=%p\n", task->pid, p->pid, ctx));
+
+		if (ctx && ctx->ctx_notify_task == task) {
+			DBprintk((" trying for notifier %d in %d\n", task->pid, p->pid));
+			/*
+			 * the spinlock is required to take care of a race condition
+			 * with the send_sig_info() call. We must make sure that 
+			 * either the send_sig_info() completes using a valid task,
+			 * or the notify_task is cleared before the send_sig_info()
+			 * can pick up a stale value. Note that by the time this
+			 * function is executed the 'task' is already detached from the
+			 * tasklist. The problem is that the notifiers have a direct
+			 * pointer to it. It is okay to send a signal to a task in this
+			 * stage, it simply will have no effect. But it is better than sending
+			 * to a completely destroyed task or worse to a new task using the same
+			 * task_struct address.
+			 */
+			spin_lock(&ctx->ctx_notify_lock);
+
+			ctx->ctx_notify_task = NULL;
+
+			spin_unlock(&ctx->ctx_notify_lock);
+
+			DBprintk((" done for notifier %d in %d\n", task->pid, p->pid));
+		}
+	}
+	read_unlock(&tasklist_lock);
+
 }
 
 #else /* !CONFIG_PERFMON */
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/process.c linux/arch/ia64/kernel/process.c
--- v2.4.14/linux/arch/ia64/kernel/process.c	Tue Oct  9 17:06:51 2001
+++ linux/arch/ia64/kernel/process.c	Fri Nov  9 14:26:17 2001
@@ -63,7 +63,8 @@
 {
 	unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
 
-	printk("\npsr : %016lx ifs : %016lx ip  : [<%016lx>]    %s\n",
+	printk("\nPid: %d, comm: %20s\n", current->pid, current->comm);
+	printk("psr : %016lx ifs : %016lx ip  : [<%016lx>]    %s\n",
 	       regs->cr_ipsr, regs->cr_ifs, ip, print_tainted());
 	printk("unat: %016lx pfs : %016lx rsc : %016lx\n",
 	       regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
@@ -201,7 +202,7 @@
 {
 	unsigned long rbs, child_rbs, rbs_size, stack_offset, stack_top, stack_used;
 	struct switch_stack *child_stack, *stack;
-	extern char ia64_ret_from_clone;
+	extern char ia64_ret_from_clone, ia32_ret_from_clone;
 	struct pt_regs *child_ptregs;
 	int retval = 0;
 
@@ -250,7 +251,10 @@
 		child_ptregs->r12 = (unsigned long) (child_ptregs + 1); /* kernel sp */
 		child_ptregs->r13 = (unsigned long) p;		/* set `current' pointer */
 	}
-	child_stack->b0 = (unsigned long) &ia64_ret_from_clone;
+	if (IS_IA32_PROCESS(regs))
+		child_stack->b0 = (unsigned long) &ia32_ret_from_clone;
+	else
+		child_stack->b0 = (unsigned long) &ia64_ret_from_clone;
 	child_stack->ar_bspstore = child_rbs + rbs_size;
 
 	/* copy parts of thread_struct: */
@@ -285,9 +289,8 @@
 		ia32_save_state(p);
 #endif
 #ifdef CONFIG_PERFMON
-	p->thread.pfm_pend_notify = 0;
 	if (p->thread.pfm_context)
-		retval = pfm_inherit(p);
+		retval = pfm_inherit(p, child_ptregs);
 #endif
 	return retval;
 }
@@ -441,11 +444,24 @@
 }
 
 #ifdef CONFIG_PERFMON
+/*
+ * By the time we get here, the task is detached from the tasklist. This is important
+ * because it means that no other tasks can ever find it as a notifiied task, therfore
+ * there is no race condition between this code and let's say a pfm_context_create().
+ * Conversely, the pfm_cleanup_notifiers() cannot try to access a task's pfm context if
+ * this other task is in the middle of its own pfm_context_exit() because it would alreayd
+ * be out of the task list. Note that this case is very unlikely between a direct child
+ * and its parents (if it is the notified process) because of the way the exit is notified
+ * via SIGCHLD.
+ */
 void
 release_thread (struct task_struct *task)
 {
 	if (task->thread.pfm_context)
 		pfm_context_exit(task);
+
+	if (atomic_read(&task->thread.pfm_notifiers_check) > 0)
+		pfm_cleanup_notifiers(task);
 }
 #endif
 
@@ -516,6 +532,29 @@
 }
 
 void
+cpu_halt (void)
+{
+	pal_power_mgmt_info_u_t power_info[8];
+	unsigned long min_power;
+	int i, min_power_state;
+
+	if (ia64_pal_halt_info(power_info) != 0)
+		return;
+
+	min_power_state = 0;
+	min_power = power_info[0].pal_power_mgmt_info_s.power_consumption;
+	for (i = 1; i < 8; ++i)
+		if (power_info[i].pal_power_mgmt_info_s.im
+		    && power_info[i].pal_power_mgmt_info_s.power_consumption < min_power) {
+			min_power = power_info[i].pal_power_mgmt_info_s.power_consumption;
+			min_power_state = i;
+		}
+
+	while (1)
+		ia64_pal_halt(min_power_state);
+}
+
+void
 machine_restart (char *restart_cmd)
 {
 	(*efi.reset_system)(EFI_RESET_WARM, 0, 0, 0);
@@ -524,6 +563,7 @@
 void
 machine_halt (void)
 {
+	cpu_halt();
 }
 
 void
@@ -531,4 +571,5 @@
 {
 	if (pm_power_off)
 		pm_power_off();
+	machine_halt();
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/ptrace.c linux/arch/ia64/kernel/ptrace.c
--- v2.4.14/linux/arch/ia64/kernel/ptrace.c	Sun Sep 23 11:40:55 2001
+++ linux/arch/ia64/kernel/ptrace.c	Fri Nov  9 14:26:17 2001
@@ -2,7 +2,7 @@
  * Kernel support for the ptrace() and syscall tracing interfaces.
  *
  * Copyright (C) 1999-2001 Hewlett-Packard Co
- * Copyright (C) 1999-2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * Derived from the x86 and Alpha versions.  Most of the code in here
  * could actually be factored into a common set of routines.
@@ -794,11 +794,14 @@
  *
  * Make sure the single step bit is not set.
  */
-void ptrace_disable(struct task_struct *child)
+void
+ptrace_disable (struct task_struct *child)
 {
+	struct ia64_psr *child_psr = ia64_psr(ia64_task_regs(child));
+
 	/* make sure the single step/take-branch tra bits are not set: */
-	ia64_psr(pt)->ss = 0;
-	ia64_psr(pt)->tb = 0;
+	child_psr->ss = 0;
+	child_psr->tb = 0;
 
 	/* Turn off flag indicating that the KRBS is sync'd with child's VM: */
 	child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
@@ -809,7 +812,7 @@
 	    long arg4, long arg5, long arg6, long arg7, long stack)
 {
 	struct pt_regs *pt, *regs = (struct pt_regs *) &stack;
-	unsigned long flags, urbs_end;
+	unsigned long urbs_end;
 	struct task_struct *child;
 	struct switch_stack *sw;
 	long ret;
@@ -855,6 +858,19 @@
 	if (child->p_pptr != current)
 		goto out_tsk;
 
+	if (request != PTRACE_KILL) {
+		if (child->state != TASK_STOPPED)
+			goto out_tsk;
+
+#ifdef CONFIG_SMP
+		while (child->has_cpu) {
+			if (child->state != TASK_STOPPED)
+				goto out_tsk;
+			barrier();
+		}
+#endif
+	}
+
 	pt = ia64_task_regs(child);
 	sw = (struct switch_stack *) (child->thread.ksp + 16);
 
@@ -925,7 +941,7 @@
 			child->ptrace &= ~PT_TRACESYS;
 		child->exit_code = data;
 
-		/* make sure the single step/take-branch tra bits are not set: */
+		/* make sure the single step/taken-branch trap bits are not set: */
 		ia64_psr(pt)->ss = 0;
 		ia64_psr(pt)->tb = 0;
 
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/sal.c linux/arch/ia64/kernel/sal.c
--- v2.4.14/linux/arch/ia64/kernel/sal.c	Thu Jan  4 12:50:17 2001
+++ linux/arch/ia64/kernel/sal.c	Fri Nov  9 14:26:17 2001
@@ -1,8 +1,8 @@
 /*
  * System Abstraction Layer (SAL) interface routines.
  *
- * Copyright (C) 1998, 1999 Hewlett-Packard Co
- * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1998, 1999, 2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  * Copyright (C) 1999 VA Linux Systems
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  */
@@ -18,8 +18,6 @@
 #include <asm/sal.h>
 #include <asm/pal.h>
 
-#define SAL_DEBUG
-
 spinlock_t sal_lock = SPIN_LOCK_UNLOCKED;
 
 static struct {
@@ -122,10 +120,8 @@
 		switch (*p) {
 		      case SAL_DESC_ENTRY_POINT:
 			ep = (struct ia64_sal_desc_entry_point *) p;
-#ifdef SAL_DEBUG
-			printk("sal[%d] - entry: pal_proc=0x%lx, sal_proc=0x%lx\n",
-			       i, ep->pal_proc, ep->sal_proc);
-#endif
+			printk("SAL: entry: pal_proc=0x%lx, sal_proc=0x%lx\n",
+			       ep->pal_proc, ep->sal_proc);
 			ia64_pal_handler_init(__va(ep->pal_proc));
 			ia64_sal_handler_init(__va(ep->sal_proc), __va(ep->gp));
 			break;
@@ -138,17 +134,12 @@
 #ifdef CONFIG_SMP
 		      {
 			      struct ia64_sal_desc_ap_wakeup *ap = (void *) p;
-# ifdef SAL_DEBUG
-			      printk("sal[%d] - wakeup type %x, 0x%lx\n",
-				     i, ap->mechanism, ap->vector);
-# endif
+
 			      switch (ap->mechanism) {
 				    case IA64_SAL_AP_EXTERNAL_INT:
 				      ap_wakeup_vector = ap->vector;
-# ifdef SAL_DEBUG
 				      printk("SAL: AP wakeup using external interrupt "
 					     "vector 0x%lx\n", ap_wakeup_vector);
-# endif
 				      break;
 
 				    default:
@@ -163,21 +154,13 @@
 			      struct ia64_sal_desc_platform_feature *pf = (void *) p;
 			      printk("SAL: Platform features ");
 
-#ifdef CONFIG_IA64_HAVE_IRQREDIR
-			      /*
-			       * Early versions of SAL say we don't have
-			       * IRQ redirection, even though we do...
-			       */
-			      pf->feature_mask |= (1 << 1);
-#endif
-
 			      if (pf->feature_mask & (1 << 0))
 				      printk("BusLock ");
 
 			      if (pf->feature_mask & (1 << 1)) {
 				      printk("IRQ_Redirection ");
 #ifdef CONFIG_SMP
-				      if (no_int_routing) 
+				      if (no_int_routing)
 					      smp_int_redirect &= ~SMP_IRQ_REDIRECTION;
 				      else
 					      smp_int_redirect |= SMP_IRQ_REDIRECTION;
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/setup.c linux/arch/ia64/kernel/setup.c
--- v2.4.14/linux/arch/ia64/kernel/setup.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/setup.c	Tue Nov 13 09:01:16 2001
@@ -2,12 +2,13 @@
  * Architecture-specific setup.
  *
  * Copyright (C) 1998-2001 Hewlett-Packard Co
- * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  * Copyright (C) 1998, 1999, 2001 Stephane Eranian <eranian@hpl.hp.com>
  * Copyright (C) 2000, Rohit Seth <rohit.seth@intel.com>
  * Copyright (C) 1999 VA Linux Systems
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  *
+ * 11/12/01 D.Mosberger Convert get_cpuinfo() to seq_file based show_cpuinfo().
  * 04/04/00 D.Mosberger renamed cpu_initialized to cpu_online_map
  * 03/31/00 R.Seth	cpu_initialized and current->processor fixes
  * 02/04/00 D.Mosberger	some more get_cpuinfo fixes...
@@ -23,6 +24,7 @@
 #include <linux/kernel.h>
 #include <linux/reboot.h>
 #include <linux/sched.h>
+#include <linux/seq_file.h>
 #include <linux/string.h>
 #include <linux/threads.h>
 #include <linux/console.h>
@@ -364,61 +366,89 @@
 /*
  * Display cpu info for all cpu's.
  */
-int
-get_cpuinfo (char *buffer)
+static int
+show_cpuinfo (struct seq_file *m, void *v)
 {
 #ifdef CONFIG_SMP
 #	define lpj	c->loops_per_jiffy
 #else
 #	define lpj	loops_per_jiffy
 #endif
-	char family[32], features[128], *cp, *p = buffer;
-	struct cpuinfo_ia64 *c;
-	unsigned long mask, cpu;
-
-	for (cpu = 0; cpu < smp_num_cpus; ++cpu) {
-		c = cpu_data(cpu);
-		mask = c->features;
-
-		switch (c->family) {
-		      case 0x07:	memcpy(family, "Itanium", 8); break;
-		      case 0x1f:	memcpy(family, "McKinley", 9); break;
-		      default:		sprintf(family, "%u", c->family); break;
-		}
+	char family[32], features[128], *cp;
+	struct cpuinfo_ia64 *c = v;
+	unsigned long mask, cpu = c - cpu_data(0);
 
-		/* build the feature string: */
-		memcpy(features, " standard", 10);
-		cp = features;
-		if (mask & 1) {
-			strcpy(cp, " branchlong");
-			cp = strchr(cp, '\0');
-			mask &= ~1UL;
-		}
-		if (mask)
-			sprintf(cp, " 0x%lx", mask);
+#ifdef CONFIG_SMP
+	if (!(cpu_online_map & (1 << cpu)))
+		return 0;
+#endif
 
-		p += sprintf(p,
-			     "processor  : %lu\n"
-			     "vendor     : %s\n"
-			     "arch       : IA-64\n"
-			     "family     : %s\n"
-			     "model      : %u\n"
-			     "revision   : %u\n"
-			     "archrev    : %u\n"
-			     "features   :%s\n"	/* don't change this---it _is_ right! */
-			     "cpu number : %lu\n"
-			     "cpu regs   : %u\n"
-			     "cpu MHz    : %lu.%06lu\n"
-			     "itc MHz    : %lu.%06lu\n"
-			     "BogoMIPS   : %lu.%02lu\n\n",
-			     cpu, c->vendor, family, c->model, c->revision, c->archrev, features,
-			     c->ppn, c->number, c->proc_freq / 1000000, c->proc_freq % 1000000,
-			     c->itc_freq / 1000000, c->itc_freq % 1000000,
-			     lpj*HZ/500000, (lpj*HZ/5000) % 100);
-	}
-	return p - buffer;
+	mask = c->features;
+
+	switch (c->family) {
+	      case 0x07:	memcpy(family, "Itanium", 8); break;
+	      case 0x1f:	memcpy(family, "McKinley", 9); break;
+	      default:		sprintf(family, "%u", c->family); break;
+	}
+
+	/* build the feature string: */
+	memcpy(features, " standard", 10);
+	cp = features;
+	if (mask & 1) {
+		strcpy(cp, " branchlong");
+		cp = strchr(cp, '\0');
+		mask &= ~1UL;
+	}
+	if (mask)
+		sprintf(cp, " 0x%lx", mask);
+
+	seq_printf(m,
+		   "processor  : %lu\n"
+		   "vendor     : %s\n"
+		   "arch       : IA-64\n"
+		   "family     : %s\n"
+		   "model      : %u\n"
+		   "revision   : %u\n"
+		   "archrev    : %u\n"
+		   "features   :%s\n"	/* don't change this---it _is_ right! */
+		   "cpu number : %lu\n"
+		   "cpu regs   : %u\n"
+		   "cpu MHz    : %lu.%06lu\n"
+		   "itc MHz    : %lu.%06lu\n"
+		   "BogoMIPS   : %lu.%02lu\n\n",
+		   cpu, c->vendor, family, c->model, c->revision, c->archrev,
+		   features, c->ppn, c->number,
+		   c->proc_freq / 1000000, c->proc_freq % 1000000,
+		   c->itc_freq / 1000000, c->itc_freq % 1000000,
+		   lpj*HZ/500000, (lpj*HZ/5000) % 100);
+	return 0;
+}
+
+static void *
+c_start (struct seq_file *m, loff_t *pos)
+{
+	return *pos < NR_CPUS ? cpu_data(*pos) : NULL;
+}
+
+static void *
+c_next (struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+
+static void
+c_stop (struct seq_file *m, void *v)
+{
 }
 
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo
+};
+
 void
 identify_cpu (struct cpuinfo_ia64 *c)
 {
@@ -534,10 +564,13 @@
 	/*
 	 * Initialize default control register to defer all speculative faults.  The
 	 * kernel MUST NOT depend on a particular setting of these bits (in other words,
-	 * the kernel must have recovery code for all speculative accesses).
+	 * the kernel must have recovery code for all speculative accesses).  Turn on
+	 * dcr.lc as per recommendation by the architecture team.  Most IA-32 apps
+	 * shouldn't be affected by this (moral: keep your ia32 locks aligned and you'll
+	 * be fine).
 	 */
 	ia64_set_dcr(  IA64_DCR_DM | IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | IA64_DCR_DR
-		     | IA64_DCR_DA | IA64_DCR_DD);
+		     | IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC);
 #ifndef CONFIG_SMP
 	ia64_set_fpu_owner(0);
 #endif
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/sigframe.h linux/arch/ia64/kernel/sigframe.h
--- v2.4.14/linux/arch/ia64/kernel/sigframe.h	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/sigframe.h	Fri Nov  9 14:26:17 2001
@@ -1,3 +1,9 @@
+struct sigscratch {
+	unsigned long scratch_unat;	/* ar.unat for the general registers saved in pt */
+	unsigned long pad;
+	struct pt_regs pt;
+};
+
 struct sigframe {
 	/*
 	 * Place signal handler args where user-level unwinder can find them easily.
@@ -7,10 +13,11 @@
 	unsigned long arg0;		/* signum */
 	unsigned long arg1;		/* siginfo pointer */
 	unsigned long arg2;		/* sigcontext pointer */
+	/*
+	 * End of architected state.
+	 */
 
-	unsigned long rbs_base;		/* base of new register backing store (or NULL) */
 	void *handler;			/* pointer to the plabel of the signal handler */
-
 	struct siginfo info;
 	struct sigcontext sc;
 };
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/signal.c linux/arch/ia64/kernel/signal.c
--- v2.4.14/linux/arch/ia64/kernel/signal.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/signal.c	Fri Nov  9 14:26:17 2001
@@ -2,7 +2,7 @@
  * Architecture-specific signal handling support.
  *
  * Copyright (C) 1999-2001 Hewlett-Packard Co
- * Copyright (C) 1999-2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * Derived from i386 and Alpha versions.
  */
@@ -39,12 +39,6 @@
 # define GET_SIGSET(k,u)	__get_user((k)->sig[0], &(u)->sig[0])
 #endif
 
-struct sigscratch {
-	unsigned long scratch_unat;	/* ar.unat for the general registers saved in pt */
-	unsigned long pad;
-	struct pt_regs pt;
-};
-
 extern long ia64_do_signal (sigset_t *, struct sigscratch *, long);	/* forward decl */
 
 long
@@ -55,6 +49,10 @@
 	/* XXX: Don't preclude handling different sized sigset_t's.  */
 	if (sigsetsize != sizeof(sigset_t))
 		return -EINVAL;
+
+	if (!access_ok(VERIFY_READ, uset, sigsetsize))
+		return -EFAULT;
+
 	if (GET_SIGSET(&set, uset))
 		return -EFAULT;
 
@@ -73,15 +71,9 @@
 	 * pre-set the correct error code here to ensure that the right values
 	 * get saved in sigcontext by ia64_do_signal.
 	 */
-#ifdef CONFIG_IA32_SUPPORT
-        if (IS_IA32_PROCESS(&scr->pt)) {
-                scr->pt.r8 = -EINTR;
-        } else
-#endif
-	{
-		scr->pt.r8 = EINTR;
-		scr->pt.r10 = -1;
-	}
+	scr->pt.r8 = EINTR;
+	scr->pt.r10 = -1;
+
 	while (1) {
 		current->state = TASK_INTERRUPTIBLE;
 		schedule();
@@ -139,10 +131,9 @@
 		struct ia64_psr *psr = ia64_psr(&scr->pt);
 
 		__copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16);
-		if (!psr->dfh) {
-			psr->mfh = 0;
+		psr->mfh = 0;	/* drop signal handler's fph contents... */
+		if (!psr->dfh)
 			__ia64_load_fpu(current->thread.fph);
-		}
 	}
 	return err;
 }
@@ -380,7 +371,8 @@
 	err  = __put_user(sig, &frame->arg0);
 	err |= __put_user(&frame->info, &frame->arg1);
 	err |= __put_user(&frame->sc, &frame->arg2);
-	err |= __put_user(new_rbs, &frame->rbs_base);
+	err |= __put_user(new_rbs, &frame->sc.sc_rbs_base);
+	err |= __put_user(0, &frame->sc.sc_loadrs);	/* initialize to zero */
 	err |= __put_user(ka->sa.sa_handler, &frame->handler);
 
 	err |= copy_siginfo_to_user(&frame->info, info);
@@ -460,6 +452,7 @@
 long
 ia64_do_signal (sigset_t *oldset, struct sigscratch *scr, long in_syscall)
 {
+	struct signal_struct *sig;
 	struct k_sigaction *ka;
 	siginfo_t info;
 	long restart = in_syscall;
@@ -571,8 +564,8 @@
 			      case SIGSTOP:
 				current->state = TASK_STOPPED;
 				current->exit_code = signr;
-				if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags
-				      & SA_NOCLDSTOP))
+				sig = current->p_pptr->sig;
+				if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
 					notify_parent(current, SIGCHLD);
 				schedule();
 				continue;
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/smp.c linux/arch/ia64/kernel/smp.c
--- v2.4.14/linux/arch/ia64/kernel/smp.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/smp.c	Fri Nov  9 14:26:17 2001
@@ -48,6 +48,7 @@
 #include <asm/sal.h>
 #include <asm/system.h>
 #include <asm/unistd.h>
+#include <asm/mca.h>
 
 /* The 'big kernel lock' */
 spinlock_t kernel_flag = SPIN_LOCK_UNLOCKED;
@@ -70,20 +71,18 @@
 
 #define IPI_CALL_FUNC		0
 #define IPI_CPU_STOP		1
-#ifndef CONFIG_ITANIUM_PTCG
-# define IPI_FLUSH_TLB		2
-#endif  /*!CONFIG_ITANIUM_PTCG */
 
 static void
 stop_this_cpu (void)
 {
+	extern void cpu_halt (void);
 	/*
 	 * Remove this CPU:
 	 */
 	clear_bit(smp_processor_id(), &cpu_online_map);
 	max_xtp();
 	__cli();
-	for (;;);
+	cpu_halt();
 }
 
 void
@@ -136,49 +135,6 @@
 			stop_this_cpu();
 			break;
 
-#ifndef CONFIG_ITANIUM_PTCG
-		case IPI_FLUSH_TLB:
-		{
-			extern unsigned long flush_start, flush_end, flush_nbits, flush_rid;
-			extern atomic_t flush_cpu_count;
-			unsigned long saved_rid = ia64_get_rr(flush_start);
-			unsigned long end = flush_end;
-			unsigned long start = flush_start;
-			unsigned long nbits = flush_nbits;
-
-			/*
-			 * Current CPU may be running with different RID so we need to
-			 * reload the RID of flushed address.  Purging the translation
-			 * also needs ALAT invalidation; we do not need "invala" here
-			 * since it is done in ia64_leave_kernel.
-			 */
-			ia64_srlz_d();
-			if (saved_rid != flush_rid) {
-				ia64_set_rr(flush_start, flush_rid);
-				ia64_srlz_d();
-			}
-
-			do {
-				/*
-				 * Purge local TLB entries.
-				 */
-				__asm__ __volatile__ ("ptc.l %0,%1" ::
-						      "r"(start), "r"(nbits<<2) : "memory");
-				start += (1UL << nbits);
-			} while (start < end);
-
-			ia64_insn_group_barrier();
-			ia64_srlz_i();			/* srlz.i implies srlz.d */
-
-			if (saved_rid != flush_rid) {
-				ia64_set_rr(flush_start, saved_rid);
-				ia64_srlz_d();
-			}
-			atomic_dec(&flush_cpu_count);
-			break;
-		}
-#endif	/* !CONFIG_ITANIUM_PTCG */
-
 		default:
 			printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
 			break;
@@ -228,30 +184,6 @@
 	platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0);
 }
 
-#ifndef CONFIG_ITANIUM_PTCG
-
-void
-smp_send_flush_tlb (void)
-{
-	send_IPI_allbutself(IPI_FLUSH_TLB);
-}
-
-void
-smp_resend_flush_tlb (void)
-{
-	int i;
-
-	/*
-	 * Really need a null IPI but since this rarely should happen & since this code
-	 * will go away, lets not add one.
-	 */
-	for (i = 0; i < smp_num_cpus; ++i)
-		if (i != smp_processor_id())
-			smp_send_reschedule(i);
-}
-
-#endif  /* !CONFIG_ITANIUM_PTCG */
-
 void
 smp_flush_tlb_all (void)
 {
@@ -277,10 +209,6 @@
 {
 	struct call_data_struct data;
 	int cpus = 1;
-#if (defined(CONFIG_ITANIUM_B0_SPECIFIC) \
-     || defined(CONFIG_ITANIUM_B1_SPECIFIC) || defined(CONFIG_ITANIUM_B2_SPECIFIC))
-	unsigned long timeout;
-#endif
 
 	if (cpuid == smp_processor_id()) {
 		printk(__FUNCTION__" trying to call self\n");
@@ -295,26 +223,15 @@
 		atomic_set(&data.finished, 0);
 
 	spin_lock_bh(&call_lock);
-	call_data = &data;
-
-#if (defined(CONFIG_ITANIUM_B0_SPECIFIC) \
-     || defined(CONFIG_ITANIUM_B1_SPECIFIC) || defined(CONFIG_ITANIUM_B2_SPECIFIC))
-  resend:
-  	send_IPI_single(cpuid, IPI_CALL_FUNC);
 
-	/*  Wait for response */
-	timeout = jiffies + HZ;
-	while ((atomic_read(&data.started) != cpus) && time_before(jiffies, timeout))
-		barrier();
-	if (atomic_read(&data.started) != cpus)
-		goto resend;
-#else
+	call_data = &data;
+	mb();	/* ensure store to call_data precedes setting of IPI_CALL_FUNC */
   	send_IPI_single(cpuid, IPI_CALL_FUNC);
 
 	/* Wait for response */
 	while (atomic_read(&data.started) != cpus)
 		barrier();
-#endif
+
 	if (wait)
 		while (atomic_read(&data.finished) != cpus)
 			barrier();
@@ -348,10 +265,6 @@
 {
 	struct call_data_struct data;
 	int cpus = smp_num_cpus-1;
-#if (defined(CONFIG_ITANIUM_B0_SPECIFIC) \
-     || defined(CONFIG_ITANIUM_B1_SPECIFIC) || defined(CONFIG_ITANIUM_B2_SPECIFIC))
-	unsigned long timeout;
-#endif
 
 	if (!cpus)
 		return 0;
@@ -364,27 +277,14 @@
 		atomic_set(&data.finished, 0);
 
 	spin_lock_bh(&call_lock);
-	call_data = &data;
-
-#if (defined(CONFIG_ITANIUM_B0_SPECIFIC) \
-     || defined(CONFIG_ITANIUM_B1_SPECIFIC) || defined(CONFIG_ITANIUM_B2_SPECIFIC))
-  resend:
-	/*  Send a message to all other CPUs and wait for them to respond */
-	send_IPI_allbutself(IPI_CALL_FUNC);
 
-	/* Wait for response */
-	timeout = jiffies + HZ;
-	while ((atomic_read(&data.started) != cpus) && time_before(jiffies, timeout))
-		barrier();
-	if (atomic_read(&data.started) != cpus)
-		goto resend;
-#else
+	call_data = &data;
+	mb();	/* ensure store to call_data precedes setting of IPI_CALL_FUNC */
 	send_IPI_allbutself(IPI_CALL_FUNC);
 
 	/* Wait for response */
 	while (atomic_read(&data.started) != cpus)
 		barrier();
-#endif
 
 	if (wait)
 		while (atomic_read(&data.finished) != cpus)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/smpboot.c linux/arch/ia64/kernel/smpboot.c
--- v2.4.14/linux/arch/ia64/kernel/smpboot.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/smpboot.c	Fri Nov  9 14:26:17 2001
@@ -33,6 +33,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/machvec.h>
+#include <asm/mca.h>
 #include <asm/page.h>
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
@@ -42,6 +43,8 @@
 #include <asm/system.h>
 #include <asm/unistd.h>
 
+#define SMP_DEBUG 0
+
 #if SMP_DEBUG
 #define Dprintk(x...)  printk(x)
 #else
@@ -310,7 +313,7 @@
 }
 
 
-void __init
+static void __init
 smp_callin (void)
 {
 	int cpuid, phys_id;
@@ -324,8 +327,7 @@
 	phys_id = hard_smp_processor_id();
 
 	if (test_and_set_bit(cpuid, &cpu_online_map)) {
-		printk("huh, phys CPU#0x%x, CPU#0x%x already present??\n", 
-					phys_id, cpuid);
+		printk("huh, phys CPU#0x%x, CPU#0x%x already present??\n", phys_id, cpuid);
 		BUG();
 	}
 
@@ -341,6 +343,12 @@
 	 * Get our bogomips.
 	 */
 	ia64_init_itm();
+
+#ifdef CONFIG_IA64_MCA
+	ia64_mca_cmc_vector_setup();	/* Setup vector on AP & enable */
+	ia64_mca_check_errors();	/* For post-failure MCA error logging */
+#endif
+
 #ifdef CONFIG_PERFMON
 	perfmon_init_percpu();
 #endif
@@ -364,14 +372,15 @@
 {
 	extern int cpu_idle (void);
 
+	Dprintk("start_secondary: starting CPU 0x%x\n", hard_smp_processor_id());
 	efi_map_pal_code();
 	cpu_init();
 	smp_callin();
-	Dprintk("CPU %d is set to go. \n", smp_processor_id());
+	Dprintk("CPU %d is set to go.\n", smp_processor_id());
 	while (!atomic_read(&smp_commenced))
 		;
 
-	Dprintk("CPU %d is starting idle. \n", smp_processor_id());
+	Dprintk("CPU %d is starting idle.\n", smp_processor_id());
 	return cpu_idle();
 }
 
@@ -415,7 +424,7 @@
 	unhash_process(idle);
 	init_tasks[cpu] = idle;
 
-	Dprintk("Sending Wakeup Vector to AP 0x%x/0x%x.\n", cpu, sapicid);
+	Dprintk("Sending wakeup vector %u to AP 0x%x/0x%x.\n", ap_wakeup_vector, cpu, sapicid);
 
 	platform_send_ipi(cpu, ap_wakeup_vector, IA64_IPI_DM_INT, 0);
 
@@ -424,7 +433,6 @@
 	 */
 	Dprintk("Waiting on callin_map ...");
 	for (timeout = 0; timeout < 100000; timeout++) {
-		Dprintk(".");
 		if (test_bit(cpu, &cpu_callin_map))
 			break;  /* It has booted */
 		udelay(100);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/sys_ia64.c linux/arch/ia64/kernel/sys_ia64.c
--- v2.4.14/linux/arch/ia64/kernel/sys_ia64.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/sys_ia64.c	Fri Nov  9 14:26:17 2001
@@ -19,24 +19,29 @@
 #include <asm/shmparam.h>
 #include <asm/uaccess.h>
 
-#define COLOR_ALIGN(addr)	(((addr) + SHMLBA - 1) & ~(SHMLBA - 1))
-
 unsigned long
 arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len,
 			unsigned long pgoff, unsigned long flags)
 {
-	struct vm_area_struct * vmm;
 	long map_shared = (flags & MAP_SHARED);
+	unsigned long align_mask = PAGE_SIZE - 1;
+	struct vm_area_struct * vmm;
 
 	if (len > RGN_MAP_LIMIT)
 		return -ENOMEM;
 	if (!addr)
 		addr = TASK_UNMAPPED_BASE;
 
-	if (map_shared)
-		addr = COLOR_ALIGN(addr);
-	else
-		addr = PAGE_ALIGN(addr);
+	if (map_shared && (TASK_SIZE > 0xfffffffful))
+		/*
+		 * For 64-bit tasks, align shared segments to 1MB to avoid potential
+		 * performance penalty due to virtual aliasing (see ASDM).  For 32-bit
+		 * tasks, we prefer to avoid exhausting the address space too quickly by
+		 * limiting alignment to a single page.
+		 */
+		align_mask = SHMLBA - 1;
+
+	addr = (addr + align_mask) & ~align_mask;
 
 	for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
 		/* At this point:  (!vmm || addr < vmm->vm_end). */
@@ -46,9 +51,7 @@
 			return -ENOMEM;
 		if (!vmm || addr + len <= vmm->vm_start)
 			return addr;
-		addr = vmm->vm_end;
-		if (map_shared)
-			addr = COLOR_ALIGN(addr);
+		addr = (vmm->vm_end + align_mask) & ~align_mask;
 	}
 }
 
@@ -184,8 +187,10 @@
 		if (!file)
 			return -EBADF;
 
-		if (!file->f_op || !file->f_op->mmap)
-			return -ENODEV;
+		if (!file->f_op || !file->f_op->mmap) {
+			addr = -ENODEV;
+			goto out;
+		}
 	}
 
 	/*
@@ -194,22 +199,26 @@
 	 */
 	len = PAGE_ALIGN(len);
 	if (len == 0)
-		return addr;
+		goto out;
 
 	/* don't permit mappings into unmapped space or the virtual page table of a region: */
 	roff = rgn_offset(addr);
-	if ((len | roff | (roff + len)) >= RGN_MAP_LIMIT)
-		return -EINVAL;
+	if ((len | roff | (roff + len)) >= RGN_MAP_LIMIT) {
+		addr = -EINVAL;
+		goto out;
+	}
 
 	/* don't permit mappings that would cross a region boundary: */
-	if (rgn_index(addr) != rgn_index(addr + len))
-		return -EINVAL;
+	if (rgn_index(addr) != rgn_index(addr + len)) {
+		addr = -EINVAL;
+		goto out;
+	}
 
 	down_write(&current->mm->mmap_sem);
 	addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
 	up_write(&current->mm->mmap_sem);
 
-	if (file)
+out:	if (file)
 		fput(file);
 	return addr;
 }
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/time.c linux/arch/ia64/kernel/time.c
--- v2.4.14/linux/arch/ia64/kernel/time.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/time.c	Fri Nov  9 14:26:17 2001
@@ -145,6 +145,9 @@
 	tv->tv_usec = usec;
 }
 
+/* XXX there should be a cleaner way for declaring an alias... */
+asm (".global get_fast_time; get_fast_time = do_gettimeofday");
+
 static void
 timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/traps.c linux/arch/ia64/kernel/traps.c
--- v2.4.14/linux/arch/ia64/kernel/traps.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/traps.c	Fri Nov  9 14:26:17 2001
@@ -1,20 +1,19 @@
 /*
  * Architecture-specific trap handling.
  *
- * Copyright (C) 1998-2000 Hewlett-Packard Co
- * Copyright (C) 1998-2000 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1998-2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * 05/12/00 grao <goutham.rao@intel.com> : added isr in siginfo for SIGFPE
  */
 
 /*
- * The fpu_fault() handler needs to be able to access and update all
- * floating point registers.  Those saved in pt_regs can be accessed
- * through that structure, but those not saved, will be accessed
- * directly.  To make this work, we need to ensure that the compiler
- * does not end up using a preserved floating point register on its
- * own.  The following achieves this by declaring preserved registers
- * that are not marked as "fixed" as global register variables.
+ * fp_emulate() needs to be able to access and update all floating point registers.  Those
+ * saved in pt_regs can be accessed through that structure, but those not saved, will be
+ * accessed directly.  To make this work, we need to ensure that the compiler does not end
+ * up using a preserved floating point register on its own.  The following achieves this
+ * by declaring preserved registers that are not marked as "fixed" as global register
+ * variables.
  */
 register double f2 asm ("f2"); register double f3 asm ("f3");
 register double f4 asm ("f4"); register double f5 asm ("f5");
@@ -33,13 +32,17 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/sched.h>
+#include <linux/vt_kern.h>		/* For unblank_screen() */
 
+#include <asm/hardirq.h>
 #include <asm/ia32.h>
 #include <asm/processor.h>
 #include <asm/uaccess.h>
 
 #include <asm/fpswa.h>
 
+extern spinlock_t timerlist_lock;
+
 static fpswa_interface_t *fpswa_interface;
 
 void __init
@@ -51,30 +54,74 @@
 		fpswa_interface = __va(ia64_boot_param->fpswa);
 }
 
+/*
+ * Unlock any spinlocks which will prevent us from getting the message out (timerlist_lock
+ * is acquired through the console unblank code)
+ */
 void
-die_if_kernel (char *str, struct pt_regs *regs, long err)
+bust_spinlocks (int yes)
 {
-	if (user_mode(regs)) {
-#if 0
-		/* XXX for debugging only */
-		printk ("!!die_if_kernel: %s(%d): %s %ld\n",
-			current->comm, current->pid, str, err);
-		show_regs(regs);
+	spin_lock_init(&timerlist_lock);
+	if (yes) {
+		oops_in_progress = 1;
+#ifdef CONFIG_SMP
+		global_irq_lock = 0;	/* Many serial drivers do __global_cli() */
 #endif
-		return;
+	} else {
+		int loglevel_save = console_loglevel;
+#ifdef CONFIG_VT
+		unblank_screen();
+#endif
+		oops_in_progress = 0;
+		/*
+		 * OK, the message is on the console.  Now we call printk() without
+		 * oops_in_progress set so that printk will give klogd a poke.  Hold onto
+		 * your hats...
+		 */
+		console_loglevel = 15;		/* NMI oopser may have shut the console up */
+		printk(" ");
+		console_loglevel = loglevel_save;
 	}
+}
 
-	printk("%s[%d]: %s %ld\n", current->comm, current->pid, str, err);
-
-	show_regs(regs);
+void
+die (const char *str, struct pt_regs *regs, long err)
+{
+	static struct {
+		spinlock_t lock;
+		int lock_owner;
+		int lock_owner_depth;
+	} die = {
+		lock:			SPIN_LOCK_UNLOCKED,
+		lock_owner:		-1,
+		lock_owner_depth:	0
+	};
 
-	if (current->thread.flags & IA64_KERNEL_DEATH) {
-		printk("die_if_kernel recursion detected.\n");
-		sti();
-		while (1);
+	if (die.lock_owner != smp_processor_id()) {
+		console_verbose();
+		spin_lock_irq(&die.lock);
+		die.lock_owner = smp_processor_id();
+		die.lock_owner_depth = 0;
+		bust_spinlocks(1);
 	}
-	current->thread.flags |= IA64_KERNEL_DEATH;
-	do_exit(SIGSEGV);
+
+	if (++die.lock_owner_depth < 3) {
+		printk("%s[%d]: %s %ld\n", current->comm, current->pid, str, err);
+		show_regs(regs);
+  	} else
+		printk(KERN_ERR "Recursive die() failure, output suppressed\n");
+
+	bust_spinlocks(0);
+	die.lock_owner = -1;
+	spin_unlock_irq(&die.lock);
+  	do_exit(SIGSEGV);
+}
+
+void
+die_if_kernel (char *str, struct pt_regs *regs, long err)
+{
+	if (!user_mode(regs))
+		die(str, regs, err);
 }
 
 void
@@ -169,14 +216,12 @@
 }
 
 /*
- * disabled_fph_fault() is called when a user-level process attempts
- * to access one of the registers f32..f127 when it doesn't own the
- * fp-high register partition.  When this happens, we save the current
- * fph partition in the task_struct of the fpu-owner (if necessary)
- * and then load the fp-high partition of the current task (if
- * necessary).  Note that the kernel has access to fph by the time we
- * get here, as the IVT's "Diabled FP-Register" handler takes care of
- * clearing psr.dfh.
+ * disabled_fph_fault() is called when a user-level process attempts to access f32..f127
+ * and it doesn't own the fp-high register partition.  When this happens, we save the
+ * current fph partition in the task_struct of the fpu-owner (if necessary) and then load
+ * the fp-high partition of the current task (if necessary).  Note that the kernel has
+ * access to fph by the time we get here, as the IVT's "Disabled FP-Register" handler takes
+ * care of clearing psr.dfh.
  */
 static inline void
 disabled_fph_fault (struct pt_regs *regs)
@@ -277,7 +322,7 @@
 
 	if (jiffies - last_time > 5*HZ)
 		fpu_swa_count = 0;
-	if (++fpu_swa_count < 5) {
+	if ((++fpu_swa_count < 5) && !(current->thread.flags & IA64_THREAD_FPEMU_NOPRINT)) {
 		last_time = jiffies;
 		printk(KERN_WARNING "%s(%d): floating-point assist fault at ip %016lx\n",
 		       current->comm, current->pid, regs->cr_iip + ia64_psr(regs)->ri);
@@ -478,12 +523,12 @@
 	      case 32: /* fp fault */
 	      case 33: /* fp trap */
 		result = handle_fpu_swa((vector == 32) ? 1 : 0, regs, isr);
-		if (result < 0) {
+		if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) {
 			siginfo.si_signo = SIGFPE;
 			siginfo.si_errno = 0;
 			siginfo.si_code = FPE_FLTINV;
 			siginfo.si_addr = (void *) (regs->cr_iip + ia64_psr(regs)->ri);
-			force_sig(SIGFPE, current);
+			force_sig_info(SIGFPE, &siginfo, current);
 		}
 		return;
 
@@ -510,6 +555,10 @@
 		break;
 
 	      case 46:
+#ifdef CONFIG_IA32_SUPPORT
+		if (ia32_intercept(regs, isr) == 0)
+			return;
+#endif
 		printk("Unexpected IA-32 intercept trap (Trap 46)\n");
 		printk("  iip - 0x%lx, ifa - 0x%lx, isr - 0x%lx, iim - 0x%lx\n",
 		       regs->cr_iip, ifa, isr, iim);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/unaligned.c linux/arch/ia64/kernel/unaligned.c
--- v2.4.14/linux/arch/ia64/kernel/unaligned.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/unaligned.c	Fri Nov  9 14:26:17 2001
@@ -5,6 +5,8 @@
  * Copyright (C) 1999-2000 Stephane Eranian <eranian@hpl.hp.com>
  * Copyright (C) 2001 David Mosberger-Tang <davidm@hpl.hp.com>
  *
+ * 2001/10/11	Fix unaligned access to rotating registers in s/w pipelined loops.
+ * 2001/08/13	Correct size of extended floats (float_fsz) from 16 to 10 bytes.
  * 2001/01/17	Add support emulation of unaligned kernel accesses.
  */
 #include <linux/kernel.h>
@@ -282,9 +284,19 @@
 	unsigned long rnats, nat_mask;
 	unsigned long on_kbs;
 	long sof = (regs->cr_ifs) & 0x7f;
+	long sor = 8 * ((regs->cr_ifs >> 14) & 0xf);
+	long rrb_gr = (regs->cr_ifs >> 18) & 0x7f;
+	long ridx;
+
+	if ((r1 - 32) > sor)
+		ridx = -sof + (r1 - 32);
+	else if ((r1 - 32) < (sor - rrb_gr))
+		ridx = -sof + (r1 - 32) + rrb_gr;
+	else
+		ridx = -sof + (r1 - 32) - (sor - rrb_gr);
 
-	DPRINT("r%lu, sw.bspstore=%lx pt.bspstore=%lx sof=%ld sol=%ld\n",
-	       r1, sw->ar_bspstore, regs->ar_bspstore, sof, (regs->cr_ifs >> 7) & 0x7f);
+	DPRINT("r%lu, sw.bspstore=%lx pt.bspstore=%lx sof=%ld sol=%ld ridx=%ld\n",
+	       r1, sw->ar_bspstore, regs->ar_bspstore, sof, (regs->cr_ifs >> 7) & 0x7f, ridx);
 
 	if ((r1 - 32) >= sof) {
 		/* this should never happen, as the "rsvd register fault" has higher priority */
@@ -293,7 +305,7 @@
 	}
 
 	on_kbs = ia64_rse_num_regs(kbs, (unsigned long *) sw->ar_bspstore);
-	addr = ia64_rse_skip_regs((unsigned long *) sw->ar_bspstore, -sof + (r1 - 32));
+	addr = ia64_rse_skip_regs((unsigned long *) sw->ar_bspstore, ridx);
 	if (addr >= kbs) {
 		/* the register is on the kernel backing store: easy... */
 		rnat_addr = ia64_rse_rnat_addr(addr);
@@ -318,12 +330,12 @@
 		return;
 	}
 
-	bspstore = (unsigned long *) regs->ar_bspstore;
+	bspstore = (unsigned long *)regs->ar_bspstore;
 	ubs_end = ia64_rse_skip_regs(bspstore, on_kbs);
 	bsp     = ia64_rse_skip_regs(ubs_end, -sof);
-	addr    = ia64_rse_skip_regs(bsp, r1 - 32);
+	addr    = ia64_rse_skip_regs(bsp, ridx + sof);
 
-	DPRINT("ubs_end=%p bsp=%p addr=%px\n", (void *) ubs_end, (void *) bsp, (void *) addr);
+	DPRINT("ubs_end=%p bsp=%p addr=%p\n", (void *) ubs_end, (void *) bsp, (void *) addr);
 
 	ia64_poke(current, sw, (unsigned long) ubs_end, (unsigned long) addr, val);
 
@@ -353,9 +365,19 @@
 	unsigned long rnats, nat_mask;
 	unsigned long on_kbs;
 	long sof = (regs->cr_ifs) & 0x7f;
+	long sor = 8 * ((regs->cr_ifs >> 14) & 0xf);
+	long rrb_gr = (regs->cr_ifs >> 18) & 0x7f;
+	long ridx;
+
+	if ((r1 - 32) > sor)
+		ridx = -sof + (r1 - 32);
+	else if ((r1 - 32) < (sor - rrb_gr))
+		ridx = -sof + (r1 - 32) + rrb_gr;
+	else
+		ridx = -sof + (r1 - 32) - (sor - rrb_gr);
 
-	DPRINT("r%lu, sw.bspstore=%lx pt.bspstore=%lx sof=%ld sol=%ld\n",
-	       r1, sw->ar_bspstore, regs->ar_bspstore, sof, (regs->cr_ifs >> 7) & 0x7f);
+	DPRINT("r%lu, sw.bspstore=%lx pt.bspstore=%lx sof=%ld sol=%ld ridx=%ld\n",
+	       r1, sw->ar_bspstore, regs->ar_bspstore, sof, (regs->cr_ifs >> 7) & 0x7f, ridx);
 
 	if ((r1 - 32) >= sof) {
 		/* this should never happen, as the "rsvd register fault" has higher priority */
@@ -364,7 +386,7 @@
 	}
 
 	on_kbs = ia64_rse_num_regs(kbs, (unsigned long *) sw->ar_bspstore);
-	addr = ia64_rse_skip_regs((unsigned long *) sw->ar_bspstore, -sof + (r1 - 32));
+	addr = ia64_rse_skip_regs((unsigned long *) sw->ar_bspstore, ridx);
 	if (addr >= kbs) {
 		/* the register is on the kernel backing store: easy... */
 		*val = *addr;
@@ -390,7 +412,7 @@
 	bspstore = (unsigned long *)regs->ar_bspstore;
 	ubs_end = ia64_rse_skip_regs(bspstore, on_kbs);
 	bsp     = ia64_rse_skip_regs(ubs_end, -sof);
-	addr    = ia64_rse_skip_regs(bsp, r1 - 32);
+	addr    = ia64_rse_skip_regs(bsp, ridx + sof);
 
 	DPRINT("ubs_end=%p bsp=%p addr=%p\n", (void *) ubs_end, (void *) bsp, (void *) addr);
 
@@ -908,7 +930,7 @@
  * floating point operations sizes in bytes
  */
 static const unsigned char float_fsz[4]={
-	16, /* extended precision (e) */
+	10, /* extended precision (e) */
 	8,  /* integer (8)            */
 	4,  /* single precision (s)   */
 	8   /* double precision (d)   */
@@ -978,11 +1000,11 @@
 	unsigned long len = float_fsz[ld.x6_sz];
 
 	/*
-	 * fr0 & fr1 don't need to be checked because Illegal Instruction
-	 * faults have higher priority than unaligned faults.
+	 * fr0 & fr1 don't need to be checked because Illegal Instruction faults have
+	 * higher priority than unaligned faults.
 	 *
-	 * r0 cannot be found as the base as it would never generate an
-	 * unaligned reference.
+	 * r0 cannot be found as the base as it would never generate an unaligned
+	 * reference.
 	 */
 
 	/*
@@ -996,8 +1018,10 @@
 	 * invalidate the ALAT entry and execute updates, if any.
 	 */
 	if (ld.x6_op != 0x2) {
-		/* this assumes little-endian byte-order: */
-
+		/*
+		 * This assumes little-endian byte-order.  Note that there is no "ldfpe"
+		 * instruction:
+		 */
 		if (copy_from_user(&fpr_init[0], (void *) ifa, len)
 		    || copy_from_user(&fpr_init[1], (void *) (ifa + len), len))
 			return -1;
@@ -1337,7 +1361,7 @@
 
 	/*
 	 * IMPORTANT:
-	 * Notice that the swictch statement DOES not cover all possible instructions
+	 * Notice that the switch statement DOES not cover all possible instructions
 	 * that DO generate unaligned references. This is made on purpose because for some
 	 * instructions it DOES NOT make sense to try and emulate the access. Sometimes it
 	 * is WRONG to try and emulate. Here is a list of instruction we don't emulate i.e.,
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/kernel/unwind.c linux/arch/ia64/kernel/unwind.c
--- v2.4.14/linux/arch/ia64/kernel/unwind.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/kernel/unwind.c	Fri Nov  9 14:26:17 2001
@@ -504,7 +504,7 @@
 	return 0;
 }
 
-inline int
+int
 unw_access_pr (struct unw_frame_info *info, unsigned long *val, int write)
 {
 	unsigned long *addr;
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/clear_page.S linux/arch/ia64/lib/clear_page.S
--- v2.4.14/linux/arch/ia64/lib/clear_page.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/lib/clear_page.S	Fri Nov  9 14:26:17 2001
@@ -47,5 +47,5 @@
 	br.cloop.dptk.few 1b
 	;;
 	mov ar.lc = r2		// restore lc
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(clear_page)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/clear_user.S linux/arch/ia64/lib/clear_user.S
--- v2.4.14/linux/arch/ia64/lib/clear_user.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/lib/clear_user.S	Fri Nov  9 14:26:17 2001
@@ -8,7 +8,7 @@
  *	r8:	number of bytes that didn't get cleared due to a fault
  *
  * Copyright (C) 1998, 1999, 2001 Hewlett-Packard Co
- * Copyright (C) 1999 Stephane Eranian <eranian@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
  */
 
 #include <asm/asmmacro.h>
@@ -62,11 +62,11 @@
 	;;				// avoid WAW on CFM
 	adds tmp=-1,len			// br.ctop is repeat/until
 	mov ret0=len			// return value is length at this point
-(p6)	br.ret.spnt.few rp
+(p6)	br.ret.spnt.many rp
 	;;
 	cmp.lt p6,p0=16,len		// if len > 16 then long memset
 	mov ar.lc=tmp			// initialize lc for small count
-(p6)	br.cond.dptk.few long_do_clear
+(p6)	br.cond.dptk .long_do_clear
 	;;				// WAR on ar.lc
 	//
 	// worst case 16 iterations, avg 8 iterations
@@ -79,7 +79,7 @@
 1:
 	EX( .Lexit1, st1 [buf]=r0,1 )
 	adds len=-1,len			// countdown length using len
-	br.cloop.dptk.few 1b
+	br.cloop.dptk 1b
 	;;				// avoid RAW on ar.lc
 	//
 	// .Lexit4: comes from byte by byte loop
@@ -87,7 +87,7 @@
 .Lexit1:
 	mov ret0=len			// faster than using ar.lc
 	mov ar.lc=saved_lc
-	br.ret.sptk.few rp		// end of short clear_user
+	br.ret.sptk.many rp		// end of short clear_user
 
 
 	//
@@ -98,7 +98,7 @@
 	// instead of ret0 is due to the fact that the exception code
 	// changes the values of r8.
 	//
-long_do_clear:
+.long_do_clear:
 	tbit.nz p6,p0=buf,0		// odd alignment (for long_do_clear)
 	;;
 	EX( .Lexit3, (p6) st1 [buf]=r0,1 )	// 1-byte aligned
@@ -119,7 +119,7 @@
 	;;
 	cmp.eq p6,p0=r0,cnt
 	adds tmp=-1,cnt
-(p6)	br.cond.dpnt.few .dotail	// we have less than 16 bytes left
+(p6)	br.cond.dpnt .dotail		// we have less than 16 bytes left
 	;;
 	adds buf2=8,buf			// setup second base pointer
 	mov ar.lc=tmp
@@ -148,7 +148,7 @@
 	;;				// needed to get len correct when error
 	st8 [buf2]=r0,16
 	adds len=-16,len
-	br.cloop.dptk.few 2b
+	br.cloop.dptk 2b
 	;;
 	mov ar.lc=saved_lc
 	//
@@ -178,7 +178,7 @@
 	;;
 	EX( .Lexit2, (p7) st1 [buf]=r0 )	// only 1 byte left
 	mov ret0=r0				// success
-	br.ret.dptk.few rp			// end of most likely path
+	br.ret.sptk.many rp			// end of most likely path
 
 	//
 	// Outlined error handling code
@@ -205,5 +205,5 @@
 .Lexit3:
 	mov ret0=len
 	mov ar.lc=saved_lc
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 END(__do_clear_user)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/copy_page.S linux/arch/ia64/lib/copy_page.S
--- v2.4.14/linux/arch/ia64/lib/copy_page.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/lib/copy_page.S	Fri Nov  9 14:26:17 2001
@@ -90,5 +90,5 @@
 	mov pr=saved_pr,0xffffffffffff0000	// restore predicates
 	mov ar.pfs=saved_pfs
 	mov ar.lc=saved_lc
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(copy_page)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/copy_user.S linux/arch/ia64/lib/copy_user.S
--- v2.4.14/linux/arch/ia64/lib/copy_user.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/lib/copy_user.S	Fri Nov  9 14:26:17 2001
@@ -19,8 +19,8 @@
  *	ret0	0 in case of success. The number of bytes NOT copied in
  *		case of error.
  *
- * Copyright (C) 2000 Hewlett-Packard Co
- * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
+ * Copyright (C) 2000-2001 Hewlett-Packard Co
+ *	Stephane Eranian <eranian@hpl.hp.com>
  *
  * Fixme:
  *	- handle the case where we have more than 16 bytes and the alignment
@@ -85,7 +85,7 @@
 	cmp.eq p8,p0=r0,len	// check for zero length
 	.save ar.lc, saved_lc
 	mov saved_lc=ar.lc	// preserve ar.lc (slow)
-(p8)	br.ret.spnt.few rp	// empty mempcy()
+(p8)	br.ret.spnt.many rp	// empty mempcy()
 	;;
 	add enddst=dst,len	// first byte after end of source
 	add endsrc=src,len	// first byte after end of destination
@@ -103,26 +103,26 @@
 	cmp.lt p10,p7=COPY_BREAK,len	// if len > COPY_BREAK then long copy
 
 	xor tmp=src,dst		// same alignment test prepare
-(p10)	br.cond.dptk.few long_copy_user
+(p10)	br.cond.dptk .long_copy_user
 	;;			// RAW pr.rot/p16 ?
 	//
 	// Now we do the byte by byte loop with software pipeline
 	//
 	// p7 is necessarily false by now
 1:
-	EX(failure_in_pipe1,(p16) ld1 val1[0]=[src1],1)
-	EX(failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
+	EX(.failure_in_pipe1,(p16) ld1 val1[0]=[src1],1)
+	EX(.failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
 	br.ctop.dptk.few 1b
 	;;
 	mov ar.lc=saved_lc
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.pfs=saved_pfs		// restore ar.ec
-	br.ret.sptk.few rp	// end of short memcpy
+	br.ret.sptk.many rp		// end of short memcpy
 
 	//
 	// Not 8-byte aligned
 	//
-diff_align_copy_user:
+.diff_align_copy_user:
 	// At this point we know we have more than 16 bytes to copy
 	// and also that src and dest do _not_ have the same alignment.
 	and src2=0x7,src1				// src offset
@@ -153,7 +153,7 @@
 	// We know src1 is not 8-byte aligned in this case.
 	//
 	cmp.eq p14,p15=r0,dst2
-(p15)	br.cond.spnt.few 1f
+(p15)	br.cond.spnt 1f
 	;;
 	sub t1=8,src2
 	mov t2=src2
@@ -163,7 +163,7 @@
 	;;
 	sub lshift=64,rshift
 	;;
-	br.cond.spnt.few word_copy_user
+	br.cond.spnt .word_copy_user
 	;;
 1:
 	cmp.leu	p14,p15=src2,dst2
@@ -192,15 +192,15 @@
 	mov ar.lc=cnt
 	;;
 2:
-	EX(failure_in_pipe2,(p16) ld1 val1[0]=[src1],1)
-	EX(failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
+	EX(.failure_in_pipe2,(p16) ld1 val1[0]=[src1],1)
+	EX(.failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
 	br.ctop.dptk.few 2b
 	;;
 	clrrrb
 	;;
-word_copy_user:
+.word_copy_user:
 	cmp.gtu p9,p0=16,len1
-(p9)	br.cond.spnt.few 4f		// if (16 > len1) skip 8-byte copy
+(p9)	br.cond.spnt 4f			// if (16 > len1) skip 8-byte copy
 	;;
 	shr.u cnt=len1,3		// number of 64-bit words
 	;;
@@ -232,24 +232,24 @@
 #define EPI_1		p[PIPE_DEPTH-2]
 #define SWITCH(pred, shift)	cmp.eq pred,p0=shift,rshift
 #define CASE(pred, shift)	\
-	(pred)	br.cond.spnt.few copy_user_bit##shift
+	(pred)	br.cond.spnt .copy_user_bit##shift
 #define BODY(rshift)						\
-copy_user_bit##rshift:						\
+.copy_user_bit##rshift:						\
 1:								\
-	EX(failure_out,(EPI) st8 [dst1]=tmp,8);			\
+	EX(.failure_out,(EPI) st8 [dst1]=tmp,8);		\
 (EPI_1) shrp tmp=val1[PIPE_DEPTH-3],val1[PIPE_DEPTH-2],rshift;	\
 	EX(3f,(p16) ld8 val1[0]=[src1],8);			\
-	br.ctop.dptk.few 1b;					\
+	br.ctop.dptk 1b;					\
 	;;							\
-	br.cond.sptk.few .diff_align_do_tail;			\
+	br.cond.sptk.many .diff_align_do_tail;			\
 2:								\
 (EPI)	st8 [dst1]=tmp,8;					\
 (EPI_1)	shrp tmp=val1[PIPE_DEPTH-3],val1[PIPE_DEPTH-2],rshift;	\
 3:								\
 (p16)	mov val1[0]=r0;						\
-	br.ctop.dptk.few 2b;					\
+	br.ctop.dptk 2b;					\
 	;;							\
-	br.cond.sptk.few failure_in2
+	br.cond.sptk.many .failure_in2
 
 	//
 	// Since the instruction 'shrp' requires a fixed 128-bit value
@@ -301,25 +301,25 @@
 	mov ar.lc=len1
 	;;
 5:
-	EX(failure_in_pipe1,(p16) ld1 val1[0]=[src1],1)
-	EX(failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
+	EX(.failure_in_pipe1,(p16) ld1 val1[0]=[src1],1)
+	EX(.failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
 	br.ctop.dptk.few 5b
 	;;
 	mov ar.lc=saved_lc
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.pfs=saved_pfs
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 
 	//
 	// Beginning of long mempcy (i.e. > 16 bytes)
 	//
-long_copy_user:
+.long_copy_user:
 	tbit.nz p6,p7=src1,0	// odd alignement
 	and tmp=7,tmp
 	;;
 	cmp.eq p10,p8=r0,tmp
 	mov len1=len		// copy because of rotation
-(p8)	br.cond.dpnt.few diff_align_copy_user
+(p8)	br.cond.dpnt .diff_align_copy_user
 	;;
 	// At this point we know we have more than 16 bytes to copy
 	// and also that both src and dest have the same alignment
@@ -327,11 +327,11 @@
 	// forward slowly until we reach 16byte alignment: no need to
 	// worry about reaching the end of buffer.
 	//
-	EX(failure_in1,(p6) ld1 val1[0]=[src1],1)	// 1-byte aligned
+	EX(.failure_in1,(p6) ld1 val1[0]=[src1],1)	// 1-byte aligned
 (p6)	adds len1=-1,len1;;
 	tbit.nz p7,p0=src1,1
 	;;
-	EX(failure_in1,(p7) ld2 val1[1]=[src1],2)	// 2-byte aligned
+	EX(.failure_in1,(p7) ld2 val1[1]=[src1],2)	// 2-byte aligned
 (p7)	adds len1=-2,len1;;
 	tbit.nz p8,p0=src1,2
 	;;
@@ -339,28 +339,28 @@
 	// Stop bit not required after ld4 because if we fail on ld4
 	// we have never executed the ld1, therefore st1 is not executed.
 	//
-	EX(failure_in1,(p8) ld4 val2[0]=[src1],4)	// 4-byte aligned
+	EX(.failure_in1,(p8) ld4 val2[0]=[src1],4)	// 4-byte aligned
 	;;
-	EX(failure_out,(p6) st1 [dst1]=val1[0],1)
+	EX(.failure_out,(p6) st1 [dst1]=val1[0],1)
 	tbit.nz p9,p0=src1,3
 	;;
 	//
 	// Stop bit not required after ld8 because if we fail on ld8
 	// we have never executed the ld2, therefore st2 is not executed.
 	//
-	EX(failure_in1,(p9) ld8 val2[1]=[src1],8)	// 8-byte aligned
-	EX(failure_out,(p7) st2 [dst1]=val1[1],2)
+	EX(.failure_in1,(p9) ld8 val2[1]=[src1],8)	// 8-byte aligned
+	EX(.failure_out,(p7) st2 [dst1]=val1[1],2)
 (p8)	adds len1=-4,len1
 	;;
-	EX(failure_out, (p8) st4 [dst1]=val2[0],4)
+	EX(.failure_out, (p8) st4 [dst1]=val2[0],4)
 (p9)	adds len1=-8,len1;;
 	shr.u cnt=len1,4		// number of 128-bit (2x64bit) words
 	;;
-	EX(failure_out, (p9) st8 [dst1]=val2[1],8)
+	EX(.failure_out, (p9) st8 [dst1]=val2[1],8)
 	tbit.nz p6,p0=len1,3
 	cmp.eq p7,p0=r0,cnt
 	adds tmp=-1,cnt			// br.ctop is repeat/until
-(p7)	br.cond.dpnt.few .dotail	// we have less than 16 bytes left
+(p7)	br.cond.dpnt .dotail		// we have less than 16 bytes left
 	;;
 	adds src2=8,src1
 	adds dst2=8,dst1
@@ -370,12 +370,12 @@
 	// 16bytes/iteration
 	//
 2:
-	EX(failure_in3,(p16) ld8 val1[0]=[src1],16)
+	EX(.failure_in3,(p16) ld8 val1[0]=[src1],16)
 (p16)	ld8 val2[0]=[src2],16
 
-	EX(failure_out, (EPI)	st8 [dst1]=val1[PIPE_DEPTH-1],16)
+	EX(.failure_out, (EPI)	st8 [dst1]=val1[PIPE_DEPTH-1],16)
 (EPI)	st8 [dst2]=val2[PIPE_DEPTH-1],16
-	br.ctop.dptk.few 2b
+	br.ctop.dptk 2b
 	;;			// RAW on src1 when fall through from loop
 	//
 	// Tail correction based on len only
@@ -384,29 +384,28 @@
 	// is 16 byte aligned AND we have less than 16 bytes to copy.
 	//
 .dotail:
-	EX(failure_in1,(p6) ld8 val1[0]=[src1],8)	// at least 8 bytes
+	EX(.failure_in1,(p6) ld8 val1[0]=[src1],8)	// at least 8 bytes
 	tbit.nz p7,p0=len1,2
 	;;
-	EX(failure_in1,(p7) ld4 val1[1]=[src1],4)	// at least 4 bytes
+	EX(.failure_in1,(p7) ld4 val1[1]=[src1],4)	// at least 4 bytes
 	tbit.nz p8,p0=len1,1
 	;;
-	EX(failure_in1,(p8) ld2 val2[0]=[src1],2)	// at least 2 bytes
+	EX(.failure_in1,(p8) ld2 val2[0]=[src1],2)	// at least 2 bytes
 	tbit.nz p9,p0=len1,0
 	;;
-	EX(failure_out, (p6) st8 [dst1]=val1[0],8)
+	EX(.failure_out, (p6) st8 [dst1]=val1[0],8)
 	;;
-	EX(failure_in1,(p9) ld1 val2[1]=[src1])		// only 1 byte left
+	EX(.failure_in1,(p9) ld1 val2[1]=[src1])	// only 1 byte left
 	mov ar.lc=saved_lc
 	;;
-	EX(failure_out,(p7) st4 [dst1]=val1[1],4)
+	EX(.failure_out,(p7) st4 [dst1]=val1[1],4)
 	mov pr=saved_pr,0xffffffffffff0000
 	;;
-	EX(failure_out, (p8)	st2 [dst1]=val2[0],2)
+	EX(.failure_out, (p8)	st2 [dst1]=val2[0],2)
 	mov ar.pfs=saved_pfs
 	;;
-	EX(failure_out, (p9)	st1 [dst1]=val2[1])
-	br.ret.dptk.few rp
-
+	EX(.failure_out, (p9)	st1 [dst1]=val2[1])
+	br.ret.sptk.many rp
 
 
 	//
@@ -433,32 +432,32 @@
 	//	  pipeline going. We can't really do this inline because
 	//	  p16 is always reset to 1 when lc > 0.
 	//
-failure_in_pipe1:
+.failure_in_pipe1:
 	sub ret0=endsrc,src1	// number of bytes to zero, i.e. not copied
 1:
 (p16)	mov val1[0]=r0
 (EPI)	st1 [dst1]=val1[PIPE_DEPTH-1],1
-	br.ctop.dptk.few 1b
+	br.ctop.dptk 1b
 	;;
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.lc=saved_lc
 	mov ar.pfs=saved_pfs
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 
 	//
 	// This is the case where the byte by byte copy fails on the load
 	// when we copy the head. We need to finish the pipeline and copy
 	// zeros for the rest of the destination. Since this happens
 	// at the top we still need to fill the body and tail.
-failure_in_pipe2:
+.failure_in_pipe2:
 	sub ret0=endsrc,src1	// number of bytes to zero, i.e. not copied
 2:
 (p16)	mov val1[0]=r0
 (EPI)	st1 [dst1]=val1[PIPE_DEPTH-1],1
-	br.ctop.dptk.few 2b
+	br.ctop.dptk 2b
 	;;
 	sub len=enddst,dst1,1		// precompute len
-	br.cond.dptk.few failure_in1bis
+	br.cond.dptk.many .failure_in1bis
 	;;
 
 	//
@@ -533,9 +532,7 @@
 	// This means that we are in a situation similar the a fault in the
 	// head part. That's nice!
 	//
-failure_in1:
-//	sub ret0=enddst,dst1	// number of bytes to zero, i.e. not copied
-//	sub len=enddst,dst1,1
+.failure_in1:
 	sub ret0=endsrc,src1	// number of bytes to zero, i.e. not copied
 	sub len=endsrc,src1,1
 	//
@@ -546,18 +543,17 @@
 	// calling side.
 	//
 	;;
-failure_in1bis:			// from (failure_in3)
+.failure_in1bis:		// from (.failure_in3)
 	mov ar.lc=len		// Continue with a stupid byte store.
 	;;
 5:
 	st1 [dst1]=r0,1
-	br.cloop.dptk.few 5b
+	br.cloop.dptk 5b
 	;;
-skip_loop:
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.lc=saved_lc
 	mov ar.pfs=saved_pfs
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 
 	//
 	// Here we simply restart the loop but instead
@@ -569,7 +565,7 @@
 	// we MUST use src1/endsrc here and not dst1/enddst because
 	// of the pipeline effect.
 	//
-failure_in3:
+.failure_in3:
 	sub ret0=endsrc,src1	// number of bytes to zero, i.e. not copied
 	;;
 2:
@@ -577,36 +573,36 @@
 (p16)	mov val2[0]=r0
 (EPI)	st8 [dst1]=val1[PIPE_DEPTH-1],16
 (EPI)	st8 [dst2]=val2[PIPE_DEPTH-1],16
-	br.ctop.dptk.few 2b
+	br.ctop.dptk 2b
 	;;
 	cmp.ne p6,p0=dst1,enddst	// Do we need to finish the tail ?
 	sub len=enddst,dst1,1		// precompute len
-(p6)	br.cond.dptk.few failure_in1bis
+(p6)	br.cond.dptk .failure_in1bis
 	;;
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.lc=saved_lc
 	mov ar.pfs=saved_pfs
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 
-failure_in2:
+.failure_in2:
 	sub ret0=endsrc,src1
 	cmp.ne p6,p0=dst1,enddst	// Do we need to finish the tail ?
 	sub len=enddst,dst1,1		// precompute len
-(p6)	br.cond.dptk.few failure_in1bis
+(p6)	br.cond.dptk .failure_in1bis
 	;;
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.lc=saved_lc
 	mov ar.pfs=saved_pfs
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 
 	//
 	// handling of failures on stores: that's the easy part
 	//
-failure_out:
+.failure_out:
 	sub ret0=enddst,dst1
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.lc=saved_lc
 
 	mov ar.pfs=saved_pfs
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 END(__copy_user)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/do_csum.S linux/arch/ia64/lib/do_csum.S
--- v2.4.14/linux/arch/ia64/lib/do_csum.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/lib/do_csum.S	Fri Nov  9 14:26:17 2001
@@ -16,7 +16,6 @@
  *		back-to-back 8-byte words per loop. Clean up the initialization
  *		for the loop. Support the cases where load latency = 1 or 2.
  *		Set CONFIG_IA64_LOAD_LATENCY to 1 or 2 (default).
- *
  */
 
 #include <asm/asmmacro.h>
@@ -130,7 +129,7 @@
 	;;			// avoid WAW on CFM
 	mov tmp3=0x7		// a temporary mask/value
 	add tmp1=buf,len	// last byte's address
-(p6)	br.ret.spnt.few rp	// return if true (hope we can avoid that)
+(p6)	br.ret.spnt.many rp	// return if true (hope we can avoid that)
 
 	and firstoff=7,buf	// how many bytes off for first1 element
 	tbit.nz p15,p0=buf,0	// is buf an odd address ?
@@ -181,9 +180,9 @@
 	cmp.ltu p6,p0=result1[0],word1[0]	// check the carry
 	;;
 (p6)	adds result1[0]=1,result1[0]
-(p8)	br.cond.dptk.few do_csum_exit	// if (within an 8-byte word)
+(p8)	br.cond.dptk .do_csum_exit	// if (within an 8-byte word)
 	;;
-(p11)	br.cond.dptk.few do_csum16	// if (count is even)
+(p11)	br.cond.dptk .do_csum16		// if (count is even)
 	;;
 	// Here count is odd.
 	ld8 word1[1]=[first1],8		// load an 8-byte word
@@ -196,14 +195,14 @@
 	;;
 (p6)	adds result1[0]=1,result1[0]
 	;;
-(p9)	br.cond.sptk.few do_csum_exit	// if (count == 1) exit
+(p9)	br.cond.sptk .do_csum_exit	// if (count == 1) exit
 	// Fall through to caluculate the checksum, feeding result1[0] as
 	// the initial value in result1[0].
 	;;
 	//
 	// Calculate the checksum loading two 8-byte words per loop.
 	//
-do_csum16:
+.do_csum16:
 	mov saved_lc=ar.lc
 	shr.u count=count,1	// we do 16 bytes per loop
 	;;
@@ -225,7 +224,7 @@
 	;;
 	add first2=8,first1
 	;;
-(p9)	br.cond.sptk.few do_csum_exit
+(p9)	br.cond.sptk .do_csum_exit
 	;;
 	nop.m	0
 	nop.i	0
@@ -241,7 +240,7 @@
 2:
 (p16)	ld8 word1[0]=[first1],16
 (p16)	ld8 word2[0]=[first2],16
-	br.ctop.sptk.few 1b
+	br.ctop.sptk 1b
 	;;
 	// Since len is a 32-bit value, carry cannot be larger than
 	// a 64-bit value.
@@ -263,7 +262,7 @@
 	;;
 (p6)	adds result1[0]=1,result1[0]
 	;;
-do_csum_exit:
+.do_csum_exit:
 	movl tmp3=0xffffffff
 	;;
 	// XXX Fixme
@@ -299,7 +298,7 @@
 	;;
 	mov ar.lc=saved_lc
 (p15)	shr.u ret0=ret0,64-16	// + shift back to position = swap bytes
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 
 //	I (Jun Nakajima) wrote an equivalent code (see below), but it was
 //	not much better than the original. So keep the original there so that
@@ -331,6 +330,6 @@
 //(p15)	mux1 ret0=ret0,@rev		// reverse word
 //	;;
 //(p15)	shr.u ret0=ret0,64-16	// + shift back to position = swap bytes
-//	br.ret.sptk.few rp
+//	br.ret.sptk.many rp
 
 END(do_csum)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/idiv32.S linux/arch/ia64/lib/idiv32.S
--- v2.4.14/linux/arch/ia64/lib/idiv32.S	Mon Oct  9 17:54:56 2000
+++ linux/arch/ia64/lib/idiv32.S	Fri Nov  9 14:26:17 2001
@@ -79,5 +79,5 @@
 	;;
 #endif
 	getf.sig r8 = f6		// transfer result to result register
-	br.ret.sptk rp
+	br.ret.sptk.many rp
 END(NAME)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/idiv64.S linux/arch/ia64/lib/idiv64.S
--- v2.4.14/linux/arch/ia64/lib/idiv64.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/idiv64.S	Fri Nov  9 14:26:17 2001
@@ -89,5 +89,5 @@
 #endif
 	getf.sig r8 = f17		// transfer result to result register
 	ldf.fill f17 = [sp]
-	br.ret.sptk rp
+	br.ret.sptk.many rp
 END(NAME)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/memcpy.S linux/arch/ia64/lib/memcpy.S
--- v2.4.14/linux/arch/ia64/lib/memcpy.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/memcpy.S	Fri Nov  9 14:26:17 2001
@@ -9,20 +9,14 @@
  * Output:
  * 	no return value
  *
- * Copyright (C) 2000 Hewlett-Packard Co
- * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 2000-2001 Hewlett-Packard Co
+ *	Stephane Eranian <eranian@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 #include <linux/config.h>
 
 #include <asm/asmmacro.h>
 
-#if defined(CONFIG_ITANIUM_B0_SPECIFIC) || defined(CONFIG_ITANIUM_B1_SPECIFIC)
-# define BRP(args...)	nop.b 0
-#else
-# define BRP(args...)	brp.loop.imp args
-#endif
-
 GLOBAL_ENTRY(bcopy)
 	.regstk 3,0,0,0
 	mov r8=in0
@@ -103,8 +97,8 @@
 	cmp.ne p6,p0=t0,r0
 
 	mov src=in1		// copy because of rotation
-(p7)	br.cond.spnt.few memcpy_short
-(p6)	br.cond.spnt.few memcpy_long
+(p7)	br.cond.spnt.few .memcpy_short
+(p6)	br.cond.spnt.few .memcpy_long
 	;;
 	nop.m	0
 	;;
@@ -119,7 +113,7 @@
 1: { .mib
 (p[0])	ld8 val[0]=[src],8
 	nop.i 0
-	BRP(1b, 2f)
+	brp.loop.imp 1b, 2f
 }
 2: { .mfb
 (p[N-1])st8 [dst]=val[N-1],8
@@ -139,14 +133,14 @@
 	 * issues, we want to avoid read-modify-write of entire words.
 	 */
 	.align 32
-memcpy_short:
+.memcpy_short:
 	adds cnt=-1,in2		// br.ctop is repeat/until
 	mov ar.ec=MEM_LAT
-	BRP(1f, 2f)
+	brp.loop.imp 1f, 2f
 	;;
 	mov ar.lc=cnt
 	;;
-	nop.m	0			
+	nop.m	0
 	;;
 	nop.m	0
 	nop.i	0
@@ -163,7 +157,7 @@
 1: { .mib
 (p[0])	ld1 val[0]=[src],1
 	nop.i 0
-	BRP(1b, 2f)
+	brp.loop.imp 1b, 2f
 } ;;
 2: { .mfb
 (p[MEM_LAT-1])st1 [dst]=val[MEM_LAT-1],1
@@ -202,7 +196,7 @@
 
 #define LOG_LOOP_SIZE	6
 
-memcpy_long:
+.memcpy_long:
 	alloc t3=ar.pfs,3,Nrot,0,Nrot	// resize register frame
 	and t0=-8,src		// t0 = src & ~7
 	and t2=7,src		// t2 = src & 7
@@ -247,7 +241,7 @@
 	mov t4=ip
   }	;;
 	and src2=-8,src			// align source pointer
-	adds t4=memcpy_loops-1b,t4
+	adds t4=.memcpy_loops-1b,t4
 	mov ar.ec=N
 
 	and t0=7,src			// t0 = src & 7
@@ -266,7 +260,7 @@
 	mov pr=cnt,0x38			// set (p5,p4,p3) to # of bytes last-word bytes to copy
 	mov ar.lc=t2
 	;;
-	nop.m	0			
+	nop.m	0
 	;;
 	nop.m	0
 	nop.i	0
@@ -278,7 +272,7 @@
 	br.sptk.few b6
 	;;
 
-memcpy_tail:
+.memcpy_tail:
 	// At this point, (p5,p4,p3) are set to the number of bytes left to copy (which is
 	// less than 8) and t0 contains the last few bytes of the src buffer:
 (p5)	st4 [dst]=t0,4
@@ -300,7 +294,7 @@
  1: { .mib											\
 	(p[0])		ld8 val[0]=[src2],8;							\
 	(p[MEM_LAT+3])	shrp w[0]=val[MEM_LAT+3],val[MEM_LAT+4-index],shift;			\
-			BRP(1b, 2f)								\
+			brp.loop.imp 1b, 2f							\
     };												\
  2: { .mfb											\
 	(p[MEM_LAT+4])	st8 [dst]=w[1],8;							\
@@ -311,8 +305,8 @@
 			ld8 val[N-1]=[src_end];	/* load last word (may be same as val[N]) */	\
 			;;									\
 			shrp t0=val[N-1],val[N-index],shift;					\
-			br memcpy_tail
-memcpy_loops:
+			br .memcpy_tail
+.memcpy_loops:
 	COPY(0, 1) /* no point special casing this---it doesn't go any faster without shrp */
 	COPY(8, 0)
 	COPY(16, 0)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/memset.S linux/arch/ia64/lib/memset.S
--- v2.4.14/linux/arch/ia64/lib/memset.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/memset.S	Fri Nov  9 14:26:17 2001
@@ -43,11 +43,11 @@
 
 	adds tmp=-1,len		// br.ctop is repeat/until
 	tbit.nz p6,p0=buf,0	// odd alignment
-(p8)	br.ret.spnt.few rp
+(p8)	br.ret.spnt.many rp
 
 	cmp.lt p7,p0=16,len	// if len > 16 then long memset
 	mux1 val=val,@brcst	// prepare value
-(p7)	br.cond.dptk.few long_memset
+(p7)	br.cond.dptk .long_memset
 	;;
 	mov ar.lc=tmp		// initialize lc for small count
 	;;			// avoid RAW and WAW on ar.lc
@@ -57,11 +57,11 @@
 	;;				// avoid RAW on ar.lc
 	mov ar.lc=saved_lc
 	mov ar.pfs=saved_pfs
-	br.ret.sptk.few rp	// end of short memset
+	br.ret.sptk.many rp	// end of short memset
 
 	// at this point we know we have more than 16 bytes to copy
 	// so we focus on alignment
-long_memset:
+.long_memset:
 (p6)	st1 [buf]=val,1		// 1-byte aligned
 (p6)	adds len=-1,len;;	// sync because buf is modified
 	tbit.nz p6,p0=buf,1
@@ -80,7 +80,7 @@
 	;;
 	cmp.eq p6,p0=r0,cnt
 	adds tmp=-1,cnt
-(p6)	br.cond.dpnt.few .dotail // we have less than 16 bytes left
+(p6)	br.cond.dpnt .dotail	// we have less than 16 bytes left
 	;;
 	adds buf2=8,buf		// setup second base pointer
 	mov ar.lc=tmp
@@ -104,5 +104,5 @@
 	mov ar.lc=saved_lc
 	;;
 (p6)	st1 [buf]=val		// only 1 byte left
-	br.ret.dptk.few rp
+	br.ret.sptk.many rp
 END(memset)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/strlen.S linux/arch/ia64/lib/strlen.S
--- v2.4.14/linux/arch/ia64/lib/strlen.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/strlen.S	Fri Nov  9 14:26:17 2001
@@ -11,7 +11,7 @@
  *	does not count the \0
  *
  * Copyright (C) 1999, 2001 Hewlett-Packard Co
- * Copyright (C) 1999 Stephane Eranian <eranian@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
  *
  * 09/24/99 S.Eranian add speculation recovery code
  */
@@ -116,7 +116,7 @@
 	ld8.s w[0]=[src],8	// speculatively load next to next
 	cmp.eq.and p6,p0=8,val1	// p6 = p6 and val1==8
 	cmp.eq.and p6,p0=8,val2	// p6 = p6 and mask==8
-(p6)	br.wtop.dptk.few 1b	// loop until p6 == 0
+(p6)	br.wtop.dptk 1b		// loop until p6 == 0
 	;;
 	//
 	// We must return try the recovery code iff
@@ -127,14 +127,14 @@
 	//
 	cmp.eq  p8,p9=8,val1	// p6 = val1 had zero (disambiguate)
 	tnat.nz p6,p7=val1	// test NaT on val1
-(p6)	br.cond.spnt.few recover// jump to recovery if val1 is NaT
+(p6)	br.cond.spnt .recover	// jump to recovery if val1 is NaT
 	;;
 	//
 	// if we come here p7 is true, i.e., initialized for // cmp
 	//
 	cmp.eq.and  p7,p0=8,val1// val1==8?
 	tnat.nz.and p7,p0=val2	// test NaT if val2
-(p7)	br.cond.spnt.few recover// jump to recovery if val2 is NaT
+(p7)	br.cond.spnt .recover	// jump to recovery if val2 is NaT
 	;;
 (p8)	mov val1=val2		// the other test got us out of the loop
 (p8)	adds src=-16,src	// correct position when 3 ahead
@@ -146,7 +146,7 @@
 	;;
 	sub ret0=ret0,tmp	// adjust
 	mov ar.pfs=saved_pfs	// because of ar.ec, restore no matter what
-	br.ret.sptk.few rp	// end of normal execution
+	br.ret.sptk.many rp	// end of normal execution
 
 	//
 	// Outlined recovery code when speculation failed
@@ -165,7 +165,7 @@
 	//	- today we restart from the beginning of the string instead
 	//	  of trying to continue where we left off.
 	//
-recover:
+.recover:
 	ld8 val=[base],8	// will fail if unrecoverable fault
 	;;
 	or val=val,mask		// remask first bytes
@@ -180,7 +180,7 @@
 	czx1.r val1=val		// search 0 byte from right
 	;;
 	cmp.eq p6,p0=8,val1	// val1==8 ?
-(p6)	br.wtop.dptk.few 2b	// loop until p6 == 0
+(p6)	br.wtop.dptk 2b		// loop until p6 == 0
 	;;			// (avoid WAW on p63)
 	sub ret0=base,orig	// distance from base
 	sub tmp=8,val1
@@ -188,5 +188,5 @@
 	;;
 	sub ret0=ret0,tmp	// length=now - back -1
 	mov ar.pfs=saved_pfs	// because of ar.ec, restore no matter what
-	br.ret.sptk.few rp	// end of successful recovery code
+	br.ret.sptk.many rp	// end of successful recovery code
 END(strlen)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/strlen_user.S linux/arch/ia64/lib/strlen_user.S
--- v2.4.14/linux/arch/ia64/lib/strlen_user.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/strlen_user.S	Fri Nov  9 14:26:17 2001
@@ -8,8 +8,8 @@
  *	ret0	0 in case of fault, strlen(buffer)+1 otherwise
  *
  * Copyright (C) 1998, 1999, 2001 Hewlett-Packard Co
- * Copyright (C) 1998, 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1998, 1999 Stephane Eranian <eranian@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
  *
  * 01/19/99 S.Eranian heavily enhanced version (see details below)
  * 09/24/99 S.Eranian added speculation recovery code
@@ -108,7 +108,7 @@
 	mov ar.ec=r0		// clear epilogue counter (saved in ar.pfs)
 	;;
 	add base=-16,src	// keep track of aligned base
-	chk.s v[1], recover	// if already NaT, then directly skip to recover
+	chk.s v[1], .recover	// if already NaT, then directly skip to recover
 	or v[1]=v[1],mask	// now we have a safe initial byte pattern
 	;;
 1:
@@ -130,14 +130,14 @@
 	//
 	cmp.eq  p8,p9=8,val1	// p6 = val1 had zero (disambiguate)
 	tnat.nz p6,p7=val1	// test NaT on val1
-(p6)	br.cond.spnt.few recover// jump to recovery if val1 is NaT
+(p6)	br.cond.spnt .recover	// jump to recovery if val1 is NaT
 	;;
 	//
 	// if we come here p7 is true, i.e., initialized for // cmp
 	//
 	cmp.eq.and  p7,p0=8,val1// val1==8?
 	tnat.nz.and p7,p0=val2	// test NaT if val2
-(p7)	br.cond.spnt.few recover// jump to recovery if val2 is NaT
+(p7)	br.cond.spnt .recover	// jump to recovery if val2 is NaT
 	;;
 (p8)	mov val1=val2		// val2 contains the value
 (p8)	adds src=-16,src	// correct position when 3 ahead
@@ -149,7 +149,7 @@
 	;;
 	sub ret0=ret0,tmp	// length=now - back -1
 	mov ar.pfs=saved_pfs	// because of ar.ec, restore no matter what
-	br.ret.sptk.few rp	// end of normal execution
+	br.ret.sptk.many rp	// end of normal execution
 
 	//
 	// Outlined recovery code when speculation failed
@@ -162,7 +162,7 @@
 	//	- today we restart from the beginning of the string instead
 	//	  of trying to continue where we left off.
 	//
-recover:
+.recover:
 	EX(.Lexit1, ld8 val=[base],8)	// load the initial bytes
 	;;
 	or val=val,mask			// remask first bytes
@@ -185,7 +185,7 @@
 	;;
 	sub ret0=ret0,tmp	// length=now - back -1
 	mov ar.pfs=saved_pfs	// because of ar.ec, restore no matter what
-	br.ret.sptk.few rp	// end of successful recovery code
+	br.ret.sptk.many rp	// end of successful recovery code
 
 	//
 	// We failed even on the normal load (called from exception handler)
@@ -194,5 +194,5 @@
 	mov ret0=0
 	mov pr=saved_pr,0xffffffffffff0000
 	mov ar.pfs=saved_pfs	// because of ar.ec, restore no matter what
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__strlen_user)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/strncpy_from_user.S linux/arch/ia64/lib/strncpy_from_user.S
--- v2.4.14/linux/arch/ia64/lib/strncpy_from_user.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/strncpy_from_user.S	Fri Nov  9 14:26:17 2001
@@ -40,5 +40,5 @@
 (p6)	mov r8=in2		// buffer filled up---return buffer length
 (p7)	sub r8=in1,r9,1		// return string length (excluding NUL character)
 [.Lexit:]
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__strncpy_from_user)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/strnlen_user.S linux/arch/ia64/lib/strnlen_user.S
--- v2.4.14/linux/arch/ia64/lib/strnlen_user.S	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/lib/strnlen_user.S	Fri Nov  9 14:26:17 2001
@@ -33,7 +33,7 @@
 	add r9=1,r9
 	;;
 	cmp.eq p6,p0=r8,r0
-(p6)	br.dpnt.few .Lexit
+(p6)	br.cond.dpnt .Lexit
 	br.cloop.dptk.few .Loop1
 
 	add r9=1,in1			// NUL not found---return N+1
@@ -41,5 +41,5 @@
 .Lexit:
 	mov r8=r9
 	mov ar.lc=r16			// restore ar.lc
-	br.ret.sptk.few rp
+	br.ret.sptk.many rp
 END(__strnlen_user)
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/lib/swiotlb.c linux/arch/ia64/lib/swiotlb.c
--- v2.4.14/linux/arch/ia64/lib/swiotlb.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/lib/swiotlb.c	Tue Nov 13 09:01:16 2001
@@ -27,6 +27,10 @@
 #define ALIGN(val, align) ((unsigned long)	\
 	(((unsigned long) (val) + ((align) - 1)) & ~((align) - 1)))
 
+#define SG_ENT_VIRT_ADDRESS(sg)	((sg)->address ? (sg)->address			\
+				 : page_address((sg)->page) + (sg)->offset)
+#define SG_ENT_PHYS_ADDRESS(SG)	virt_to_phys(SG_ENT_VIRT_ADDRESS(SG))
+
 /*
  * log of the size of each IO TLB slab.  The number of slabs is command line controllable.
  */
@@ -392,15 +396,20 @@
 int
 swiotlb_map_sg (struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction)
 {
+	void *addr;
 	int i;
 
 	if (direction == PCI_DMA_NONE)
 		BUG();
 
 	for (i = 0; i < nelems; i++, sg++) {
-		sg->orig_address = sg->address;
-		if ((virt_to_phys(sg->address) & ~hwdev->dma_mask) != 0) {
-			sg->address = map_single(hwdev, sg->address, sg->length, direction);
+		sg->orig_address = SG_ENT_VIRT_ADDRESS(sg);
+		if ((SG_ENT_PHYS_ADDRESS(sg) & ~hwdev->dma_mask) != 0) {
+			addr = map_single(hwdev, sg->address, sg->length, direction);
+			if (sg->address)
+				sg->address = addr;
+			else
+				sg->page = virt_to_page(addr);
 		}
 	}
 	return nelems;
@@ -419,9 +428,12 @@
 		BUG();
 
 	for (i = 0; i < nelems; i++, sg++)
-		if (sg->orig_address != sg->address) {
-			unmap_single(hwdev, sg->address, sg->length, direction);
-			sg->address = sg->orig_address;
+		if (sg->orig_address != SG_ENT_VIRT_ADDRESS(sg)) {
+			unmap_single(hwdev, SG_ENT_VIRT_ADDRESS(sg), sg->length, direction);
+			if (sg->address)
+				sg->address = sg->orig_address;
+			else
+				sg->page = virt_to_page(sg->orig_address);
 		} else if (direction == PCI_DMA_FROMDEVICE)
 			mark_clean(sg->address, sg->length);
 }
@@ -442,14 +454,14 @@
 		BUG();
 
 	for (i = 0; i < nelems; i++, sg++)
-		if (sg->orig_address != sg->address)
-			sync_single(hwdev, sg->address, sg->length, direction);
+		if (sg->orig_address != SG_ENT_VIRT_ADDRESS(sg))
+			sync_single(hwdev, SG_ENT_VIRT_ADDRESS(sg), sg->length, direction);
 }
 
 unsigned long
 swiotlb_dma_address (struct scatterlist *sg)
 {
-	return virt_to_phys(sg->address);
+	return SG_ENT_PHYS_ADDRESS(sg);
 }
 
 EXPORT_SYMBOL(swiotlb_init);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/mm/fault.c linux/arch/ia64/mm/fault.c
--- v2.4.14/linux/arch/ia64/mm/fault.c	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/mm/fault.c	Fri Nov  9 14:26:17 2001
@@ -1,8 +1,8 @@
 /*
  * MMU fault handling support.
  *
- * Copyright (C) 1998-2000 Hewlett-Packard Co
- * Copyright (C) 1998-2000 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1998-2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 #include <linux/sched.h>
 #include <linux/kernel.h>
@@ -16,7 +16,7 @@
 #include <asm/uaccess.h>
 #include <asm/hardirq.h>
 
-extern void die_if_kernel (char *, struct pt_regs *, long);
+extern void die (char *, struct pt_regs *, long);
 
 /*
  * This routine is analogous to expand_stack() but instead grows the
@@ -46,16 +46,15 @@
 void
 ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *regs)
 {
+	int signal = SIGSEGV, code = SEGV_MAPERR;
+	struct vm_area_struct *vma, *prev_vma;
 	struct mm_struct *mm = current->mm;
 	struct exception_fixup fix;
-	struct vm_area_struct *vma, *prev_vma;
 	struct siginfo si;
-	int signal = SIGSEGV;
 	unsigned long mask;
 
 	/*
-	 * If we're in an interrupt or have no user
-	 * context, we must not take the fault..
+	 * If we're in an interrupt or have no user context, we must not take the fault..
 	 */
 	if (in_interrupt() || !mm)
 		goto no_context;
@@ -71,6 +70,8 @@
 		goto check_expansion;
 
   good_area:
+	code = SEGV_ACCERR;
+
 	/* OK, we've got a good vm_area for this memory area.  Check the access permissions: */
 
 #	define VM_READ_BIT	0
@@ -89,12 +90,13 @@
 	if ((vma->vm_flags & mask) != mask)
 		goto bad_area;
 
+  survive:
 	/*
 	 * If for any reason at all we couldn't handle the fault, make
 	 * sure we exit gracefully rather than endlessly redo the
 	 * fault.
 	 */
-	switch (handle_mm_fault(mm, vma, address, mask) != 0) {
+	switch (handle_mm_fault(mm, vma, address, mask)) {
 	      case 1:
 		++current->min_flt;
 		break;
@@ -147,7 +149,7 @@
 	if (user_mode(regs)) {
 		si.si_signo = signal;
 		si.si_errno = 0;
-		si.si_code = SI_KERNEL;
+		si.si_code = code;
 		si.si_addr = (void *) address;
 		force_sig_info(signal, &si, current);
 		return;
@@ -174,17 +176,29 @@
 	}
 
 	/*
-	 * Oops. The kernel tried to access some bad page. We'll have
-	 * to terminate things with extreme prejudice.
+	 * Oops. The kernel tried to access some bad page. We'll have to terminate things
+	 * with extreme prejudice.
 	 */
-	printk(KERN_ALERT "Unable to handle kernel paging request at "
-	       "virtual address %016lx\n", address);
-	die_if_kernel("Oops", regs, isr);
+	bust_spinlocks(1);
+
+	if (address < PAGE_SIZE)
+		printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
+	else
+		printk(KERN_ALERT "Unable to handle kernel paging request at "
+		       "virtual address %016lx\n", address);
+	die("Oops", regs, isr);
+	bust_spinlocks(0);
 	do_exit(SIGKILL);
 	return;
 
   out_of_memory:
 	up_read(&mm->mmap_sem);
+	if (current->pid == 1) {
+		current->policy |= SCHED_YIELD;
+		schedule();
+		down_read(&mm->mmap_sem);
+		goto survive;
+	}
 	printk("VM: killing process %s\n", current->comm);
 	if (user_mode(regs))
 		do_exit(SIGKILL);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/mm/init.c linux/arch/ia64/mm/init.c
--- v2.4.14/linux/arch/ia64/mm/init.c	Sun Sep 23 11:40:55 2001
+++ linux/arch/ia64/mm/init.c	Fri Nov  9 14:26:17 2001
@@ -167,13 +167,40 @@
 }
 
 void
-show_mem (void)
+show_mem(void)
 {
 	int i, total = 0, reserved = 0;
 	int shared = 0, cached = 0;
 
 	printk("Mem-info:\n");
 	show_free_areas();
+
+#ifdef CONFIG_DISCONTIGMEM
+	{
+		pg_data_t *pgdat = pgdat_list;
+
+		printk("Free swap:       %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
+		do {
+			printk("Node ID: %d\n", pgdat->node_id);
+			for(i = 0; i < pgdat->node_size; i++) {
+				if (PageReserved(pgdat->node_mem_map+i))
+					reserved++;
+				else if (PageSwapCache(pgdat->node_mem_map+i))
+					cached++;
+				else if (page_count(pgdat->node_mem_map + i))
+					shared += page_count(pgdat->node_mem_map + i) - 1;
+			}
+			printk("\t%d pages of RAM\n", pgdat->node_size);
+			printk("\t%d reserved pages\n", reserved);
+			printk("\t%d pages shared\n", shared);
+			printk("\t%d pages swap cached\n", cached);
+			pgdat = pgdat->node_next;
+		} while (pgdat);
+		printk("Total of %ld pages in page table cache\n", pgtable_cache_size);
+		show_buffers();
+		printk("%d free buffer pages\n", nr_free_buffer_pages());
+	}
+#else /* !CONFIG_DISCONTIGMEM */
 	printk("Free swap:       %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
 	i = max_mapnr;
 	while (i-- > 0) {
@@ -191,6 +218,7 @@
 	printk("%d pages swap cached\n", cached);
 	printk("%ld pages in page table cache\n", pgtable_cache_size);
 	show_buffers();
+#endif /* !CONFIG_DISCONTIGMEM */
 }
 
 /*
@@ -248,7 +276,7 @@
 	ia64_clear_ic(flags);
 
 	rid = ia64_rid(IA64_REGION_ID_KERNEL, __IA64_UNCACHED_OFFSET);
-	ia64_set_rr(__IA64_UNCACHED_OFFSET, (rid << 8) | (KERNEL_PG_SHIFT << 2));
+	ia64_set_rr(__IA64_UNCACHED_OFFSET, (rid << 8) | (IA64_GRANULE_SHIFT << 2));
 
 	rid = ia64_rid(IA64_REGION_ID_KERNEL, VMALLOC_START);
 	ia64_set_rr(VMALLOC_START, (rid << 8) | (PAGE_SHIFT << 2) | 1);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/mm/tlb.c linux/arch/ia64/mm/tlb.c
--- v2.4.14/linux/arch/ia64/mm/tlb.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/mm/tlb.c	Fri Nov  9 14:26:17 2001
@@ -2,7 +2,7 @@
  * TLB support routines.
  *
  * Copyright (C) 1998-2001 Hewlett-Packard Co
- * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * 08/02/00 A. Mallick <asit.k.mallick@intel.com>
  *		Modified RID allocation for SMP
@@ -41,89 +41,6 @@
 };
 
 /*
- * Seralize usage of ptc.g
- */
-spinlock_t ptcg_lock = SPIN_LOCK_UNLOCKED; /* see <asm/pgtable.h> */
-
-#if defined(CONFIG_SMP) && !defined(CONFIG_ITANIUM_PTCG)
-
-#include <linux/irq.h>
-
-unsigned long	flush_end, flush_start, flush_nbits, flush_rid;
-atomic_t flush_cpu_count;
-
-/*
- * flush_tlb_no_ptcg is called with ptcg_lock locked
- */
-static inline void
-flush_tlb_no_ptcg (unsigned long start, unsigned long end, unsigned long nbits)
-{
-	extern void smp_send_flush_tlb (void);
-	unsigned long saved_tpr = 0;
-	unsigned long flags;
-
-	/*
-	 * Some times this is called with interrupts disabled and causes
-	 * dead-lock; to avoid this we enable interrupt and raise the TPR
-	 * to enable ONLY IPI.
-	 */
-	__save_flags(flags);
-	if (!(flags & IA64_PSR_I)) {
-		saved_tpr = ia64_get_tpr();
-		ia64_srlz_d();
-		ia64_set_tpr(IA64_IPI_VECTOR - 16);
-		ia64_srlz_d();
-		local_irq_enable();
-	}
-
-	spin_lock(&ptcg_lock);
-	flush_rid = ia64_get_rr(start);
-	ia64_srlz_d();
-	flush_start = start;
-	flush_end = end;
-	flush_nbits = nbits;
-	atomic_set(&flush_cpu_count, smp_num_cpus - 1);
-	smp_send_flush_tlb();
-	/*
-	 * Purge local TLB entries. ALAT invalidation is done in ia64_leave_kernel.
-	 */
-	do {
-		asm volatile ("ptc.l %0,%1" :: "r"(start), "r"(nbits<<2) : "memory");
-		start += (1UL << nbits);
-	} while (start < end);
-
-	ia64_srlz_i();			/* srlz.i implies srlz.d */
-
-	/*
-	 * Wait for other CPUs to finish purging entries.
-	 */
-#if defined(CONFIG_ITANIUM_BSTEP_SPECIFIC)
-	{
-		extern void smp_resend_flush_tlb (void);
-		unsigned long start = ia64_get_itc();
-
-		while (atomic_read(&flush_cpu_count) > 0) {
-			if ((ia64_get_itc() - start) > 400000UL) {
-				smp_resend_flush_tlb();
-				start = ia64_get_itc();
-			}
-		}
-	}
-#else
-	while (atomic_read(&flush_cpu_count)) {
-		/* Nothing */
-	}
-#endif
-	if (!(flags & IA64_PSR_I)) {
-		local_irq_disable();
-		ia64_set_tpr(saved_tpr);
-		ia64_srlz_d();
-	}
-}
-
-#endif /* CONFIG_SMP && !CONFIG_ITANIUM_PTCG */
-
-/*
  * Acquire the ia64_ctx.lock before calling this function!
  */
 void
@@ -162,6 +79,26 @@
 	flush_tlb_all();
 }
 
+static inline void
+ia64_global_tlb_purge (unsigned long start, unsigned long end, unsigned long nbits)
+{
+	static spinlock_t ptcg_lock = SPIN_LOCK_UNLOCKED;
+
+	/* HW requires global serialization of ptc.ga.  */
+	spin_lock(&ptcg_lock);
+	{
+		do {
+			/*
+			 * Flush ALAT entries also.
+			 */
+			asm volatile ("ptc.ga %0,%1;;srlz.i;;" :: "r"(start), "r"(nbits<<2)
+				      : "memory");
+			start += (1UL << nbits);
+		} while (start < end);
+	}
+	spin_unlock(&ptcg_lock);
+}
+
 void
 __flush_tlb_all (void)
 {
@@ -222,23 +159,15 @@
 	}
 	start &= ~((1UL << nbits) - 1);
 
-#if defined(CONFIG_SMP) && !defined(CONFIG_ITANIUM_PTCG)
-	flush_tlb_no_ptcg(start, end, nbits);
-#else
-	spin_lock(&ptcg_lock);
-	do {
 # ifdef CONFIG_SMP
-		/*
-		 * Flush ALAT entries also.
-		 */
-		asm volatile ("ptc.ga %0,%1;;srlz.i;;" :: "r"(start), "r"(nbits<<2) : "memory");
+	platform_global_tlb_purge(start, end, nbits);
 # else
+	do {
 		asm volatile ("ptc.l %0,%1" :: "r"(start), "r"(nbits<<2) : "memory");
-# endif
 		start += (1UL << nbits);
 	} while (start < end);
-#endif /* CONFIG_SMP && !defined(CONFIG_ITANIUM_PTCG) */
-	spin_unlock(&ptcg_lock);
+# endif
+
 	ia64_insn_group_barrier();
 	ia64_srlz_i();			/* srlz.i implies srlz.d */
 	ia64_insn_group_barrier();
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/sn/sn1/llsc4.c linux/arch/ia64/sn/sn1/llsc4.c
--- v2.4.14/linux/arch/ia64/sn/sn1/llsc4.c	Thu Apr  5 12:51:47 2001
+++ linux/arch/ia64/sn/sn1/llsc4.c	Fri Nov  9 14:26:17 2001
@@ -35,16 +35,6 @@
 static int	inttest=0;
 #endif
 
-#ifdef IA64_SEMFIX_INSN
-#undef IA64_SEMFIX_INSN
-#endif
-#ifdef IA64_SEMFIX
-#undef IA64_SEMFIX
-#endif
-# define IA64_SEMFIX_INSN
-# define IA64_SEMFIX    ""
-
-
 /*
  * Test parameter table for AUTOTEST
  */
@@ -192,7 +182,6 @@
 	printk ("     llscfail    \t%s\tForce a failure to test the trigger & error messages\n", fail_enabled ? "on" : "off");
 	printk ("     llscselt    \t%s\tSelective triger on failures\n", selective_trigger ? "on" : "off");
 	printk ("     llscblkadr  \t%s\tDump data block addresses\n", dump_block_addrs_opt ? "on" : "off");
-	printk ("  SEMFIX: %s\n", IA64_SEMFIX);
 	printk ("\n");
 }
 __setup("autotest", autotest_enable);
diff -u --recursive --new-file v2.4.14/linux/arch/ia64/tools/print_offsets.c linux/arch/ia64/tools/print_offsets.c
--- v2.4.14/linux/arch/ia64/tools/print_offsets.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/tools/print_offsets.c	Fri Nov  9 14:26:17 2001
@@ -57,11 +57,8 @@
     { "IA64_TASK_PROCESSOR_OFFSET",	offsetof (struct task_struct, processor) },
     { "IA64_TASK_THREAD_OFFSET",	offsetof (struct task_struct, thread) },
     { "IA64_TASK_THREAD_KSP_OFFSET",	offsetof (struct task_struct, thread.ksp) },
-#ifdef CONFIG_IA32_SUPPORT
-    { "IA64_TASK_THREAD_SIGMASK_OFFSET",offsetof (struct task_struct, thread.un.sigmask) },
-#endif
 #ifdef CONFIG_PERFMON
-    { "IA64_TASK_PFM_NOTIFY_OFFSET",	offsetof(struct task_struct, thread.pfm_pend_notify) },
+    { "IA64_TASK_PFM_MUST_BLOCK_OFFSET",offsetof(struct task_struct, thread.pfm_must_block) },
 #endif
     { "IA64_TASK_PID_OFFSET",		offsetof (struct task_struct, pid) },
     { "IA64_TASK_MM_OFFSET",		offsetof (struct task_struct, mm) },
@@ -165,17 +162,18 @@
     { "IA64_SIGCONTEXT_FR6_OFFSET",	offsetof (struct sigcontext, sc_fr[6]) },
     { "IA64_SIGCONTEXT_PR_OFFSET",	offsetof (struct sigcontext, sc_pr) },
     { "IA64_SIGCONTEXT_R12_OFFSET",	offsetof (struct sigcontext, sc_gr[12]) },
+    { "IA64_SIGCONTEXT_RBS_BASE_OFFSET",offsetof (struct sigcontext, sc_rbs_base) },
+    { "IA64_SIGCONTEXT_LOADRS_OFFSET",	offsetof (struct sigcontext, sc_loadrs) },
     { "IA64_SIGFRAME_ARG0_OFFSET",		offsetof (struct sigframe, arg0) },
     { "IA64_SIGFRAME_ARG1_OFFSET",		offsetof (struct sigframe, arg1) },
     { "IA64_SIGFRAME_ARG2_OFFSET",		offsetof (struct sigframe, arg2) },
-    { "IA64_SIGFRAME_RBS_BASE_OFFSET",		offsetof (struct sigframe, rbs_base) },
     { "IA64_SIGFRAME_HANDLER_OFFSET",		offsetof (struct sigframe, handler) },
     { "IA64_SIGFRAME_SIGCONTEXT_OFFSET",	offsetof (struct sigframe, sc) },
     { "IA64_CLONE_VFORK",		CLONE_VFORK },
     { "IA64_CLONE_VM",			CLONE_VM },
     { "IA64_CPU_IRQ_COUNT_OFFSET",	offsetof (struct cpuinfo_ia64, irq_stat.f.irq_count) },
     { "IA64_CPU_BH_COUNT_OFFSET",	offsetof (struct cpuinfo_ia64, irq_stat.f.bh_count) },
-    { "IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET",	offsetof (struct cpuinfo_ia64, phys_stacked_size_p8) },
+    { "IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET",offsetof (struct cpuinfo_ia64, phys_stacked_size_p8)},
 };
 
 static const char *tabs = "\t\t\t\t\t\t\t\t\t\t";
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/config.in linux/arch/ppc/config.in
--- v2.4.14/linux/arch/ppc/config.in	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/config.in	Fri Nov 16 10:10:08 2001
@@ -1,4 +1,4 @@
-# BK Id: SCCS/s.config.in 1.43 10/16/01 15:18:50 trini
+# BK Id: SCCS/s.config.in 1.45 11/08/01 07:57:40 paulus
 #
 # For a description of the syntax of this configuration file,
 # see Documentation/kbuild/config-language.txt.
@@ -6,6 +6,7 @@
 define_bool CONFIG_UID16 n
 define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
 define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
+define_bool CONFIG_HAVE_DEC_LOCK y
 
 mainmenu_name "Linux/PowerPC Kernel Configuration"
 
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/apus_setup.c linux/arch/ppc/kernel/apus_setup.c
--- v2.4.14/linux/arch/ppc/kernel/apus_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/apus_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.apus_setup.c 1.22 10/18/01 11:16:27 trini
+ * BK Id: SCCS/s.apus_setup.c 1.24 11/13/01 21:26:07 paulus
  */
 /*
  *  linux/arch/ppc/kernel/apus_setup.c
@@ -25,6 +25,7 @@
 #include <linux/hdreg.h>
 #include <linux/blk.h>
 #include <linux/pci.h>
+#include <linux/seq_file.h>
 
 #ifdef CONFIG_APUS
 #include <asm/logging.h>
@@ -263,24 +264,20 @@
 }
 
 int
-apus_get_cpuinfo(char *buffer)
+apus_show_cpuinfo(struct seq_file *m)
 {
-#ifdef CONFIG_APUS
 	extern int __map_without_bats;
 	extern unsigned long powerup_PCI_present;
-	int len;
 
-	len = sprintf(buffer, "machine\t\t: Amiga\n");
-	len += sprintf(buffer+len, "bus speed\t: %d%s", __bus_speed,
-		       (__speed_test_failed) ? " [failed]\n" : "\n");
-	len += sprintf(buffer+len, "using BATs\t: %s\n",
-		       (__map_without_bats) ? "No" : "Yes");
-	len += sprintf(buffer+len, "ram speed\t: %dns\n", 
-		       (__60nsram) ? 60 : 70);
-	len += sprintf(buffer+len, "PCI bridge\t: %s\n",
-		       (powerup_PCI_present) ? "Yes" : "No");
-	return len;
-#endif
+	seq_printf(m, "machine\t\t: Amiga\n");
+	seq_printf(m, "bus speed\t: %d%s", __bus_speed,
+		   (__speed_test_failed) ? " [failed]\n" : "\n");
+	seq_printf(m, "using BATs\t: %s\n",
+		   (__map_without_bats) ? "No" : "Yes");
+	seq_printf(m, "ram speed\t: %dns\n", (__60nsram) ? 60 : 70);
+	seq_printf(m, "PCI bridge\t: %s\n",
+		   (powerup_PCI_present) ? "Yes" : "No");
+	return 0;
 }
 
 static void get_current_tb(unsigned long long *time)
@@ -1069,8 +1066,7 @@
 	ISA_DMA_THRESHOLD = 0x00ffffff;
 
 	ppc_md.setup_arch     = apus_setup_arch;
-	ppc_md.setup_residual = NULL;
-	ppc_md.get_cpuinfo    = apus_get_cpuinfo;
+	ppc_md.show_cpuinfo   = apus_show_cpuinfo;
 	ppc_md.irq_cannonicalize = apus_irq_cannonicalize;
 	ppc_md.init_IRQ       = apus_init_IRQ;
 	ppc_md.get_irq        = apus_get_irq;
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/chrp_setup.c linux/arch/ppc/kernel/chrp_setup.c
--- v2.4.14/linux/arch/ppc/kernel/chrp_setup.c	Sun Sep 23 11:40:56 2001
+++ linux/arch/ppc/kernel/chrp_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.chrp_setup.c 1.36 09/08/01 15:47:42 paulus
+ * BK Id: SCCS/s.chrp_setup.c 1.38 11/13/01 21:26:07 paulus
  */
 /*
  *  linux/arch/ppc/kernel/setup.c
@@ -38,6 +38,7 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/ide.h>
+#include <linux/seq_file.h>
 
 #include <asm/mmu.h>
 #include <asm/processor.h>
@@ -81,6 +82,7 @@
 extern void pckbd_init_hw(void);
 extern unsigned char pckbd_sysrq_xlate[128];
 extern void select_adb_keyboard(void);
+extern int of_show_percpuinfo(struct seq_file *, int);
 
 extern kdev_t boot_dev;
 
@@ -110,9 +112,9 @@
 };
 
 int __chrp
-chrp_get_cpuinfo(char *buffer)
+chrp_show_cpuinfo(struct seq_file *m)
 {
-	int i, len, sdramen;
+	int i, sdramen;
 	unsigned int t;
 	struct device_node *root;
 	const char *model = "";
@@ -120,11 +122,10 @@
 	root = find_path_device("/");
 	if (root)
 		model = get_property(root, "model", NULL);
-	len = sprintf(buffer,"machine\t\t: CHRP %s\n", model);
+	seq_printf(m, "machine\t\t: CHRP %s\n", model);
 
 	/* longtrail (goldengate) stuff */
-	if ( !strncmp( model, "IBM,LongTrail", 13 ) )
-	{
+	if (!strncmp(model, "IBM,LongTrail", 13)) {
 		/* VLSI VAS96011/12 `Golden Gate 2' */
 		/* Memory banks */
 		sdramen = (in_le32((unsigned *)(GG2_PCI_CONFIG_BASE+
@@ -159,17 +160,17 @@
 				model = "Reserved";
 				break;
 			}
-			len += sprintf(buffer+len, "memory bank %d\t: %s %s\n", i, model,
-				       gg2_memtypes[sdramen ? 1 : ((t>>1) & 3)]);
+			seq_printf(m, "memory bank %d\t: %s %s\n", i, model,
+				   gg2_memtypes[sdramen ? 1 : ((t>>1) & 3)]);
 		}
 		/* L2 cache */
 		t = in_le32((unsigned *)(GG2_PCI_CONFIG_BASE+GG2_PCI_CC_CTRL));
-		len += sprintf(buffer+len, "board l2\t: %s %s (%s)\n",
-			       gg2_cachesizes[(t>>7) & 3],
-			       gg2_cachetypes[(t>>2) & 3],
-			       gg2_cachemodes[t & 3]);
+		seq_printf(m, "board l2\t: %s %s (%s)\n",
+			   gg2_cachesizes[(t>>7) & 3],
+			   gg2_cachetypes[(t>>2) & 3],
+			   gg2_cachemodes[t & 3]);
 	}
-	return len;
+	return 0;
 }
 
 /*
@@ -341,13 +342,8 @@
 chrp_irq_cannonicalize(u_int irq)
 {
 	if (irq == 2)
-	{
 		return 9;
-	}
-	else
-	{
-		return irq;
-	}
+	return irq;
 }
 
 void __init chrp_init_IRQ(void)
@@ -513,8 +509,8 @@
 	isa_io_base = CHRP_ISA_IO_BASE;		/* default value */
 
 	ppc_md.setup_arch     = chrp_setup_arch;
-	ppc_md.setup_residual = NULL;
-	ppc_md.get_cpuinfo    = chrp_get_cpuinfo;
+	ppc_md.show_percpuinfo = of_show_percpuinfo;
+	ppc_md.show_cpuinfo   = chrp_show_cpuinfo;
 	ppc_md.irq_cannonicalize = chrp_irq_cannonicalize;
 #ifndef CONFIG_POWER4
 	ppc_md.init_IRQ       = chrp_init_IRQ;
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/gemini_setup.c linux/arch/ppc/kernel/gemini_setup.c
--- v2.4.14/linux/arch/ppc/kernel/gemini_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/gemini_setup.c	Fri Nov 16 10:10:08 2001
@@ -24,6 +24,7 @@
 #include <linux/major.h>
 #include <linux/blk.h>
 #include <linux/console.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/pgtable.h>
@@ -82,9 +83,8 @@
 }
 
 int
-gemini_get_cpuinfo(char *buffer)
+gemini_show_cpuinfo(struct seq_file *m)
 {
-	int len;
 	unsigned char reg, rev;
 	char *family;
 	unsigned int type;
@@ -100,22 +100,20 @@
 
 	reg = readb(GEMINI_BECO);
 
-	len = sprintf( buffer, "machine\t\t: Gemini %s%d, rev %c, eco %d\n", 
-		       family, type, (rev + 'A'), (reg & 0xf));
+	seq_printf(m, "machine\t\t: Gemini %s%d, rev %c, eco %d\n", 
+		   family, type, (rev + 'A'), (reg & 0xf));
 
-	len = sprintf(buffer, "board\t\t: Gemini %s", family);
+	seq_printf(m, "board\t\t: Gemini %s", family);
 	if (type > 9)
-		len += sprintf(buffer+len, "%c", (type - 10) + 'A');
+		seq_printf(m, "%c", (type - 10) + 'A');
 	else
-		len += sprintf(buffer+len, "%d", type);
+		seq_printf(m, "%d", type);
 
-	len += sprintf(buffer+len, ", rev %c, eco %d\n",
-		       (rev + 'A'), (reg & 0xf));
+	seq_printf(m, ", rev %c, eco %d\n", (rev + 'A'), (reg & 0xf));
 
-	len += sprintf(buffer+len, "clock\t\t: %dMhz\n", 
-		       gemini_get_clock_speed());
+	seq_printf(m, "clock\t\t: %dMhz\n", gemini_get_clock_speed());
 
-	return len;
+	return 0;
 }
 
 static u_char gemini_openpic_initsenses[] = {
@@ -150,11 +148,12 @@
 void
 gemini_heartbeat(void)
 {
-	/* We only want to do this on 1 CPU */
-	if ( smp_processor_id() )
-		return;
 	static unsigned long led = GEMINI_LEDBASE+(4*8);
 	static char direction = 8;
+
+	/* We only want to do this on 1 CPU */
+	if (smp_processor_id())
+		return;
 	*(char *)led = 0;
 	if ( (led + direction) > (GEMINI_LEDBASE+(7*8)) ||
 	     (led + direction) < (GEMINI_LEDBASE+(4*8)) )
@@ -551,8 +550,7 @@
 #endif
 
 	ppc_md.setup_arch = gemini_setup_arch;
-	ppc_md.setup_residual = NULL;
-	ppc_md.get_cpuinfo = gemini_get_cpuinfo;
+	ppc_md.show_cpuinfo = gemini_show_cpuinfo;
 	ppc_md.irq_cannonicalize = NULL;
 	ppc_md.init_IRQ = gemini_init_IRQ;
 	ppc_md.get_irq = openpic_get_irq;
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/m8260_setup.c linux/arch/ppc/kernel/m8260_setup.c
--- v2.4.14/linux/arch/ppc/kernel/m8260_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/m8260_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.m8260_setup.c 1.28 10/18/01 11:16:28 trini
+ * BK Id: SCCS/s.m8260_setup.c 1.30 11/13/01 21:26:07 paulus
  */
 /*
  *  linux/arch/ppc/kernel/setup.c
@@ -34,6 +34,7 @@
 #include <linux/blk.h>
 #include <linux/ioport.h>
 #include <linux/ide.h>
+#include <linux/seq_file.h>
 
 #include <asm/mmu.h>
 #include <asm/processor.h>
@@ -144,21 +145,20 @@
 
 
 static int
-m8260_setup_residual(char *buffer)
+m8260_show_percpuinfo(struct seq_file *m, int i)
 {
-        int     len = 0;
 	bd_t	*bp;
 
 	bp = (bd_t *)__res;
 			
-	len += sprintf(len+buffer,"core clock\t: %d MHz\n"
-		       "CPM  clock\t: %d MHz\n"
-		       "bus  clock\t: %d MHz\n",
-		       bp->bi_intfreq / 1000000,
-		       bp->bi_cpmfreq / 1000000,
-		       bp->bi_busfreq / 1000000);
+	seq_printf(m, "core clock\t: %d MHz\n"
+		   "CPM  clock\t: %d MHz\n"
+		   "bus  clock\t: %d MHz\n",
+		   bp->bi_intfreq / 1000000,
+		   bp->bi_cpmfreq / 1000000,
+		   bp->bi_busfreq / 1000000);
 
-	return len;
+	return 0;
 }
 
 /* Initialize the internal interrupt controller.  The number of
@@ -240,8 +240,7 @@
 	}
 
 	ppc_md.setup_arch		= m8260_setup_arch;
-	ppc_md.setup_residual		= m8260_setup_residual;
-	ppc_md.get_cpuinfo		= NULL;
+	ppc_md.show_percpuinfo		= m8260_show_percpuinfo;
 	ppc_md.irq_cannonicalize	= NULL;
 	ppc_md.init_IRQ			= m8260_init_IRQ;
 	ppc_md.get_irq			= m8260_get_irq;
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/m8xx_setup.c linux/arch/ppc/kernel/m8xx_setup.c
--- v2.4.14/linux/arch/ppc/kernel/m8xx_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/m8xx_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.m8xx_setup.c 1.38 10/18/01 11:16:28 trini
+ * BK Id: SCCS/s.m8xx_setup.c 1.40 11/13/01 21:26:07 paulus
  *
  *  linux/arch/ppc/kernel/setup.c
  *
@@ -33,6 +33,7 @@
 #include <linux/blk.h>
 #include <linux/ioport.h>
 #include <linux/bootmem.h>
+#include <linux/seq_file.h>
 
 #include <asm/mmu.h>
 #include <asm/processor.h>
@@ -240,19 +241,18 @@
 
 
 static int
-m8xx_setup_residual(char *buffer)
+m8xx_show_percpuinfo(struct seq_file *m, int i)
 {
-        int     len = 0;
 	bd_t	*bp;
 
 	bp = (bd_t *)__res;
 			
-	len += sprintf(len+buffer,"clock\t\t: %ldMHz\n"
-		       "bus clock\t: %ldMHz\n",
-		       bp->bi_intfreq / 1000000,
-		       bp->bi_busfreq / 1000000);
+	seq_printf(m, "clock\t\t: %ldMHz\n"
+		   "bus clock\t: %ldMHz\n",
+		   bp->bi_intfreq / 1000000,
+		   bp->bi_busfreq / 1000000);
 
-	return len;
+	return 0;
 }
 
 /* Initialize the internal interrupt controller.  The number of
@@ -372,8 +372,7 @@
 	}
 
 	ppc_md.setup_arch		= m8xx_setup_arch;
-	ppc_md.setup_residual		= m8xx_setup_residual;
-	ppc_md.get_cpuinfo		= NULL;
+	ppc_md.show_percpuinfo		= m8xx_show_percpuinfo;
 	ppc_md.irq_cannonicalize	= NULL;
 	ppc_md.init_IRQ			= m8xx_init_IRQ;
 	ppc_md.get_irq			= m8xx_get_irq;
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/oak_setup.c linux/arch/ppc/kernel/oak_setup.c
--- v2.4.14/linux/arch/ppc/kernel/oak_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/oak_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.oak_setup.c 1.10 10/18/01 11:16:28 trini
+ * BK Id: SCCS/s.oak_setup.c 1.12 11/13/01 21:26:07 paulus
  */
 /*
  *
@@ -23,6 +23,7 @@
 #include <linux/param.h>
 #include <linux/string.h>
 #include <linux/blk.h>
+#include <linux/seq_file.h>
 
 #include <asm/processor.h>
 #include <asm/board.h>
@@ -106,8 +107,7 @@
 	/* Initialize machine-dependency vectors */
 
 	ppc_md.setup_arch	 	= oak_setup_arch;
-	ppc_md.setup_residual	 	= oak_setup_residual;
-	ppc_md.get_cpuinfo	 	= NULL;
+	ppc_md.show_percpuinfo	 	= oak_show_percpuinfo;
 	ppc_md.irq_cannonicalize 	= NULL;
 	ppc_md.init_IRQ		 	= oak_init_IRQ;
 	ppc_md.get_irq		 	= oak_get_irq;
@@ -141,7 +141,7 @@
 }
 
 /*
- * int oak_setup_residual()
+ * int oak_show_percpuinfo()
  *
  * Description:
  *   This routine pretty-prints the platform's internal CPU and bus clock
@@ -159,18 +159,16 @@
  *   on error.
  */
 int
-oak_setup_residual(char *buffer)
+oak_show_percpuinfo(struct seq_file *m, int i)
 {
-	int len = 0;
 	bd_t *bp = (bd_t *)__res;
 
-	len += sprintf(len + buffer,
-		       "clock\t\t: %dMHz\n"
-		       "bus clock\t\t: %dMHz\n",
-		       bp->bi_intfreq / 1000000,
-		       bp->bi_busfreq / 1000000);
+	seq_printf(m, "clock\t\t: %dMHz\n"
+		   "bus clock\t\t: %dMHz\n",
+		   bp->bi_intfreq / 1000000,
+		   bp->bi_busfreq / 1000000);
 
-	return (len);
+	return 0;
 }
 
 /*
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/pci.c linux/arch/ppc/kernel/pci.c
--- v2.4.14/linux/arch/ppc/kernel/pci.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/pci.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pci.c 1.31 11/01/01 12:24:55 trini
+ * BK Id: SCCS/s.pci.c 1.35 11/13/01 08:19:57 trini
  */
 /*
  * Common pmac/prep/chrp pci routines. -- Cort
@@ -44,6 +44,7 @@
 
 static void pcibios_fixup_resources(struct pci_dev* dev);
 static void fixup_broken_pcnet32(struct pci_dev* dev);
+static void fixup_rev1_53c810(struct pci_dev* dev);
 #ifdef CONFIG_ALL_PPC
 static void pcibios_fixup_cardbus(struct pci_dev* dev);
 static u8* pci_to_OF_bus_map;
@@ -60,14 +61,28 @@
 static int pci_bus_count;
 
 struct pci_fixup pcibios_fixups[] = {
-	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_TRIDENT,	PCI_ANY_ID,		fixup_broken_pcnet32 },
-	{ PCI_FIXUP_HEADER,	PCI_ANY_ID,		PCI_ANY_ID,		pcibios_fixup_resources },
+	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_TRIDENT,	PCI_ANY_ID,			fixup_broken_pcnet32 },
+	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_NCR,	PCI_DEVICE_ID_NCR_53C810,	fixup_rev1_53c810 },
+	{ PCI_FIXUP_HEADER,	PCI_ANY_ID,		PCI_ANY_ID,			pcibios_fixup_resources },
 #ifdef CONFIG_ALL_PPC
 	/* We should add per-machine fixup support in xxx_setup.c or xxx_pci.c */
-	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_TI, 	PCI_DEVICE_ID_TI_1211, 	pcibios_fixup_cardbus }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_TI,	PCI_DEVICE_ID_TI_1211,		pcibios_fixup_cardbus }, 
 #endif /* CONFIG_ALL_PPC */
  	{ 0 }
 };
+
+static void
+fixup_rev1_53c810(struct pci_dev* dev)
+{
+	/* rev 1 ncr53c810 chips don't set the class at all which means
+	 * they don't get their resources remapped. Fix that here.
+	 */
+
+	if ((dev->class == PCI_CLASS_NOT_DEFINED)) {
+		printk("NCR 53c810 rev 1 detected, setting PCI class.\n");
+		dev->class = PCI_CLASS_STORAGE_SCSI;
+	}
+}
 
 static void
 fixup_broken_pcnet32(struct pci_dev* dev)
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/pmac_setup.c linux/arch/ppc/kernel/pmac_setup.c
--- v2.4.14/linux/arch/ppc/kernel/pmac_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/pmac_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pmac_setup.c 1.41 10/18/01 11:16:28 trini
+ * BK Id: SCCS/s.pmac_setup.c 1.43 11/13/01 21:26:07 paulus
  */
 /*
  *  linux/arch/ppc/kernel/setup.c
@@ -49,6 +49,7 @@
 #include <linux/adb.h>
 #include <linux/cuda.h>
 #include <linux/pmu.h>
+#include <linux/seq_file.h>
 
 #include <asm/processor.h>
 #include <asm/sections.h>
@@ -157,36 +158,56 @@
 }
 #endif /* CONFIG_SMP */
 
+/*
+ * Assume here that all clock rates are the same in a
+ * smp system.  -- Cort
+ */
+int __openfirmware
+of_show_percpuinfo(struct seq_file *m, int i)
+{
+	struct device_node *cpu_node;
+	int *fp, s;
+			
+	cpu_node = find_type_devices("cpu");
+	if (!cpu_node)
+		return 0;
+	for (s = 0; s < i && cpu_node->next; s++)
+		cpu_node = cpu_node->next;
+	fp = (int *) get_property(cpu_node, "clock-frequency", NULL);
+	if (fp)
+		seq_printf(m, "clock\t\t: %dMHz\n", *fp / 1000000);
+	return 0;
+}
+
 int __pmac
-pmac_get_cpuinfo(char *buffer)
+pmac_show_cpuinfo(struct seq_file *m)
 {
-	int len;
 	struct device_node *np;
 	char *pp;
 	int plen;
 
 	/* find motherboard type */
-	len = sprintf(buffer, "machine\t\t: ");
+	seq_printf(m, "machine\t\t: ");
 	np = find_devices("device-tree");
 	if (np != NULL) {
 		pp = (char *) get_property(np, "model", NULL);
 		if (pp != NULL)
-			len += sprintf(buffer+len, "%s\n", pp);
+			seq_printf(m, "%s\n", pp);
 		else
-			len += sprintf(buffer+len, "PowerMac\n");
+			seq_printf(m, "PowerMac\n");
 		pp = (char *) get_property(np, "compatible", &plen);
 		if (pp != NULL) {
-			len += sprintf(buffer+len, "motherboard\t:");
+			seq_printf(m, "motherboard\t:");
 			while (plen > 0) {
 				int l = strlen(pp) + 1;
-				len += sprintf(buffer+len, " %s", pp);
+				seq_printf(m, " %s", pp);
 				plen -= l;
 				pp += l;
 			}
-			buffer[len++] = '\n';
+			seq_printf(m, "\n");
 		}
 	} else
-		len += sprintf(buffer+len, "PowerMac\n");
+		seq_printf(m, "PowerMac\n");
 
 	/* find l2 cache info */
 	np = find_devices("l2-cache");
@@ -197,22 +218,21 @@
 			get_property(np, "i-cache-size", NULL);
 		unsigned int *dc = (unsigned int *)
 			get_property(np, "d-cache-size", NULL);
-		len += sprintf(buffer+len, "L2 cache\t:");
+		seq_printf(m, "L2 cache\t:");
 		has_l2cache = 1;
 		if (get_property(np, "cache-unified", NULL) != 0 && dc) {
-			len += sprintf(buffer+len, " %dK unified", *dc / 1024);
+			seq_printf(m, " %dK unified", *dc / 1024);
 		} else {
 			if (ic)
-				len += sprintf(buffer+len, " %dK instruction",
-					       *ic / 1024);
+				seq_printf(m, " %dK instruction", *ic / 1024);
 			if (dc)
-				len += sprintf(buffer+len, "%s %dK data",
-					       (ic? " +": ""), *dc / 1024);
+				seq_printf(m, "%s %dK data",
+					   (ic? " +": ""), *dc / 1024);
 		}
 		pp = get_property(np, "ram-type", NULL);
 		if (pp)
-			len += sprintf(buffer+len, " %s", pp);
-		buffer[len++] = '\n';
+			seq_printf(m, " %s", pp);
+		seq_printf(m, "\n");
 	}
 
 	/* find ram info */
@@ -227,8 +247,7 @@
 
 			for (n /= sizeof(struct reg_property); n > 0; --n)
 				total += (reg++)->size;
-			len += sprintf(buffer+len, "memory\t\t: %luMB\n",
-				       total >> 20);
+			seq_printf(m, "memory\t\t: %luMB\n", total >> 20);
 		}
 	}
 
@@ -240,16 +259,16 @@
 		unsigned int *l2cr = (unsigned int *)
 			get_property(np, "l2cr-value", NULL);
 		if (l2cr != 0) {
-			len += sprintf(buffer+len, "l2cr override\t: 0x%x\n", *l2cr);
+			seq_printf(m, "l2cr override\t: 0x%x\n", *l2cr);
 		}
 	}
 	
 	/* Indicate newworld/oldworld */
-	len += sprintf(buffer+len, "pmac-generation\t: %s\n",
-		pmac_newworld ? "NewWorld" : "OldWorld");		
+	seq_printf(m, "pmac-generation\t: %s\n",
+		   pmac_newworld ? "NewWorld" : "OldWorld");
 	
 
-	return len;
+	return 0;
 }
 
 #ifdef CONFIG_SCSI
@@ -765,8 +784,8 @@
 	DMA_MODE_WRITE = 2;
 
 	ppc_md.setup_arch     = pmac_setup_arch;
-	ppc_md.setup_residual = NULL;
-	ppc_md.get_cpuinfo    = pmac_get_cpuinfo;
+	ppc_md.show_cpuinfo   = pmac_show_cpuinfo;
+	ppc_md.show_percpuinfo = of_show_percpuinfo;
 	ppc_md.irq_cannonicalize = NULL;
 	ppc_md.init_IRQ       = pmac_pic_init;
 	ppc_md.get_irq        = pmac_get_irq; /* Changed later on ... */
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/ppc_ksyms.c linux/arch/ppc/kernel/ppc_ksyms.c
--- v2.4.14/linux/arch/ppc/kernel/ppc_ksyms.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/ppc_ksyms.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.ppc_ksyms.c 1.57 10/16/01 15:58:42 trini
+ * BK Id: SCCS/s.ppc_ksyms.c 1.59 11/04/01 22:58:20 paulus
  */
 #include <linux/config.h>
 #include <linux/module.h>
@@ -58,6 +58,7 @@
 /* Tell string.h we don't want memcpy etc. as cpp defines */
 #define EXPORT_SYMTAB_STROPS
 
+extern void ppc_generic_ide_fix_driveid(struct hd_driveid *id);
 extern void transfer_to_handler(void);
 extern void syscall_trace(void);
 extern void do_IRQ(struct pt_regs *regs);
@@ -167,6 +168,7 @@
 EXPORT_SYMBOL(mm_ptov);
 
 EXPORT_SYMBOL(ppc_ide_md);
+EXPORT_SYMBOL(ppc_generic_ide_fix_driveid);
 
 #ifdef CONFIG_PCI
 EXPORT_SYMBOL_NOVERS(isa_io_base);
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/prep_setup.c linux/arch/ppc/kernel/prep_setup.c
--- v2.4.14/linux/arch/ppc/kernel/prep_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/prep_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.prep_setup.c 1.41 10/18/01 11:16:28 trini
+ * BK Id: SCCS/s.prep_setup.c 1.44 11/13/01 21:26:07 paulus
  */
 /*
  *  linux/arch/ppc/kernel/setup.c
@@ -40,6 +40,7 @@
 #include <linux/timex.h>
 #include <linux/pci.h>
 #include <linux/ide.h>
+#include <linux/seq_file.h>
 
 #include <asm/sections.h>
 #include <asm/mmu.h>
@@ -122,107 +123,107 @@
 #endif
 
 static int __prep
-prep_get_cpuinfo(char *buffer)
+prep_show_cpuinfo(struct seq_file *m)
 {
 	extern char *Motherboard_map_name;
-	int len;
+	int cachew;
 #ifdef CONFIG_PREP_RESIDUAL
 	int i;
 #endif
 
-#ifdef CONFIG_SMP
-#define CD(X)		(cpu_data[n].X)
-#else
-#define CD(X) (X)
-#endif
+	seq_printf(m, "machine\t\t: PReP %s\n", Motherboard_map_name);
 
-	len = sprintf(buffer,"machine\t\t: PReP %s\n",Motherboard_map_name);
-
-	
-	switch ( _prep_type )
-	{
+	switch ( _prep_type ) {
 	case _PREP_IBM:
-		if ((*(unsigned char *)0x8000080c) & (1<<6))
-			len += sprintf(buffer+len,"Upgrade CPU\n");
-		len += sprintf(buffer+len,"L2\t\t: ");
-		if ((*(unsigned char *)0x8000080c) & (1<<7))
-		{
-			len += sprintf(buffer+len,"not present\n");
+		cachew = inw(0x80c);
+		if (cachew & (1<<6))
+			seq_printf(m, "Upgrade CPU\n");
+		seq_printf(m, "L2\t\t: ");
+		if (cachew & (1<<7)) {
+			seq_printf(m, "not present\n");
 			goto no_l2;
 		}
-		len += sprintf(buffer+len,"%sKb,",
-				(((*(unsigned char *)0x8000080d)>>2)&1)
-					? "512" : "256");
-		len += sprintf(buffer+len,"%ssync\n",
-				((*(unsigned char *)0x8000080d)>>7) ? "" : "a");
+		seq_printf(m, "%sKb,", (cachew & (1 << 10))? "512" : "256");
+		seq_printf(m, "%ssync\n", (cachew & (1 << 15))? "" : "a");
 		break;
 	case _PREP_Motorola:
-		len += sprintf(buffer+len,"L2\t\t: ");
-		switch(*((unsigned char *)CACHECRBA) & L2CACHE_MASK)
-		{
+		cachew = *((unsigned char *)CACHECRBA);
+		seq_printf(m, "L2\t\t: ");
+		switch (cachew & L2CACHE_MASK) {
 		case L2CACHE_512KB:
-			len += sprintf(buffer+len,"512Kb");
+			seq_printf(m, "512Kb");
 			break;
 		case L2CACHE_256KB:
-			len += sprintf(buffer+len,"256Kb");
+			seq_printf(m, "256Kb");
 			break;
 		case L2CACHE_1MB:
-			len += sprintf(buffer+len,"1MB");
+			seq_printf(m, "1MB");
 			break;
 		case L2CACHE_NONE:
-			len += sprintf(buffer+len,"none\n");
+			seq_printf(m, "none\n");
 			goto no_l2;
 			break;
 		default:
-			len += sprintf(buffer+len, "%x\n",
-					*((unsigned char *)CACHECRBA));
+			seq_printf(m, "%x\n", cachew);
 		}
 		
-		len += sprintf(buffer+len,",parity %s",
-				(*((unsigned char *)CACHECRBA) & L2CACHE_PARITY)
-				? "enabled" : "disabled");
+		seq_printf(m, ", parity %s",
+			   (cachew & L2CACHE_PARITY)? "enabled" : "disabled");
 
-		len += sprintf(buffer+len, " SRAM:");
+		seq_printf(m, " SRAM:");
 		
-		switch ( ((*((unsigned char *)CACHECRBA) & 0xf0) >> 4) & ~(0x3) )
-		{
-		case 1: len += sprintf(buffer+len,
-					"synchronous,parity,flow-through\n");
+		switch ( ((cachew & 0xf0) >> 4) & ~(0x3) ) {
+		case 1: seq_printf(m, "synchronous,parity,flow-through\n");
 			break;
-		case 2: len += sprintf(buffer+len,"asynchronous,no parity\n");
+		case 2: seq_printf(m, "asynchronous,no parity\n");
 			break;
-		case 3: len += sprintf(buffer+len,"asynchronous,parity\n");
+		case 3: seq_printf(m, "asynchronous,parity\n");
 			break;
-		default:len += sprintf(buffer+len,
-					"synchronous,pipelined,no parity\n");
+		default:seq_printf(m, "synchronous,pipelined,no parity\n");
 			break;
 		}
 		break;
 	default:
 		break;
 	}
-	
-	
+
 no_l2:
-#ifndef CONFIG_PREP_RESIDUAL
-	return len;
-#else	
-	if ( res->ResidualLength == 0 )
-		return len;
-	
-	/* print info about SIMMs */
-	len += sprintf(buffer+len,"simms\t\t: ");
-	for ( i = 0 ; (res->ActualNumMemories) && (i < MAX_MEMS) ; i++ )
-	{
-		if ( res->Memories[i].SIMMSize != 0 )
-			len += sprintf(buffer+len,"%d:%ldM ", i,
+#ifdef CONFIG_PREP_RESIDUAL
+	if (res->ResidualLength == 0) {
+		/* print info about SIMMs */
+		seq_printf(m, "simms\t\t: ");
+		for (i = 0; (res->ActualNumMemories) && (i < MAX_MEMS); i++) {
+			if (res->Memories[i].SIMMSize != 0)
+				seq_printf(m, "%d:%ldM ", i,
 					(res->Memories[i].SIMMSize > 1024) ? 
 					res->Memories[i].SIMMSize>>20 : 
 					res->Memories[i].SIMMSize);
+		}
+		seq_printf(m, "\n");
 	}
-	len += sprintf(buffer+len,"\n");
-	return len;
 #endif
+
+	return 0;
+}
+
+static int __prep
+prep_show_percpuinfo(struct seq_file *m, int i)
+{
+	int len = 0;
+
+	/* PREP's without residual data will give incorrect values here */
+	seq_printf(m, "clock\t\t: ");
+#ifdef CONFIG_PREP_RESIDUAL	
+	if (res->ResidualLength)
+		seq_printf(m, "%ldMHz\n",
+			   (res->VitalProductData.ProcessorHz > 1024) ?
+			   res->VitalProductData.ProcessorHz>>20 :
+			   res->VitalProductData.ProcessorHz);
+	else
+#endif /* CONFIG_PREP_RESIDUAL */
+		seq_printf(m, "???\n");
+
+	return 0;
 }
 
 static void __init
@@ -628,26 +629,6 @@
 	}
 }
 
-static int __prep
-prep_setup_residual(char *buffer)
-{
-	int len = 0;
-
-	/* PREP's without residual data will give incorrect values here */
-	len += sprintf(len+buffer, "clock\t\t: ");
-#ifdef CONFIG_PREP_RESIDUAL	
-	if ( res->ResidualLength )
-		len += sprintf(len+buffer, "%ldMHz\n",
-			 (res->VitalProductData.ProcessorHz > 1024) ?
-			 res->VitalProductData.ProcessorHz>>20 :
-			res->VitalProductData.ProcessorHz);
-	else
-#endif /* CONFIG_PREP_RESIDUAL */
-		len += sprintf(len+buffer, "???\n");
-
-	return len;
-}
-
 static unsigned int __prep
 prep_irq_cannonicalize(u_int irq)
 {
@@ -852,11 +833,8 @@
 		unsigned long r6, unsigned long r7)
 {
 #ifdef CONFIG_PREP_RESIDUAL	
-	RESIDUAL *old_res = (RESIDUAL *)(r3 + KERNELBASE);
-
 	/* make a copy of residual data */
-	if ( r3 )
-	{
+	if ( r3 ) {
 		memcpy((void *)res,(void *)(r3+KERNELBASE),
 			 sizeof(RESIDUAL));
 	}
@@ -900,8 +878,8 @@
 	}
 
 	ppc_md.setup_arch     = prep_setup_arch;
-	ppc_md.setup_residual = prep_setup_residual;
-	ppc_md.get_cpuinfo    = prep_get_cpuinfo;
+	ppc_md.show_percpuinfo = prep_show_percpuinfo;
+	ppc_md.show_cpuinfo   = prep_show_cpuinfo;
 	ppc_md.irq_cannonicalize = prep_irq_cannonicalize;
 	ppc_md.init_IRQ       = prep_init_IRQ;
 	/* this gets changed later on if we have an OpenPIC -- Cort */
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/setup.c linux/arch/ppc/kernel/setup.c
--- v2.4.14/linux/arch/ppc/kernel/setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.setup.c 1.61 10/12/01 16:35:34 trini
+ * BK Id: SCCS/s.setup.c 1.63 11/13/01 21:26:07 paulus
  */
 /*
  * Common prep/pmac/chrp boot and setup code.
@@ -16,6 +16,7 @@
 #include <linux/ide.h>
 #include <linux/tty.h>
 #include <linux/bootmem.h>
+#include <linux/seq_file.h>
 
 #include <asm/residual.h>
 #include <asm/io.h>
@@ -136,150 +137,128 @@
 extern u32 cpu_temp_both(unsigned long cpu);
 #endif /* CONFIG_TAU */
 
-int get_cpuinfo(char *buffer)
+int show_cpuinfo(struct seq_file *m, void *v)
 {
-	unsigned long len = 0;
-	unsigned long bogosum = 0;
-	unsigned long i;
+	int i = (int) v - 1;
+	int err = 0;
 	unsigned int pvr;
 	unsigned short maj, min;
+	unsigned long lpj;
 
+	if (i >= NR_CPUS) {
+		/* Show summary information */
 #ifdef CONFIG_SMP
-#define CPU_PRESENT(x) (cpu_callin_map[(x)])
-#define GET_PVR ((long int)(cpu_data[i].pvr))
-#define CD(x) (cpu_data[i].x)
+		unsigned long bogosum = 0;
+		for (i = 0; i < smp_num_cpus; ++i)
+			if (cpu_online_map & (1 << i))
+				bogosum += cpu_data[i].loops_per_jiffy;
+		seq_printf(m, "total bogomips\t: %lu.%02lu\n",
+			   bogosum/(500000/HZ), bogosum/(5000/HZ) % 100);
+#endif /* CONFIG_SMP */
+
+		if (ppc_md.show_cpuinfo != NULL)
+			err = ppc_md.show_cpuinfo(m);
+		return err;
+	}
+
+#ifdef CONFIG_SMP
+	if (!(cpu_online_map & (1 << i)))
+		return 0;
+	pvr = cpu_data[i].pvr;
+	lpj = cpu_data[i].loops_per_jiffy;
+	seq_printf(m, "processor\t: %lu\n", i);
 #else
-#define CPU_PRESENT(x) ((x)==0)
-#define smp_num_cpus 1
-#define GET_PVR (mfspr(PVR))
-#define CD(x) (x)
-#endif	
+	pvr = mfspr(PVR);
+	lpj = loops_per_jiffy;
+#endif
 
-	for ( i = 0; i < smp_num_cpus ; i++ )
-	{
-		if ( !CPU_PRESENT(i) )
-			continue;
-		if ( i )
-			len += sprintf(len+buffer,"\n");
-		len += sprintf(len+buffer,"processor\t: %lu\n",i);
-		len += sprintf(len+buffer,"cpu\t\t: ");
-
-		pvr = GET_PVR;
-
-		if (cur_cpu_spec[i]->pvr_mask)
-			len += sprintf(len+buffer, "%s", cur_cpu_spec[i]->cpu_name);
-		else
-			len += sprintf(len+buffer, "unknown (%08x)", pvr);
+	seq_printf(m, "cpu\t\t: ");
+
+	if (cur_cpu_spec[i]->pvr_mask)
+		seq_printf(m, "%s", cur_cpu_spec[i]->cpu_name);
+	else
+		seq_printf(m, "unknown (%08x)", pvr);
 #ifdef CONFIG_ALTIVEC
-		if (cur_cpu_spec[i]->cpu_features & CPU_FTR_ALTIVEC)
-			len += sprintf(len+buffer, ", altivec supported");
-#endif		
-		len += sprintf(len+buffer, "\n");
+	if (cur_cpu_spec[i]->cpu_features & CPU_FTR_ALTIVEC)
+		seq_printf(m, ", altivec supported");
+#endif
+	seq_printf(m, "\n");
+
 #ifdef CONFIG_TAU
-		if (cur_cpu_spec[i]->cpu_features & CPU_FTR_TAU) {
-#ifdef CONFIG_TAU_AVERAGE	/* more straightforward, but potentially misleading */
-			len += sprintf(len+buffer, "temperature \t: %u C (uncalibrated)\n",
-				       cpu_temp(i));
+	if (cur_cpu_spec[i]->cpu_features & CPU_FTR_TAU) {
+#ifdef CONFIG_TAU_AVERAGE
+		/* more straightforward, but potentially misleading */
+		seq_printf(m,  "temperature \t: %u C (uncalibrated)\n",
+			   cpu_temp(i));
 #else
-			/* show the actual temp sensor range */
-			u32 temp;
-			temp = cpu_temp_both(i);
-			len += sprintf(len+buffer, "temperature \t: %u-%u C (uncalibrated)\n",
-					temp & 0xff, temp >> 16);
-#endif
-		}
+		/* show the actual temp sensor range */
+		u32 temp;
+		temp = cpu_temp_both(i);
+		seq_printf(m, "temperature \t: %u-%u C (uncalibrated)\n",
+			   temp & 0xff, temp >> 16);
 #endif
+	}
+#endif /* CONFIG_TAU */
 
-		/*
-		 * Assume here that all clock rates are the same in a
-		 * smp system.  -- Cort
-		 */
-#if defined(CONFIG_ALL_PPC)
-		if ( have_of )
-		{
-			struct device_node *cpu_node;
-			int *fp;
-			
-			cpu_node = find_type_devices("cpu");
-			if ( !cpu_node ) break;
-			{
-				int s;
-				for ( s = 0; (s < i) && cpu_node->next ;
-				      s++, cpu_node = cpu_node->next )
-					/* nothing */ ;
-#if 0 /* SMP Pmacs don't have all cpu nodes -- Cort */
-				if ( s != i )
-					printk("get_cpuinfo(): ran out of "
-					       "cpu nodes.\n");
-#endif
-			}
-			fp = (int *) get_property(cpu_node, "clock-frequency", NULL);
-			if ( !fp ) break;
-			len += sprintf(len+buffer, "clock\t\t: %dMHz\n",
-				       *fp / 1000000);
-		}
-#endif /* CONFIG_ALL_PPC */
+	if (ppc_md.show_percpuinfo != NULL) {
+		err = ppc_md.show_percpuinfo(m, i);
+		if (err)
+			return err;
+	}
 
-		if (ppc_md.setup_residual != NULL)
-		{
-			len += ppc_md.setup_residual(buffer + len);
-		}
-		
-		switch (PVR_VER(pvr))
-		{
-		case 0x0020:
-			maj = PVR_MAJ(pvr) + 1;
-			min = PVR_MIN(pvr);
-			break;
-		case 0x1008:
-			maj = ((pvr >> 8) & 0xFF) - 1;
-			min = pvr & 0xFF;
-			break;
-		default:
-			maj = (pvr >> 8) & 0xFF;
-			min = pvr & 0xFF;
-			break;
-		}
+	switch (PVR_VER(pvr)) {
+	case 0x0020:	/* 403 family */
+		maj = PVR_MAJ(pvr) + 1;
+		min = PVR_MIN(pvr);
+		break;
+	case 0x1008:	/* 740P/750P ?? */
+		maj = ((pvr >> 8) & 0xFF) - 1;
+		min = pvr & 0xFF;
+		break;
+	default:
+		maj = (pvr >> 8) & 0xFF;
+		min = pvr & 0xFF;
+		break;
+	}
 
-		len += sprintf(len+buffer, "revision\t: %hd.%hd (pvr %04x %04x)\n", 
-				maj, min, PVR_VER(pvr), PVR_REV(pvr));
+	seq_printf(m, "revision\t: %hd.%hd (pvr %04x %04x)\n", 
+		   maj, min, PVR_VER(pvr), PVR_REV(pvr));
 
-		len += sprintf(buffer+len, "bogomips\t: %lu.%02lu\n",
-			       CD(loops_per_jiffy)/(500000/HZ),
-			       CD(loops_per_jiffy)/(5000/HZ) % 100);
-		bogosum += CD(loops_per_jiffy);
-	}
+	seq_printf(m, "bogomips\t: %lu.%02lu\n",
+		   lpj / (500000/HZ), (lpj / (5000/HZ)) % 100);
 
 #ifdef CONFIG_SMP
-	if ( i && smp_num_cpus > 1)
-		len += sprintf(buffer+len, "\n");
-	len += sprintf(buffer+len,"total bogomips\t: %lu.%02lu\n",
-		       bogosum/(500000/HZ),
-		       bogosum/(5000/HZ) % 100);
-#endif /* CONFIG_SMP */
+	seq_printf(m, "\n");
+#endif
 
-	/*
-	 * Ooh's and aah's info about zero'd pages in idle task
-	 */ 
-	len += sprintf(buffer+len,"zero pages\t: total: %u (%luKb) "
-		       "current: %u (%luKb) hits: %u/%u (%u%%)\n",
-		       atomic_read(&zero_cache_total),
-		       (atomic_read(&zero_cache_total)*PAGE_SIZE)>>10,
-		       atomic_read(&zero_cache_sz),
-		       (atomic_read(&zero_cache_sz)*PAGE_SIZE)>>10,
-		       atomic_read(&zero_cache_hits),atomic_read(&zero_cache_calls),
-		       /* : 1 below is so we don't div by zero */
-		       (atomic_read(&zero_cache_hits)*100) /
-		       ((atomic_read(&zero_cache_calls))?atomic_read(&zero_cache_calls):1));
+	return 0;
+}
 
-	if (ppc_md.get_cpuinfo != NULL)
-	{
-		len += ppc_md.get_cpuinfo(buffer+len);
-	}
 
-	return len;
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	int i = *pos;
+
+	return i <= NR_CPUS? (void *) (i + 1): NULL;
+}
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+
+static void c_stop(struct seq_file *m, void *v)
+{
 }
 
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
+
 /*
  * We're called here very early in the boot.  We determine the machine
  * type and call the appropriate low-level setup functions.
@@ -468,8 +447,7 @@
 	extern char __bss_start[];
 
 	rec = (struct bi_record *)_ALIGN((ulong)__bss_start+(1<<20)-1,(1<<20));
-	if ( rec->tag != BI_FIRST )
-	{
+	if ( rec->tag != BI_FIRST ) {
 		/*
 		 * This 0x10000 offset is a terrible hack but it will go away when
 		 * we have the bootloader handle all the relocation and
@@ -483,8 +461,7 @@
 	      rec = (struct bi_record *)((ulong)rec + rec->size) )
 	{
 		ulong *data = rec->data;
-		switch (rec->tag)
-		{
+		switch (rec->tag) {
 		case BI_CMD_LINE:
 			memcpy(cmd_line, (void *)data, rec->size);
 			break;
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/kernel/walnut_setup.c linux/arch/ppc/kernel/walnut_setup.c
--- v2.4.14/linux/arch/ppc/kernel/walnut_setup.c	Mon Nov  5 15:55:26 2001
+++ linux/arch/ppc/kernel/walnut_setup.c	Fri Nov 16 10:10:08 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.walnut_setup.c 1.8 10/18/01 11:16:28 trini
+ * BK Id: SCCS/s.walnut_setup.c 1.10 11/13/01 21:26:07 paulus
  */
 /*
  *
@@ -23,6 +23,7 @@
 #include <linux/param.h>
 #include <linux/string.h>
 #include <linux/blk.h>
+#include <linux/seq_file.h>
 
 #include <asm/processor.h>
 #include <asm/board.h>
@@ -101,8 +102,7 @@
 	/* Initialize machine-dependency vectors */
 
 	ppc_md.setup_arch	 	= walnut_setup_arch;
-	ppc_md.setup_residual	 	= walnut_setup_residual;
-	ppc_md.get_cpuinfo	 	= NULL;
+	ppc_md.show_percpuinfo	 	= walnut_show_percpuinfo;
 	ppc_md.irq_cannonicalize 	= NULL;
 	ppc_md.init_IRQ		 	= walnut_init_IRQ;
 	ppc_md.get_irq		 	= walnut_get_irq;
@@ -136,7 +136,7 @@
 }
 
 /*
- * int walnut_setup_residual()
+ * int walnut_show_percpuinfo()
  *
  * Description:
  *   This routine pretty-prints the platform's internal CPU and bus clock
@@ -154,18 +154,16 @@
  *   on error.
  */
 int
-walnut_setup_residual(char *buffer)
+walnut_show_percpuinfo(struct seq_file *m)
 {
-	int len = 0;
 	bd_t *bp = (bd_t *)__res;
 
-	len += sprintf(len + buffer,
-		       "clock\t\t: %dMHz\n"
-		       "bus clock\t\t: %dMHz\n",
-		       bp->bi_intfreq / 1000000,
-		       bp->bi_busfreq / 1000000);
+	seq_printf(m, "clock\t\t: %dMHz\n"
+		   "bus clock\t\t: %dMHz\n",
+		   bp->bi_intfreq / 1000000,
+		   bp->bi_busfreq / 1000000);
 
-	return (len);
+	return 0;
 }
 
 /*
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/lib/Makefile linux/arch/ppc/lib/Makefile
--- v2.4.14/linux/arch/ppc/lib/Makefile	Mon May 21 17:04:47 2001
+++ linux/arch/ppc/lib/Makefile	Fri Nov 16 10:10:08 2001
@@ -1,4 +1,4 @@
-# BK Id: SCCS/s.Makefile 1.7 05/17/01 18:14:22 cort
+# BK Id: SCCS/s.Makefile 1.10 11/08/01 07:57:40 paulus
 #
 #
 # Makefile for ppc-specific library files..
@@ -8,7 +8,9 @@
 
 O_TARGET		:= lib.o
 
-obj-y			:= checksum.o string.o strcase.o
+export-objs		:= dec_and_lock.o
+
+obj-y			:= checksum.o string.o strcase.o dec_and_lock.o
 
 obj-$(CONFIG_SMP)	+= locks.o
 
diff -u --recursive --new-file v2.4.14/linux/arch/ppc/lib/dec_and_lock.c linux/arch/ppc/lib/dec_and_lock.c
--- v2.4.14/linux/arch/ppc/lib/dec_and_lock.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/ppc/lib/dec_and_lock.c	Fri Nov 16 10:10:08 2001
@@ -0,0 +1,46 @@
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <asm/atomic.h>
+#include <asm/system.h>
+
+/*
+ * This is an implementation of the notion of "decrement a
+ * reference count, and return locked if it decremented to zero".
+ *
+ * This implementation can be used on any architecture that
+ * has a cmpxchg, and where atomic->value is an int holding
+ * the value of the atomic (i.e. the high bits aren't used
+ * for a lock or anything like that).
+ *
+ * N.B. ATOMIC_DEC_AND_LOCK gets defined in include/linux/spinlock.h
+ * if spinlocks are empty and thus atomic_dec_and_lock is defined
+ * to be atomic_dec_and_test - in that case we don't need it
+ * defined here as well.
+ */
+
+#ifndef ATOMIC_DEC_AND_LOCK
+int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
+{
+	int counter;
+	int newcount;
+
+	for (;;) {
+		counter = atomic_read(atomic);
+		newcount = counter - 1;
+		if (!newcount)
+			break;		/* do it the slow way */
+
+		newcount = cmpxchg(&atomic->counter, counter, newcount);
+		if (newcount == counter)
+			return 0;
+	}
+
+	spin_lock(lock);
+	if (atomic_dec_and_test(atomic))
+		return 1;
+	spin_unlock(lock);
+	return 0;
+}
+
+EXPORT_SYMBOL(atomic_dec_and_lock);
+#endif /* ATOMIC_DEC_AND_LOCK */
diff -u --recursive --new-file v2.4.14/linux/arch/s390/config.in linux/arch/s390/config.in
--- v2.4.14/linux/arch/s390/config.in	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390/config.in	Fri Nov  9 13:58:02 2001
@@ -9,6 +9,7 @@
 define_bool CONFIG_UID16 y
 define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
 define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
+define_bool CONFIG_GENERIC_BUST_SPINLOCK n
 
 mainmenu_name "Linux Kernel Configuration"
 define_bool CONFIG_ARCH_S390 y
diff -u --recursive --new-file v2.4.14/linux/arch/s390/defconfig linux/arch/s390/defconfig
--- v2.4.14/linux/arch/s390/defconfig	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390/defconfig	Fri Nov  9 13:58:02 2001
@@ -7,6 +7,7 @@
 CONFIG_UID16=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_BUST_SPINLOCK=n
 CONFIG_ARCH_S390=y
 
 #
@@ -72,6 +73,7 @@
 CONFIG_MD_RAID0=m
 CONFIG_MD_RAID1=m
 CONFIG_MD_RAID5=m
+# CONFIG_MD_MULTIPATH is not set
 CONFIG_BLK_DEV_LVM=m
 
 #
@@ -183,19 +185,25 @@
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
+# CONFIG_CMS_FS is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
+# CONFIG_JBD_DEBUG is not set
 # CONFIG_FAT_FS is not set
 # CONFIG_MSDOS_FS is not set
 # CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
 # CONFIG_MINIX_FS is not set
-# CONFIG_VXFS_FS is not set
+# CONFIG_FREEVXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -218,6 +226,7 @@
 # Network File Systems
 #
 # CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_ROOT_NFS is not set
@@ -235,6 +244,8 @@
 # CONFIG_NCPFS_SMALLDOS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
+# CONFIG_ZISOFS_FS is not set
+# CONFIG_ZLIB_FS_INFLATE is not set
 
 #
 # Partition Types
@@ -247,6 +258,7 @@
 CONFIG_IBM_PARTITION=y
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION 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
diff -u --recursive --new-file v2.4.14/linux/arch/s390/kernel/entry.S linux/arch/s390/kernel/entry.S
--- v2.4.14/linux/arch/s390/kernel/entry.S	Tue Oct 23 22:48:49 2001
+++ linux/arch/s390/kernel/entry.S	Fri Nov  9 13:58:02 2001
@@ -256,9 +256,17 @@
 #
 sysc_tracesys:
         l       %r1,BASED(.Ltrace)
-	l       %r2,BASED(.Lc_ENOSYS)
-	st      %r2,SP_R2(%r15)   # give sysc_trace an -ENOSYS retval
+	l       %r7,BASED(.Lc_ENOSYS)
+	st      %r7,SP_R2(%r15)   # give sysc_trace an -ENOSYS retval
         basr    %r14,%r1
+	l       %r2,SP_R2(%r15)
+	cr      %r2,%r7 # compare with saved -ENOSYS
+	be      BASED(sysc_tracesys_dn1)
+	# strace wants to change the syscall
+	sll     %r2,24
+	srl     %r2,22
+        l       %r8,sys_call_table-entry_base(2,%r13) # get address of system call    
+sysc_tracesys_dn1:		
 	lm      %r3,%r6,SP_R3(%r15)
 	l       %r2,SP_ORIG_R2(%r15)
         basr    %r14,%r8          # call sys_xxx
@@ -689,10 +697,7 @@
         l       %r5,SP_PSW+4(15)  # load psw addr
         sr      %r5,%r7           # substract ilc from psw
         st      %r5,SP_PSW+4(15)  # store corrected psw addr
-pgm_per:cl      %r3,BASED(.Lc20)  # pseudo page fault ?
-        be      BASED(pgm_go)     # if yes then don't reenable interrupts
-        stosm   24(%r15),0x03     # reenable interrupts
-pgm_go: basr    %r14,%r1          # branch to interrupt-handler
+pgm_per:basr    %r14,%r1          # branch to interrupt-handler
 pgm_dn: n	%r8,BASED(.Lc128) # check for per excepton
         be      BASED(pgm_return)
         la      %r2,SP_PTREGS(15) # address of register-save area
diff -u --recursive --new-file v2.4.14/linux/arch/s390/kernel/head.S linux/arch/s390/kernel/head.S
--- v2.4.14/linux/arch/s390/kernel/head.S	Tue Oct 23 22:48:49 2001
+++ linux/arch/s390/kernel/head.S	Fri Nov  9 13:58:02 2001
@@ -338,12 +338,12 @@
 # reset files in VM reader
 #
         stidp __LC_CPUID                       # store cpuid
-        lh    %r0,__LC_CPUID+4                 # get cpu version
-        chi   %r0,0x7490                       # running on P/390 ?
-        be    start                            #   no -> skip reset
+	tm    __LC_CPUID,0xff                  # running VM ?
+	bno   .Lnoreset
         la    %r2,.Lreset              
         lhi   %r3,26
         .long 0x83230008
+.Lnoreset:
 #endif
 	
 #
diff -u --recursive --new-file v2.4.14/linux/arch/s390/kernel/init_task.c linux/arch/s390/kernel/init_task.c
--- v2.4.14/linux/arch/s390/kernel/init_task.c	Sun Sep 23 11:40:56 2001
+++ linux/arch/s390/kernel/init_task.c	Fri Nov  9 13:58:02 2001
@@ -12,6 +12,7 @@
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 
+static struct vm_area_struct init_mmap = INIT_MMAP;
 static struct fs_struct init_fs = INIT_FS;
 static struct files_struct init_files = INIT_FILES;
 static struct signal_struct init_signals = INIT_SIGNALS;
diff -u --recursive --new-file v2.4.14/linux/arch/s390/kernel/s390_ksyms.c linux/arch/s390/kernel/s390_ksyms.c
--- v2.4.14/linux/arch/s390/kernel/s390_ksyms.c	Tue Oct 23 22:48:49 2001
+++ linux/arch/s390/kernel/s390_ksyms.c	Fri Nov  9 13:58:02 2001
@@ -59,4 +59,3 @@
 EXPORT_SYMBOL_NOVERS(do_call_softirq);
 
 
-
diff -u --recursive --new-file v2.4.14/linux/arch/s390/kernel/setup.c linux/arch/s390/kernel/setup.c
--- v2.4.14/linux/arch/s390/kernel/setup.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390/kernel/setup.c	Fri Nov 16 18:38:39 2001
@@ -34,6 +34,7 @@
 #endif
 #include <linux/bootmem.h>
 #include <linux/console.h>
+#include <linux/seq_file.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/smp.h>
@@ -478,49 +479,48 @@
 }
 
 /*
- * get_cpuinfo - Get information on one CPU for use by procfs.
- *
- *	Prints info on the next CPU into buffer.  Beware, doesn't check for
- *	buffer overflow.  Current implementation of procfs assumes that the
- *	resulting data is <= 1K.
- *
- * Args:
- *	buffer	-- you guessed it, the data buffer
- *	cpu_np	-- Input: next cpu to get (start at 0).  Output: Updated.
- *
- *	Returns number of bytes written to buffer.
+ * show_cpuinfo - Get information on one CPU for use by procfs.
  */
 
-int get_cpuinfo(char *buffer, unsigned *cpu_np)
+static int show_cpuinfo(struct seq_file *m, void *v)
 {
         struct cpuinfo_S390 *cpuinfo;
-        char *p = buffer;
-	unsigned n;
+	unsigned n = v;
 
-	n = *cpu_np;
-	while (n < NR_CPUS && (cpu_online_map & (1 << n)) == 0)
-		n++;
-	if (n >= NR_CPUS) {
-		*cpu_np = NR_CPUS;
-		return (0);
-	}
-	*cpu_np = n + 1;
-
-	if (n == 0) {
-		p += sprintf(p,"vendor_id       : IBM/S390\n"
+	if (!n--) {
+		seq_printf(m, "vendor_id       : IBM/S390\n"
 			       "# processors    : %i\n"
 			       "bogomips per cpu: %lu.%02lu\n",
 			       smp_num_cpus, loops_per_jiffy/(500000/HZ),
 			       (loops_per_jiffy/(5000/HZ))%100);
+	} else if (cpu_online_map & (1 << n)) {
+		cpuinfo = &safe_get_cpu_lowcore(n).cpu_data;
+		seq_printf(m, "processor %i: "
+			       "version = %02X,  "
+			       "identification = %06X,  "
+			       "machine = %04X\n",
+			       n, cpuinfo->cpu_id.version,
+			       cpuinfo->cpu_id.ident,
+			       cpuinfo->cpu_id.machine);
 	}
-	cpuinfo = &safe_get_cpu_lowcore(n).cpu_data;
-	p += sprintf(p,"processor %i: "
-		       "version = %02X,  "
-		       "identification = %06X,  "
-		       "machine = %04X\n",
-		       n, cpuinfo->cpu_id.version,
-		       cpuinfo->cpu_id.ident,
-		       cpuinfo->cpu_id.machine);
-        return p - buffer;
+        return 0;
 }
 
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	return *pos <= NR_CPUS ? (void)(*pos+1) : NULL;
+}
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
diff -u --recursive --new-file v2.4.14/linux/arch/s390/kernel/traps.c linux/arch/s390/kernel/traps.c
--- v2.4.14/linux/arch/s390/kernel/traps.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390/kernel/traps.c	Fri Nov  9 13:58:02 2001
@@ -94,8 +94,16 @@
 static void inline do_trap(long interruption_code, int signr, char *str,
                            struct pt_regs *regs, siginfo_t *info)
 {
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+        if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
         if (regs->psw.mask & PSW_PROBLEM_STATE) {
                 struct task_struct *tsk = current;
+
                 tsk->thread.trap_no = interruption_code;
 		if (info)
 			force_sig_info(signr, info, tsk);
@@ -160,20 +168,27 @@
         __u8 opcode[6];
 	__u16 *location;
 	int signal = 0;
-	int problem_state=(regs->psw.mask & PSW_PROBLEM_STATE);
 
 	location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
-	if(problem_state)
+
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
 		get_user(*((__u16 *) opcode), location);
 	else
 		*((__u16 *)opcode)=*((__u16 *)location);
-	if(*((__u16 *)opcode)==S390_BREAKPOINT_U16)
+	if (*((__u16 *)opcode)==S390_BREAKPOINT_U16)
         {
 		if(do_debugger_trap(regs,SIGTRAP))
 			signal = SIGILL;
 	}
 #ifdef CONFIG_MATHEMU
-        else if (problem_state)
+        else if (regs->psw.mask & PSW_PROBLEM_STATE)
 	{
 		if (opcode[0] == 0xb3) {
 			get_user(*((__u16 *) (opcode+2)), location+1);
@@ -216,8 +231,16 @@
 	__u16 *location = NULL;
 	int signal = 0;
 
+	location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+		
         if (regs->psw.mask & PSW_PROBLEM_STATE) {
-		location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
 		get_user(*((__u16 *) opcode), location);
 		switch (opcode[0]) {
 		case 0x28: /* LDR Rx,Ry   */
@@ -267,6 +290,14 @@
 	int signal = 0;
 
 	location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
 	if (MACHINE_HAS_IEEE)
 		__asm__ volatile ("stfpc %0\n\t" 
 				  : "=m" (current->thread.fp_regs.fpc));
diff -u --recursive --new-file v2.4.14/linux/arch/s390/mm/fault.c linux/arch/s390/mm/fault.c
--- v2.4.14/linux/arch/s390/mm/fault.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390/mm/fault.c	Fri Nov  9 13:58:02 2001
@@ -159,14 +159,17 @@
 	/*
 	 * Check whether we have a user MM in the first place.
 	 */
-        if (in_interrupt() || !mm)
+        if (in_interrupt() || !mm || !(regs->psw.mask & _PSW_IO_MASK_BIT))
                 goto no_context;
 
 	/*
 	 * When we get here, the fault happened in the current
-	 * task's user address space, so we search the VMAs
+	 * task's user address space, so we can switch on the
+	 * interrupts again and then search the VMAs
 	 */
 
+	__sti();
+
         down_read(&mm->mmap_sem);
 
         vma = find_vma(mm, address);
@@ -415,7 +418,11 @@
                                          "  la   2,0(%0)\n"
                                          "  sacf 512\n"
                                          "  ic   2,0(2)\n"
-                                         "  sacf 0"
+					 "0:sacf 0\n"
+					 ".section __ex_table,\"a\"\n"
+					 "  .align 4\n"
+					 "  .long  0b,0b\n"
+					 ".previous"
                                          : : "a" (address) : "2" );
 
                         return;
@@ -513,7 +520,7 @@
          * external interrupt. 
 	 */
 	subcode = S390_lowcore.cpu_addr;
-	if ((subcode & 0xff00) != 0x0600)
+	if ((subcode & 0xff00) != 0x0200)
 		return;
 
 	/*
@@ -522,6 +529,13 @@
 	tsk = (struct task_struct *)
 		(*((unsigned long *) __LC_PFAULT_INTPARM) - THREAD_SIZE);
 	
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
 	if (subcode & 0x0080) {
 		/* signal bit is set -> a page has been swapped in by VM */
 		qp = (wait_queue_head_t *)
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/defconfig linux/arch/s390x/defconfig
--- v2.4.14/linux/arch/s390x/defconfig	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/defconfig	Fri Nov  9 13:58:02 2001
@@ -185,19 +185,25 @@
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
+# CONFIG_CMS_FS is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
+# CONFIG_JBD_DEBUG is not set
 # CONFIG_FAT_FS is not set
 # CONFIG_MSDOS_FS is not set
 # CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
 # CONFIG_MINIX_FS is not set
-# CONFIG_VXFS_FS is not set
+# CONFIG_FREEVXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -220,6 +226,7 @@
 # Network File Systems
 #
 # CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_ROOT_NFS is not set
@@ -237,6 +244,8 @@
 # CONFIG_NCPFS_SMALLDOS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
+# CONFIG_ZISOFS_FS is not set
+# CONFIG_ZLIB_FS_INFLATE is not set
 
 #
 # Partition Types
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/entry.S linux/arch/s390x/kernel/entry.S
--- v2.4.14/linux/arch/s390x/kernel/entry.S	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/kernel/entry.S	Fri Nov  9 13:58:02 2001
@@ -247,6 +247,17 @@
 	lghi    %r2,-ENOSYS
 	stg     %r2,SP_R2(%r15)     # give sysc_trace an -ENOSYS retval
         brasl   %r14,syscall_trace
+	lg      %r2,SP_R2(%r15)
+	cghi    %r2,-ENOSYS
+	je      sysc_tracesys_dn1   
+	sllg    %r2,%r2,56          # strace wants to change the syscall
+	srlg    %r2,%r2,53          # zap unused bits & multiply by 8
+	tm      SP_PSW+3(%r15),0x01 # are we running in 31 bit mode ?
+        jo      sysc_tracesys_noemu
+	la      %r2,4(%r2)          # use 31 bit emulation system calls
+sysc_tracesys_noemu:
+	lgf	%r8,0(%r2,%r7)      # load address of system call routine
+sysc_tracesys_dn1:	
 	lmg     %r3,%r6,SP_R3(%r15)
 	lg      %r2,SP_ORIG_R2(%r15)
         basr    %r14,%r8            # call sys_xxx
@@ -672,7 +683,6 @@
 	GET_CURRENT
 pgm_no_sv:
         llgh    %r8,__LC_PGM_INT_CODE  # N.B. saved int code used later KEEP it
-        stosm   48(%r15),0x03     # reenable interrupts
 	lghi    %r3,0x7f
         nr      %r3,%r8           # clear per-event-bit & move to r3
         je      pgm_dn            # none of Martins exceptions occurred bypass
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/head.S linux/arch/s390x/kernel/head.S
--- v2.4.14/linux/arch/s390x/kernel/head.S	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/kernel/head.S	Fri Nov  9 13:58:02 2001
@@ -337,12 +337,12 @@
 # reset files in VM reader
 #
         stidp __LC_CPUID                       # store cpuid
-        lh    %r0,__LC_CPUID+4                 # get cpu version
-        chi   %r0,0x7490                       # running on P/390 ?
-        be    start                            #   no -> skip reset
+	tm    __LC_CPUID,0xff                  # running VM ?
+	bno   .Lnoreset
         la    %r2,.Lreset              
         lhi   %r3,26
         .long 0x83230008
+.Lnoreset:
 #endif
 	
 #
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/init_task.c linux/arch/s390x/kernel/init_task.c
--- v2.4.14/linux/arch/s390x/kernel/init_task.c	Sun Sep 23 11:40:56 2001
+++ linux/arch/s390x/kernel/init_task.c	Fri Nov  9 13:58:02 2001
@@ -12,6 +12,7 @@
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 
+static struct vm_area_struct init_mmap = INIT_MMAP;
 static struct fs_struct init_fs = INIT_FS;
 static struct files_struct init_files = INIT_FILES;
 static struct signal_struct init_signals = INIT_SIGNALS;
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/ioctl32.c linux/arch/s390x/kernel/ioctl32.c
--- v2.4.14/linux/arch/s390x/kernel/ioctl32.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/kernel/ioctl32.c	Wed Nov  7 14:39:36 2001
@@ -487,6 +487,13 @@
 	IOCTL32_HANDLER(SIOCADDRT, routing_ioctl),
 	IOCTL32_HANDLER(SIOCDELRT, routing_ioctl),
 
+	IOCTL32_HANDLER(SIOCBONDENSLAVE, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDRELEASE, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDSETHWADDR, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDSLAVEINFOQUERY, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDINFOQUERY, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDCHANGEACTIVE, bond_ioctl),
+
 	IOCTL32_HANDLER(EXT2_IOC32_GETFLAGS, do_ext2_ioctl),
 	IOCTL32_HANDLER(EXT2_IOC32_SETFLAGS, do_ext2_ioctl),
 	IOCTL32_HANDLER(EXT2_IOC32_GETVERSION, do_ext2_ioctl),
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/setup.c linux/arch/s390x/kernel/setup.c
--- v2.4.14/linux/arch/s390x/kernel/setup.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/kernel/setup.c	Fri Nov 16 18:38:39 2001
@@ -34,6 +34,7 @@
 #endif
 #include <linux/bootmem.h>
 #include <linux/console.h>
+#include <linux/seq_file.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/smp.h>
@@ -467,49 +468,48 @@
 }
 
 /*
- * get_cpuinfo - Get information on one CPU for use by procfs.
- *
- *	Prints info on the next CPU into buffer.  Beware, doesn't check for
- *	buffer overflow.  Current implementation of procfs assumes that the
- *	resulting data is <= 1K.
- *
- * Args:
- *	buffer	-- you guessed it, the data buffer
- *	cpu_np	-- Input: next cpu to get (start at 0).  Output: Updated.
- *
- *	Returns number of bytes written to buffer.
+ * show_cpuinfo - Get information on one CPU for use by procfs.
  */
 
-int get_cpuinfo(char *buffer, unsigned *cpu_np)
+static int show_cpuinfo(struct seq_file *m, void *v)
 {
         struct cpuinfo_S390 *cpuinfo;
-        char *p = buffer;
-	unsigned n;
+	unsigned n = v;
 
-	n = *cpu_np;
-	while (n < NR_CPUS && (cpu_online_map & (1 << n)) == 0)
-		n++;
-	if (n >= NR_CPUS) {
-		*cpu_np = NR_CPUS;
-		return (0);
-	}
-	*cpu_np = n + 1;
-
-	if (n == 0) {
-		p += sprintf(p, "vendor_id       : IBM/S390\n"
+	if (!n--) {
+		seq_printf(m, "vendor_id       : IBM/S390\n"
 				"# processors    : %i\n"
 				"bogomips per cpu: %lu.%02lu\n",
 				smp_num_cpus, loops_per_jiffy/(500000/HZ),
 				(loops_per_jiffy/(5000/HZ))%100);
+	} else if (cpu_online_map & (1 << n)) {
+		cpuinfo = &safe_get_cpu_lowcore(n).cpu_data;
+		seq_printf(m, "processor %i: "
+				"version = %02X,  "
+				"identification = %06X,  "
+				"machine = %04X\n",
+				n, cpuinfo->cpu_id.version,
+				cpuinfo->cpu_id.ident,
+				cpuinfo->cpu_id.machine);
 	}
-	cpuinfo = &safe_get_cpu_lowcore(n).cpu_data;
-	p += sprintf(p, "processor %i: "
-			"version = %02X,  "
-			"identification = %06X,  "
-			"machine = %04X\n",
-			n, cpuinfo->cpu_id.version,
-			cpuinfo->cpu_id.ident,
-			cpuinfo->cpu_id.machine);
-        return p - buffer;
+        return 0;
 }
 
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	return *pos <= NR_CPUS ? (void)(*pos+1) : NULL;
+}
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/traps.c linux/arch/s390x/kernel/traps.c
--- v2.4.14/linux/arch/s390x/kernel/traps.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/kernel/traps.c	Fri Nov  9 13:58:02 2001
@@ -92,6 +92,13 @@
 static void inline do_trap(long interruption_code, int signr, char *str,
                            struct pt_regs *regs, siginfo_t *info)
 {
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
         if (regs->psw.mask & PSW_PROBLEM_STATE) {
                 struct task_struct *tsk = current;
                 tsk->thread.trap_no = interruption_code;
@@ -161,6 +168,14 @@
 	int do_sig = 0;
 
 	location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
 	/* WARNING don't change this check back to */
 	/* int problem_state=(regs->psw.mask & PSW_PROBLEM_STATE); */
 	/* & then doing if(problem_state) an int is too small for this */
@@ -186,6 +201,14 @@
 	int do_sig = 0;
 
 	location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
+
 	__asm__ volatile ("stfpc %0\n\t" 
 			  : "=m" (current->thread.fp_regs.fpc));
 	/* Same code should work when we implement fpu emulation */
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/wrapper32.S linux/arch/s390x/kernel/wrapper32.S
--- v2.4.14/linux/arch/s390x/kernel/wrapper32.S	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/kernel/wrapper32.S	Fri Nov  9 13:58:02 2001
@@ -629,8 +629,10 @@
 	.globl  sys32_llseek_wrapper 
 sys32_llseek_wrapper:
 	llgfr	%r2,%r2			# unsigned int
-	lgfr	%r3,%r3			# off_t
-	llgfr	%r4,%r4			# unsigned int
+	llgfr	%r3,%r3			# unsigned long
+	llgfr	%r4,%r4			# unsigned long
+	llgtr	%r5,%r5			# loff_t *
+	llgfr	%r6,%r6			# unsigned int
 	jg	sys_llseek		# branch to system call
 
 	.globl  sys32_getdents_wrapper 
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/mm/fault.c linux/arch/s390x/mm/fault.c
--- v2.4.14/linux/arch/s390x/mm/fault.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/mm/fault.c	Fri Nov  9 13:58:02 2001
@@ -159,14 +159,17 @@
 	/*
 	 * Check whether we have a user MM in the first place.
 	 */
-        if (in_interrupt() || !mm)
+        if (in_interrupt() || !mm || !(regs->psw.mask & _PSW_IO_MASK_BIT))
                 goto no_context;
 
 	/*
 	 * When we get here, the fault happened in the current
-	 * task's user address space, so we search the VMAs
+	 * task's user address space, so we can switch on the
+	 * interrupts again and then search the VMAs
 	 */
 
+	__sti();
+
         down_read(&mm->mmap_sem);
 
         vma = find_vma(mm, address);
@@ -419,6 +422,13 @@
 	 */
 	tsk = (struct task_struct *)
 		(*((unsigned long *) __LC_PFAULT_INTPARM) - THREAD_SIZE);
+
+	/*
+	 * We got all needed information from the lowcore and can
+	 * now safely switch on interrupts.
+	 */
+	if (regs->psw.mask & PSW_PROBLEM_STATE)
+		__sti();
 
 	if (subcode & 0x0080) {
 		/* signal bit is set -> a page has been swapped in by VM */
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/mm/init.c linux/arch/s390x/mm/init.c
--- v2.4.14/linux/arch/s390x/mm/init.c	Tue Oct 23 22:48:50 2001
+++ linux/arch/s390x/mm/init.c	Fri Nov  9 13:58:02 2001
@@ -59,7 +59,7 @@
 			}
                         if(pte_quicklist) {
 				pte_free_slow(pte_alloc_one_fast(NULL, 0));
-				freed += 4;
+				freed += 1;
 			}
                 } while(pgtable_cache_size > low);
         }
diff -u --recursive --new-file v2.4.14/linux/arch/sh/kernel/setup.c linux/arch/sh/kernel/setup.c
--- v2.4.14/linux/arch/sh/kernel/setup.c	Sun Sep 23 11:40:56 2001
+++ linux/arch/sh/kernel/setup.c	Fri Nov 16 18:38:39 2001
@@ -31,6 +31,7 @@
 #include <linux/bootmem.h>
 #include <linux/console.h>
 #include <linux/ctype.h>
+#include <linux/seq_file.h>
 #include <asm/processor.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
@@ -517,24 +518,22 @@
  *	Get CPU information for use by the procfs.
  */
 #ifdef CONFIG_PROC_FS
-int get_cpuinfo(char *buffer)
+static int show_cpuinfo(struct seq_file *m, void *v)
 {
-	char *p = buffer;
-
 #if defined(__sh3__)
-	p += sprintf(p,"cpu family\t: SH-3\n"
-		       "cache size\t: 8K-byte\n");
+	seq_printf(m, "cpu family\t: SH-3\n"
+		      "cache size\t: 8K-byte\n");
 #elif defined(__SH4__)
-	p += sprintf(p,"cpu family\t: SH-4\n"
-		       "cache size\t: 8K-byte/16K-byte\n");
+	seq_printf(m, "cpu family\t: SH-4\n"
+		      "cache size\t: 8K-byte/16K-byte\n");
 #endif
-	p += sprintf(p, "bogomips\t: %lu.%02lu\n\n",
+	seq_printf(m, "bogomips\t: %lu.%02lu\n\n",
 		     loops_per_jiffy/(500000/HZ),
 		     (loops_per_jiffy/(5000/HZ)) % 100);
-	p += sprintf(p, "Machine: %s\n", sh_mv.mv_name);
+	seq_printf(m, "Machine: %s\n", sh_mv.mv_name);
 
 #define PRINT_CLOCK(name, value) \
-	p += sprintf(p, name " clock: %d.%02dMHz\n", \
+	seq_printf(m, name " clock: %d.%02dMHz\n", \
 		     ((value) / 1000000), ((value) % 1000000)/10000)
 	
 	PRINT_CLOCK("CPU", boot_cpu_data.cpu_clock);
@@ -544,6 +543,24 @@
 #endif
 	PRINT_CLOCK("Peripheral module", boot_cpu_data.module_clock);
 
-	return p - buffer;
+	return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	return (void*)(*pos == 0);
 }
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	return NULL;
+}
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
 #endif
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/defconfig linux/arch/sparc/defconfig
--- v2.4.14/linux/arch/sparc/defconfig	Mon Nov  5 15:55:26 2001
+++ linux/arch/sparc/defconfig	Tue Nov 13 09:16:05 2001
@@ -270,11 +270,15 @@
 CONFIG_AUTOFS4_FS=m
 # CONFIG_REISERFS_FS is not set
 # CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 CONFIG_AFFS_FS=m
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
+CONFIG_EXT3_FS=m
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
 CONFIG_FAT_FS=m
 CONFIG_MSDOS_FS=m
 # CONFIG_UMSDOS_FS is not set
@@ -287,6 +291,7 @@
 # CONFIG_RAMFS is not set
 CONFIG_ISO9660_FS=m
 # CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
 CONFIG_MINIX_FS=m
 # CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
@@ -311,6 +316,7 @@
 # Network File Systems
 #
 CONFIG_CODA_FS=m
+CONFIG_INTERMEZZO_FS=m
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_ROOT_NFS is not set
@@ -329,6 +335,8 @@
 # CONFIG_NCPFS_SMALLDOS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
+# CONFIG_ZISOFS_FS is not set
+# CONFIG_ZLIB_FS_INFLATE is not set
 
 #
 # Partition Types
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/kernel/ebus.c linux/arch/sparc/kernel/ebus.c
--- v2.4.14/linux/arch/sparc/kernel/ebus.c	Sun Aug 12 13:27:59 2001
+++ linux/arch/sparc/kernel/ebus.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: ebus.c,v 1.17 2001/08/06 13:12:57 davem Exp $
+/* $Id: ebus.c,v 1.18 2001/11/08 04:41:33 davem Exp $
  * ebus.c: PCI to EBus bridge device.
  *
  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
@@ -113,6 +113,9 @@
 		dev->resource[i].start = dev->parent->resource[regs[i]].start; /* XXX resource */
 	}
 
+	for (i = 0; i < PROMINTR_MAX; i++)
+		dev->irqs[i] = PCI_IRQ_NONE;
+
 	if ((dev->irqs[0] = ebus_blacklist_irq(dev->prom_name)) != 0) {
 		dev->num_irqs = 1;
 	} else if ((len = prom_getproperty(node, "interrupts",
@@ -204,6 +207,9 @@
 		}
 		dev->resource[i].start = baseaddr;	/* XXX Unaligned */
 	}
+
+	for (i = 0; i < PROMINTR_MAX; i++)
+		dev->irqs[i] = PCI_IRQ_NONE;
 
 	if ((dev->irqs[0] = ebus_blacklist_irq(dev->prom_name)) != 0) {
 		dev->num_irqs = 1;
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/kernel/entry.S linux/arch/sparc/kernel/entry.S
--- v2.4.14/linux/arch/sparc/kernel/entry.S	Mon Jan 29 08:08:46 2001
+++ linux/arch/sparc/kernel/entry.S	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: entry.S,v 1.169 2001/01/25 21:47:20 davem Exp $
+/* $Id: entry.S,v 1.170 2001/11/13 00:57:05 davem Exp $
  * arch/sparc/kernel/entry.S:  Sparc trap low-level entry points.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -1461,21 +1461,12 @@
 	b	2f
 	 mov	%i4, %o4
 
-	.globl	C_LABEL(ret_from_syscall)
-C_LABEL(ret_from_syscall):
-	b	C_LABEL(ret_sys_call)
-	 ld	[%sp + REGWIN_SZ + PT_I0], %o0
-
-#ifdef CONFIG_SMP
-	.globl	C_LABEL(ret_from_smpfork)
-C_LABEL(ret_from_smpfork):
-	wr	%l0, PSR_ET, %psr
-	WRITE_PAUSE
+	.globl	C_LABEL(ret_from_fork)
+C_LABEL(ret_from_fork):
 	call	schedule_tail
 	 mov	%g3, %o0
 	b	C_LABEL(ret_sys_call)
 	 ld	[%sp + REGWIN_SZ + PT_I0], %o0
-#endif
 
 	/* Linux native and SunOS system calls enter here... */
 	.align	4
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/kernel/process.c linux/arch/sparc/kernel/process.c
--- v2.4.14/linux/arch/sparc/kernel/process.c	Thu Oct 11 08:02:26 2001
+++ linux/arch/sparc/kernel/process.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/*  $Id: process.c,v 1.156 2001/10/02 02:22:26 davem Exp $
+/*  $Id: process.c,v 1.157 2001/11/13 00:57:05 davem Exp $
  *  linux/arch/sparc/kernel/process.c
  *
  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -455,11 +455,7 @@
  *       allocate the task_struct and kernel stack in
  *       do_fork().
  */
-#ifdef CONFIG_SMP
-extern void ret_from_smpfork(void);
-#else
-extern void ret_from_syscall(void);
-#endif
+extern void ret_from_fork(void);
 
 int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
 		unsigned long unused,
@@ -493,13 +489,8 @@
 	copy_regwin(new_stack, (((struct reg_window *) regs) - 1));
 
 	p->thread.ksp = (unsigned long) new_stack;
-#ifdef CONFIG_SMP
-	p->thread.kpc = (((unsigned long) ret_from_smpfork) - 0x8);
-	p->thread.kpsr = current->thread.fork_kpsr | PSR_PIL;
-#else
-	p->thread.kpc = (((unsigned long) ret_from_syscall) - 0x8);
+	p->thread.kpc = (((unsigned long) ret_from_fork) - 0x8);
 	p->thread.kpsr = current->thread.fork_kpsr;
-#endif
 	p->thread.kwim = current->thread.fork_kwim;
 
 	/* This is used for sun4c only */
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/kernel/setup.c linux/arch/sparc/kernel/setup.c
--- v2.4.14/linux/arch/sparc/kernel/setup.c	Sun Sep 23 11:40:56 2001
+++ linux/arch/sparc/kernel/setup.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/*  $Id: setup.c,v 1.125 2001/09/20 00:35:30 davem Exp $
+/*  $Id: setup.c,v 1.126 2001/11/13 00:49:27 davem Exp $
  *  linux/arch/sparc/kernel/setup.c
  *
  *  Copyright (C) 1995  David S. Miller (davem@caip.rutgers.edu)
@@ -20,6 +20,7 @@
 #include <linux/delay.h>
 #include <linux/config.h>
 #include <linux/fs.h>
+#include <linux/seq_file.h>
 #include <linux/kdev_t.h>
 #include <linux/major.h>
 #include <linux/string.h>
@@ -455,42 +456,72 @@
 	return -EIO;
 }
 
-/* BUFFER is PAGE_SIZE bytes long. */
-
 extern char *sparc_cpu_type[];
 extern char *sparc_fpu_type[];
 
-int get_cpuinfo(char *buffer)
+static int show_cpuinfo(struct seq_file *m, void *__unused)
 {
-	int cpuid=hard_smp_processor_id();
-	int len;
+	int cpuid = hard_smp_processor_id();
 
-	len = sprintf(buffer, "cpu\t\t: %s\n"
-            "fpu\t\t: %s\n"
-            "promlib\t\t: Version %d Revision %d\n"
-            "prom\t\t: %d.%d\n"
-            "type\t\t: %s\n"
-	    "ncpus probed\t: %d\n"
-	    "ncpus active\t: %d\n"
+	seq_printf(m,
+		   "cpu\t\t: %s\n"
+		   "fpu\t\t: %s\n"
+		   "promlib\t\t: Version %d Revision %d\n"
+		   "prom\t\t: %d.%d\n"
+		   "type\t\t: %s\n"
+		   "ncpus probed\t: %d\n"
+		   "ncpus active\t: %d\n"
 #ifndef CONFIG_SMP
-            "BogoMips\t: %lu.%02lu\n"
+		   "BogoMips\t: %lu.%02lu\n"
 #endif
-	    ,
-	    sparc_cpu_type[cpuid] ? : "undetermined",
-	    sparc_fpu_type[cpuid] ? : "undetermined",
-            romvec->pv_romvers, prom_rev, romvec->pv_printrev >> 16, (short)romvec->pv_printrev,
-            &cputypval,
-	    linux_num_cpus, smp_num_cpus
+		   ,
+		   sparc_cpu_type[cpuid] ? : "undetermined",
+		   sparc_fpu_type[cpuid] ? : "undetermined",
+		   romvec->pv_romvers,
+		   prom_rev,
+		   romvec->pv_printrev >> 16,
+		   (short) romvec->pv_printrev,
+		   &cputypval,
+		   linux_num_cpus,
+		   smp_num_cpus
 #ifndef CONFIG_SMP
-	    , loops_per_jiffy/(500000/HZ), (loops_per_jiffy/(5000/HZ)) % 100
+		   , loops_per_jiffy/(500000/HZ),
+		   (loops_per_jiffy/(5000/HZ)) % 100
 #endif
-	    );
+		);
+
 #ifdef CONFIG_SMP
-	len += smp_bogo_info(buffer + len);
+	smp_bogo_info(m);
 #endif
-	len += mmu_info(buffer + len);
+	mmu_info(m);
 #ifdef CONFIG_SMP
-	len += smp_info(buffer + len);
+	smp_info(m);
 #endif
-	return len;
+	return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	/* The pointer we are returning is arbitrary,
+	 * it just has to be non-NULL and not IS_ERR
+	 * in the success case.
+	 */
+	return *pos == 0 ? &c_start : NULL;
+}
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
 }
+
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/kernel/smp.c linux/arch/sparc/kernel/smp.c
--- v2.4.14/linux/arch/sparc/kernel/smp.c	Mon Jan  1 10:37:41 2001
+++ linux/arch/sparc/kernel/smp.c	Tue Nov 13 09:16:05 2001
@@ -16,6 +16,8 @@
 #include <linux/init.h>
 #include <linux/spinlock.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/ptrace.h>
 #include <asm/atomic.h>
@@ -276,25 +278,26 @@
 	return 0;
 }
 
-int smp_bogo_info(char *buf)
+void smp_bogo_info(struct seq_file *m)
 {
-	int len = 0, i;
+	int i;
 	
-	for (i = 0; i < NR_CPUS; i++)
+	for (i = 0; i < NR_CPUS; i++) {
 		if (cpu_present_map & (1 << i))
-			len += sprintf(buf + len, "Cpu%dBogo\t: %lu.%02lu\n", 
-					i,
-					cpu_data[i].udelay_val/(500000/HZ),
-					(cpu_data[i].udelay_val/(5000/HZ))%100);
-	return len;
+			seq_printf(m,
+				   "Cpu%dBogo\t: %lu.%02lu\n", 
+				   i,
+				   cpu_data[i].udelay_val/(500000/HZ),
+				   (cpu_data[i].udelay_val/(5000/HZ))%100);
+	}
 }
 
-int smp_info(char *buf)
+void smp_info(struct seq_file *m)
 {
-	int len = 0, i;
+	int i;
 	
-	for (i = 0; i < NR_CPUS; i++)
+	for (i = 0; i < NR_CPUS; i++) {
 		if (cpu_present_map & (1 << i))
-			len += sprintf(buf + len, "CPU%d\t\t: online\n", i);
-	return len;
+			seq_printf(m, "CPU%d\t\t: online\n", i);
+	}
 }
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/mm/srmmu.c linux/arch/sparc/mm/srmmu.c
--- v2.4.14/linux/arch/sparc/mm/srmmu.c	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc/mm/srmmu.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: srmmu.c,v 1.232 2001/10/30 04:54:22 davem Exp $
+/* $Id: srmmu.c,v 1.233 2001/11/13 00:49:27 davem Exp $
  * srmmu.c:  SRMMU specific routines for memory management.
  *
  * Copyright (C) 1995 David S. Miller  (davem@caip.rutgers.edu)
@@ -18,6 +18,8 @@
 #include <linux/blk.h>
 #include <linux/spinlock.h>
 #include <linux/bootmem.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/page.h>
 #include <asm/pgalloc.h>
@@ -1209,18 +1211,17 @@
 	}
 }
 
-static int srmmu_mmu_info(char *buf)
+static void srmmu_mmu_info(struct seq_file *m)
 {
-	return sprintf(buf, 
-		"MMU type\t: %s\n"
-		"contexts\t: %d\n"
-		"nocache total\t: %ld\n"
-		"nocache used\t: %d\n"
-		, srmmu_name,
-		num_contexts,
-		SRMMU_NOCACHE_SIZE,
-		(srmmu_nocache_used << SRMMU_NOCACHE_BITMAP_SHIFT)
-	);
+	seq_printf(m, 
+		   "MMU type\t: %s\n"
+		   "contexts\t: %d\n"
+		   "nocache total\t: %ld\n"
+		   "nocache used\t: %d\n",
+		   srmmu_name,
+		   num_contexts,
+		   SRMMU_NOCACHE_SIZE,
+		   (srmmu_nocache_used << SRMMU_NOCACHE_BITMAP_SHIFT));
 }
 
 static void srmmu_update_mmu_cache(struct vm_area_struct * vma, unsigned long address, pte_t pte)
diff -u --recursive --new-file v2.4.14/linux/arch/sparc/mm/sun4c.c linux/arch/sparc/mm/sun4c.c
--- v2.4.14/linux/arch/sparc/mm/sun4c.c	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc/mm/sun4c.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: sun4c.c,v 1.208 2001/10/30 04:54:22 davem Exp $
+/* $Id: sun4c.c,v 1.210 2001/11/13 03:27:47 davem Exp $
  * sun4c.c: Doing in software what should be done in hardware.
  *
  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -16,6 +16,8 @@
 #include <linux/init.h>
 #include <linux/bootmem.h>
 #include <linux/highmem.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/scatterlist.h>
 #include <asm/page.h>
@@ -2043,40 +2045,37 @@
 	}
 }
 
-static int sun4c_mmu_info(char *buf)
+static void sun4c_mmu_info(struct seq_file *m)
 {
 	int used_user_entries, i;
-	int len;
 
 	used_user_entries = 0;
 	for (i = 0; i < num_contexts; i++)
 		used_user_entries += sun4c_context_ring[i].num_entries;
 
-	len = sprintf(buf, 
-		"vacsize\t\t: %d bytes\n"
-		"vachwflush\t: %s\n"
-		"vaclinesize\t: %d bytes\n"
-		"mmuctxs\t\t: %d\n"
-		"mmupsegs\t: %d\n"
-		"kernelpsegs\t: %d\n"
-		"kfreepsegs\t: %d\n"
-		"usedpsegs\t: %d\n"
-		"ufreepsegs\t: %d\n"
-		"user_taken\t: %d\n"
-		"max_taken\t: %d\n",
-		sun4c_vacinfo.num_bytes,
-		(sun4c_vacinfo.do_hwflushes ? "yes" : "no"),
-		sun4c_vacinfo.linesize,
-		num_contexts,
-		(invalid_segment + 1),
-		sun4c_kernel_ring.num_entries,
-		sun4c_kfree_ring.num_entries,
-		used_user_entries,
-		sun4c_ufree_ring.num_entries,
-		sun4c_user_taken_entries,
-		max_user_taken_entries);
-
-	return len;
+	seq_printf(m, 
+		   "vacsize\t\t: %d bytes\n"
+		   "vachwflush\t: %s\n"
+		   "vaclinesize\t: %d bytes\n"
+		   "mmuctxs\t\t: %d\n"
+		   "mmupsegs\t: %d\n"
+		   "kernelpsegs\t: %d\n"
+		   "kfreepsegs\t: %d\n"
+		   "usedpsegs\t: %d\n"
+		   "ufreepsegs\t: %d\n"
+		   "user_taken\t: %d\n"
+		   "max_taken\t: %d\n",
+		   sun4c_vacinfo.num_bytes,
+		   (sun4c_vacinfo.do_hwflushes ? "yes" : "no"),
+		   sun4c_vacinfo.linesize,
+		   num_contexts,
+		   (invalid_segment + 1),
+		   sun4c_kernel_ring.num_entries,
+		   sun4c_kfree_ring.num_entries,
+		   used_user_entries,
+		   sun4c_ufree_ring.num_entries,
+		   sun4c_user_taken_entries,
+		   max_user_taken_entries);
 }
 
 /* Nothing below here should touch the mmu hardware nor the mmu_entry
@@ -2100,7 +2099,6 @@
 }
 static void sun4c_pte_clear(pte_t *ptep)	{ *ptep = __pte(0); }
 
-static int sun4c_pmd_none(pmd_t pmd)		{ return !pmd_val(pmd); }
 static int sun4c_pmd_bad(pmd_t pmd)
 {
 	return (((pmd_val(pmd) & ~PAGE_MASK) != PGD_TABLE) ||
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/config.in linux/arch/sparc64/config.in
--- v2.4.14/linux/arch/sparc64/config.in	Sun Sep 23 11:40:56 2001
+++ linux/arch/sparc64/config.in	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-# $Id: config.in,v 1.150 2001/09/18 00:36:03 davem Exp $
+# $Id: config.in,v 1.152 2001/11/12 10:20:47 davem Exp $
 # For a description of the syntax of this configuration file,
 # see the Configure script.
 #
@@ -181,8 +181,17 @@
             bool '  Collect statistics to report in /proc' CONFIG_AIC7XXX_OLD_PROC_STATS
          fi
       fi
-      dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
-      dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI
+      dep_tristate 'SYM53C8XX Version 2 SCSI support' CONFIG_SCSI_SYM53C8XX_2 $CONFIG_SCSI
+      if [ "$CONFIG_SCSI_SYM53C8XX_2" != "n" ]; then
+         int  '  DMA addressing mode' CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE 1
+         int  '  default tagged command queue depth' CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS 16
+         int  '  maximum number of queued commands' CONFIG_SCSI_SYM53C8XX_MAX_TAGS 64
+         bool '  use normal IO' CONFIG_SCSI_SYM53C8XX_IOMAPPED
+      fi
+      if [ "$CONFIG_SCSI_SYM53C8XX_2" != "y" ]; then
+         dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
+         dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI
+      fi
       if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then
 	 int 'default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
 	 int 'maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
@@ -211,7 +220,9 @@
 
 source drivers/fc4/Config.in
 
-source drivers/message/fusion/Config.in
+if [ "$CONFIG_PCI" = "y" ]; then
+   source drivers/message/fusion/Config.in
+fi
 
 source drivers/ieee1394/Config.in
 
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/defconfig linux/arch/sparc64/defconfig
--- v2.4.14/linux/arch/sparc64/defconfig	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc64/defconfig	Tue Nov 13 09:16:05 2001
@@ -70,6 +70,7 @@
 # CONFIG_PARPORT_AMIGA is not set
 # CONFIG_PARPORT_MFC3 is not set
 # CONFIG_PARPORT_ATARI is not set
+# CONFIG_PARPORT_GSC is not set
 # CONFIG_PARPORT_SUNBPP is not set
 # CONFIG_PARPORT_OTHER is not set
 CONFIG_PARPORT_1284=y
@@ -215,7 +216,27 @@
 #
 # QoS and/or fair queueing
 #
-# CONFIG_NET_SCHED is not set
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_CSZ=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_POLICE=y
 
 #
 # ATA/IDE/MFM/RLL support
@@ -333,6 +354,7 @@
 CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT=y
 CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_OLD_PROC_STATS=y
+# CONFIG_SCSI_SYM53C8XX_2 is not set
 CONFIG_SCSI_NCR53C8XX=m
 CONFIG_SCSI_SYM53C8XX=y
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=4
@@ -411,6 +433,9 @@
 # Appletalk devices
 #
 # CONFIG_APPLETALK is not set
+# CONFIG_LTPC is not set
+# CONFIG_COPS is not set
+# CONFIG_IPDDP is not set
 CONFIG_DUMMY=m
 CONFIG_BONDING=m
 CONFIG_EQUALIZER=m
@@ -560,11 +585,15 @@
 CONFIG_AUTOFS4_FS=m
 # CONFIG_REISERFS_FS is not set
 # CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 CONFIG_AFFS_FS=m
 # CONFIG_HFS_FS is not set
 CONFIG_BFS_FS=m
+CONFIG_EXT3_FS=m
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
 CONFIG_FAT_FS=m
 CONFIG_MSDOS_FS=m
 # CONFIG_UMSDOS_FS is not set
@@ -577,6 +606,7 @@
 CONFIG_RAMFS=m
 CONFIG_ISO9660_FS=m
 CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
 CONFIG_MINIX_FS=m
 # CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
@@ -601,6 +631,7 @@
 # Network File Systems
 #
 CONFIG_CODA_FS=m
+CONFIG_INTERMEZZO_FS=m
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
 # CONFIG_ROOT_NFS is not set
@@ -619,6 +650,8 @@
 # CONFIG_NCPFS_SMALLDOS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
+# CONFIG_ZISOFS_FS is not set
+# CONFIG_ZLIB_FS_INFLATE is not set
 
 #
 # Partition Types
@@ -708,7 +741,6 @@
 CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_LONG_TIMEOUT is not set
-# CONFIG_USB_LARGE_CONFIG is not set
 
 #
 # USB Controllers
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/kernel/ebus.c linux/arch/sparc64/kernel/ebus.c
--- v2.4.14/linux/arch/sparc64/kernel/ebus.c	Tue Jul  3 17:08:19 2001
+++ linux/arch/sparc64/kernel/ebus.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: ebus.c,v 1.63 2001/06/08 02:27:16 davem Exp $
+/* $Id: ebus.c,v 1.64 2001/11/08 04:41:33 davem Exp $
  * ebus.c: PCI to EBus bridge device.
  *
  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
@@ -134,6 +134,9 @@
 		}
 	}
 
+	for (i = 0; i < PROMINTR_MAX; i++)
+		dev->irqs[i] = PCI_IRQ_NONE;
+
 	len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs));
 	if ((len == -1) || (len == 0)) {
 		dev->num_irqs = 0;
@@ -221,6 +224,9 @@
 	}
 
 probe_interrupts:
+	for (i = 0; i < PROMINTR_MAX; i++)
+		dev->irqs[i] = PCI_IRQ_NONE;
+
 	len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs));
 	if ((len == -1) || (len == 0)) {
 		dev->num_irqs = 0;
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/kernel/ioctl32.c linux/arch/sparc64/kernel/ioctl32.c
--- v2.4.14/linux/arch/sparc64/kernel/ioctl32.c	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc64/kernel/ioctl32.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: ioctl32.c,v 1.127 2001/11/01 23:54:19 davem Exp $
+/* $Id: ioctl32.c,v 1.132 2001/11/07 05:56:19 davem Exp $
  * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
  *
  * Copyright (C) 1997-2000  Jakub Jelinek  (jakub@redhat.com)
@@ -71,6 +71,7 @@
 #include <asm/audioio.h>
 #include <linux/ethtool.h>
 #include <linux/mii.h>
+#include <linux/if_bonding.h>
 #include <asm/display7seg.h>
 #include <asm/watchdog.h>
 #include <asm/module.h>
@@ -456,6 +457,7 @@
         __kernel_caddr_t32  ifcbuf;
 };
 
+#ifdef CONFIG_NET
 static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	struct net_device *dev;
@@ -474,6 +476,7 @@
 	err = copy_to_user((struct ifreq32 *)arg, &ifr32, sizeof(struct ifreq32));
 	return (err ? -EFAULT : 0);
 }
+#endif
 
 static inline int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
@@ -564,9 +567,25 @@
 	}
 	switch (ethcmd) {
 	case ETHTOOL_GDRVINFO:	len = sizeof(struct ethtool_drvinfo); break;
+	case ETHTOOL_GMSGLVL:
+	case ETHTOOL_SMSGLVL:
+	case ETHTOOL_GLINK:
+	case ETHTOOL_NWAY_RST:	len = sizeof(struct ethtool_value); break;
+	case ETHTOOL_GREGS: {
+		struct ethtool_regs *regaddr = (struct ethtool_regs *)A(data);
+		/* darned variable size arguments */
+		if (get_user(len, (u32 *)&regaddr->len)) {
+			err = -EFAULT;
+			goto out;
+		}
+		len += sizeof(struct ethtool_regs);
+		break;
+	}
 	case ETHTOOL_GSET:
-	case ETHTOOL_SSET:
-	default:		len = sizeof(struct ethtool_cmd); break;
+	case ETHTOOL_SSET:	len = sizeof(struct ethtool_cmd); break;
+	default:
+		err = -EOPNOTSUPP;
+		goto out;
 	}
 
 	if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
@@ -592,6 +611,58 @@
 	return err;
 }
 
+static int bond_ioctl(unsigned long fd, unsigned int cmd, unsigned long arg)
+{
+	struct ifreq ifr;
+	mm_segment_t old_fs;
+	int err, len;
+	u32 data;
+	
+	if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
+		return -EFAULT;
+	ifr.ifr_data = (__kernel_caddr_t)get_free_page(GFP_KERNEL);
+	if (!ifr.ifr_data)
+		return -EAGAIN;
+
+	switch (cmd) {
+	case SIOCBONDENSLAVE:
+	case SIOCBONDRELEASE:
+	case SIOCBONDSETHWADDR:
+	case SIOCBONDCHANGEACTIVE:
+		len = IFNAMSIZ * sizeof(char);
+		break;
+	case SIOCBONDSLAVEINFOQUERY:
+		len = sizeof(struct ifslave);
+		break;
+	case SIOCBONDINFOQUERY:
+		len = sizeof(struct ifbond);
+		break;
+	default:
+		err = -EINVAL;
+		goto out;
+	};
+
+	__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
+	if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
+		err = -EFAULT;
+		goto out;
+	}
+
+	old_fs = get_fs();
+	set_fs (KERNEL_DS);
+	err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
+	set_fs (old_fs);
+	if (!err) {
+		len = copy_to_user((char *)A(data), ifr.ifr_data, len);
+		if (len)
+			err = -EFAULT;
+	}
+
+out:
+	free_page((unsigned long)ifr.ifr_data);
+	return err;
+}
+
 static inline int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	struct ifreq ifr;
@@ -4455,7 +4526,9 @@
 /* And these ioctls need translation */
 HANDLE_IOCTL(MEMREADOOB32, mtd_rw_oob)
 HANDLE_IOCTL(MEMWRITEOOB32, mtd_rw_oob)
+#ifdef CONFIG_NET
 HANDLE_IOCTL(SIOCGIFNAME, dev_ifname32)
+#endif
 HANDLE_IOCTL(SIOCGIFCONF, dev_ifconf)
 HANDLE_IOCTL(SIOCGIFFLAGS, dev_ifsioc)
 HANDLE_IOCTL(SIOCSIFFLAGS, dev_ifsioc)
@@ -4488,6 +4561,12 @@
 HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
 HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
 HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
+HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDSETHWADDR, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDSLAVEINFOQUERY, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDINFOQUERY, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDCHANGEACTIVE, bond_ioctl)
 HANDLE_IOCTL(SIOCADDRT, routing_ioctl)
 HANDLE_IOCTL(SIOCDELRT, routing_ioctl)
 /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/kernel/irq.c linux/arch/sparc64/kernel/irq.c
--- v2.4.14/linux/arch/sparc64/kernel/irq.c	Tue Jul  3 17:08:19 2001
+++ linux/arch/sparc64/kernel/irq.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: irq.c,v 1.101 2001/06/04 06:50:18 ecd Exp $
+/* $Id: irq.c,v 1.109 2001/11/12 22:22:37 davem Exp $
  * irq.c: UltraSparc IRQ handling/init/registry.
  *
  * Copyright (C) 1997  David S. Miller  (davem@caip.rutgers.edu)
@@ -14,9 +14,10 @@
 #include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
-#include <linux/random.h> /* XXX ADD add_foo_randomness() calls... -DaveM */
+#include <linux/random.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/proc_fs.h>
 
 #include <asm/ptrace.h>
 #include <asm/processor.h>
@@ -32,10 +33,7 @@
 #include <asm/hardirq.h>
 #include <asm/softirq.h>
 #include <asm/starfire.h>
-
-/* Internal flag, should not be visible elsewhere at all. */
-#define SA_IMAP_MASKED		0x100
-#define SA_DMA_SYNC		0x200
+#include <asm/uaccess.h>
 
 #ifdef CONFIG_SMP
 static void distribute_irqs(void);
@@ -64,7 +62,7 @@
 #endif
 
 #ifdef CONFIG_PCI
-/* This is a table of physical addresses used to deal with SA_DMA_SYNC.
+/* 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.
  *
@@ -89,6 +87,23 @@
 	  NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL
 };
 
+static void register_irq_proc (unsigned int irq);
+
+/*
+ * Upper 2b of irqaction->flags holds the ino.
+ * irqaction->mask holds the smp affinity information.
+ */
+#define put_ino_in_irqaction(action, irq) \
+	action->flags &= 0xffffffffffffUL; \
+	if (__bucket(irq) == &pil0_dummy_bucket) \
+		action->flags |= 0xdeadUL << 48;  \
+	else \
+		action->flags |= __irq_ino(irq) << 48;
+#define get_ino_in_irqaction(action)	(action->flags >> 48)
+
+#define put_smpaff_in_irqaction(action, smpaff)	(action)->mask = (smpaff)
+#define get_smpaff_in_irqaction(action) 	((action)->mask)
+
 int get_irq_list(char *buf)
 {
 	int i, len = 0;
@@ -108,13 +123,11 @@
 			len += sprintf(buf + len, "%10u ",
 				       kstat.irqs[cpu_logical_map(j)][i]);
 #endif
-		len += sprintf(buf + len, "%c %s",
-			       (action->flags & SA_INTERRUPT) ? '+' : ' ',
-			       action->name);
+		len += sprintf(buf + len, " %s:%lx", action->name, \
+						get_ino_in_irqaction(action));
 		for(action = action->next; action; action = action->next) {
-			len += sprintf(buf+len, ",%s %s",
-				       (action->flags & SA_INTERRUPT) ? " +" : "",
-				       action->name);
+			len += sprintf(buf+len, ", %s:%lx", action->name, \
+						get_ino_in_irqaction(action));
 		}
 		len += sprintf(buf + len, "\n");
 	}
@@ -286,23 +299,18 @@
 	if(!handler)
 	    return -EINVAL;
 
-	if (!bucket->pil)
-		irqflags &= ~SA_IMAP_MASKED;
-	else {
-		irqflags |= SA_IMAP_MASKED;
-		if (bucket->flags & IBF_PCI) {
-			/*
-			 * PCI IRQs should never use SA_INTERRUPT.
-			 */
-			irqflags &= ~(SA_INTERRUPT);
-
-			/*
-			 * Check wether we _should_ use DMA Write Sync
-			 * (for devices behind bridges behind APB). 
-			 */
-			if (bucket->flags & IBF_DMA_SYNC)
-				irqflags |= SA_DMA_SYNC;
-		}
+	if ((bucket != &pil0_dummy_bucket) && (irqflags & SA_SAMPLE_RANDOM)) {
+		/*
+	 	 * This function might sleep, we want to call it first,
+	 	 * outside of the atomic block. In SA_STATIC_ALLOC case,
+		 * random driver's kmalloc will fail, but it is safe.
+		 * If already initialized, random driver will not reinit.
+	 	 * Yes, this might clear the entropy pool if the wrong
+	 	 * driver is attempted to be loaded, without actually
+	 	 * installing a new handler, but is this really a problem,
+	 	 * only the sysadmin is able to do this.
+	 	 */
+		rand_initialize_irq(irq);
 	}
 
 	save_and_cli(flags);
@@ -316,12 +324,6 @@
 			restore_flags(flags);
 			return -EBUSY;
 		}
-		if((action->flags & SA_INTERRUPT) ^ (irqflags & SA_INTERRUPT)) {
-			printk("Attempt to mix fast and slow interrupts on IRQ%d "
-			       "denied\n", bucket->pil);
-			restore_flags(flags);
-			return -EBUSY;
-		}   
 		action = NULL;		/* Or else! */
 	}
 
@@ -344,7 +346,7 @@
 		return -ENOMEM;
 	}
 
-	if ((irqflags & SA_IMAP_MASKED) == 0) {
+	if (bucket == &pil0_dummy_bucket) {
 		bucket->irq_info = action;
 		bucket->flags |= IBF_ACTIVE;
 	} else {
@@ -405,12 +407,13 @@
 			bucket->pending = 0;
 	}
 
-	action->mask = (unsigned long) bucket;
 	action->handler = handler;
 	action->flags = irqflags;
 	action->name = name;
 	action->next = NULL;
 	action->dev_id = dev_id;
+	put_ino_in_irqaction(action, irq);
+	put_smpaff_in_irqaction(action, 0);
 
 	if(tmp)
 		tmp->next = action;
@@ -425,6 +428,8 @@
 		set_softint(1 << bucket->pil);
 	}
 	restore_flags(flags);
+	if ((bucket != &pil0_dummy_bucket) && (!(irqflags & SA_STATIC_ALLOC)))
+		register_irq_proc(__irq_ino(irq));
 
 #ifdef CONFIG_SMP
 	distribute_irqs();
@@ -492,7 +497,7 @@
 	else
 		*(bucket->pil + irq_action) = action->next;
 
-	if(action->flags & SA_IMAP_MASKED) {
+	if (bucket != &pil0_dummy_bucket) {
 		unsigned long imap = bucket->imap;
 		void **vector, *orig;
 		int ent;
@@ -716,36 +721,80 @@
 /* Tune this... */
 #define FORWARD_VOLUME		12
 
-void handler_irq(int irq, struct pt_regs *regs)
-{
-	struct ino_bucket *bp, *nbp;
-	int cpu = smp_processor_id();
 #ifdef CONFIG_SMP
-	int should_forward = (this_is_starfire == 0	&&
-			      irq < 10			&&
-			      current->pid != 0);
-	unsigned int buddy = 0;
+
+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;
+	unsigned long cpu_mask = get_smpaff_in_irqaction(ap);
+	unsigned int buddy, ticks;
+
+	if (cpu_mask == 0)
+		cpu_mask = ~0UL;
+
+	if (this_is_starfire != 0 ||
+	    bp->pil >= 10 || current->pid == 0)
+		goto out;
 
 	/* 'cpu' is the MID (ie. UPAID), calculate the MID
 	 * of our buddy.
 	 */
-	if (should_forward != 0) {
-		buddy = cpu_number_map(cpu) + 1;
+	buddy = cpu_number_map(cpu) + 1;
+	if (buddy >= NR_CPUS ||
+	    cpu_logical_map(buddy) == -1)
+		buddy = 0;
+
+	ticks = 0;
+	while ((cpu_mask & (1UL << buddy)) == 0) {
+		buddy++;
 		if (buddy >= NR_CPUS ||
-		    (buddy = cpu_logical_map(buddy)) == -1)
+		    cpu_logical_map(buddy) == -1)
 			buddy = cpu_logical_map(0);
+		if (++ticks > NR_CPUS) {
+			put_smpaff_in_irqaction(ap, 0);
+			goto out;
+		}
+	}
 
-		/* Voo-doo programming. */
-		if (cpu_data[buddy].idle_volume < FORWARD_VOLUME)
-			should_forward = 0;
+	if (buddy == cpu_number_map(cpu))
+		goto out;
+
+	buddy = cpu_logical_map(buddy);
+
+	/* Voo-doo programming. */
+	if (cpu_data[buddy].idle_volume < FORWARD_VOLUME)
+		goto out;
+
+	/* This just so happens to be correct on Cheetah
+	 * at the moment.
+	 */
+	buddy <<= 26;
+
+	/* Push it to our buddy. */
+	upa_writel(buddy | IMAP_VALID, bp->imap);
+
+out:
+	return;
+}
 
-		/* This just so happens to be correct on Cheetah
-		 * at the moment.
-		 */
-		buddy <<= 26;
-	}
 #endif
 
+void handler_irq(int irq, struct pt_regs *regs)
+{
+	struct ino_bucket *bp, *nbp;
+	int cpu = smp_processor_id();
+
 #ifndef CONFIG_SMP
 	/*
 	 * Check for TICK_INT on level 14 softint.
@@ -765,6 +814,8 @@
 		clear_softint(clr_mask);
 	}
 #else
+	int should_forward = 1;
+
 	clear_softint(1 << irq);
 #endif
 
@@ -781,6 +832,7 @@
 #endif
 	for ( ; bp != NULL; bp = nbp) {
 		unsigned char flags = bp->flags;
+		unsigned char random = 0;
 
 		nbp = __bucket(bp->irq_chain);
 		bp->irq_chain = 0;
@@ -795,34 +847,30 @@
 			if ((flags & IBF_MULTI) == 0) {
 				struct irqaction *ap = bp->irq_info;
 				ap->handler(__irq(bp), ap->dev_id, regs);
+				random |= ap->flags & SA_SAMPLE_RANDOM;
 			} else {
 				void **vector = (void **)bp->irq_info;
 				int ent;
 				for (ent = 0; ent < 4; ent++) {
 					struct irqaction *ap = vector[ent];
-					if (ap != NULL)
+					if (ap != NULL) {
 						ap->handler(__irq(bp), ap->dev_id, regs);
+						random |= ap->flags & SA_SAMPLE_RANDOM;
+					}
 				}
 			}
 			/* Only the dummy bucket lacks IMAP/ICLR. */
 			if (bp->pil != 0) {
 #ifdef CONFIG_SMP
-				/* 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.
-				 */
-				if (should_forward != 0) {
-					/* Push it to our buddy. */
+				if (should_forward) {
+					redirect_intr(cpu, bp);
 					should_forward = 0;
-					upa_writel(buddy | IMAP_VALID, bp->imap);
 				}
 #endif
 				upa_writel(ICLR_IDLE, bp->iclr);
+				/* Test and add entropy */
+				if (random)
+					add_interrupt_randomness(irq);
 			}
 		} else
 			bp->pending = 1;
@@ -843,7 +891,7 @@
 	kstat.irqs[cpu][irq]++;
 
 	*(irq_work(cpu, irq)) = 0;
-	bucket = (struct ino_bucket *)action->mask;
+	bucket = get_ino_in_irqaction(action) + ivector_table;
 
 	floppy_interrupt(irq, dev_cookie, regs);
 	upa_writel(ICLR_IDLE, bucket->iclr);
@@ -896,10 +944,6 @@
 		return -EINVAL;
 	}	
 	
-	/* Only IMAP style interrupts can be registered as fast. */
-	if(bucket->pil == 0)
-		return -EINVAL;
-
 	if(!handler)
 		return -EINVAL;
 
@@ -918,6 +962,10 @@
 		return -EBUSY;
 	}
 
+	/*
+	 * We do not check for SA_SAMPLE_RANDOM in this path. Neither do we
+	 * support smp intr affinity in this path.
+	 */
 	save_and_cli(flags);
 	if(irqflags & SA_STATIC_ALLOC) {
 		if(static_irq_count < MAX_STATIC_ALLOC)
@@ -938,12 +986,13 @@
 	bucket->irq_info = action;
 	bucket->flags |= IBF_ACTIVE;
 
-	action->mask = (unsigned long) bucket;
 	action->handler = handler;
-	action->flags = irqflags | SA_IMAP_MASKED;
+	action->flags = irqflags;
 	action->dev_id = NULL;
 	action->name = name;
 	action->next = NULL;
+	put_ino_in_irqaction(action, irq);
+	put_smpaff_in_irqaction(action, 0);
 
 	*(bucket->pil + irq_action) = action;
 	enable_irq(irq);
@@ -993,7 +1042,7 @@
 #endif
 
 	/* Register IRQ handler. */
-	err = request_irq(build_irq(0, 0, 0UL, 0UL), cfunc, (SA_INTERRUPT | SA_STATIC_ALLOC),
+	err = request_irq(build_irq(0, 0, 0UL, 0UL), cfunc, SA_STATIC_ALLOC,
 			  "timer", NULL);
 
 	if(err) {
@@ -1079,14 +1128,10 @@
 #ifdef CONFIG_SMP
 static int retarget_one_irq(struct irqaction *p, int goal_cpu)
 {
-	struct ino_bucket *bucket = __bucket(p->mask);
+	struct ino_bucket *bucket = get_ino_in_irqaction(p) + ivector_table;
 	unsigned long imap = bucket->imap;
 	unsigned int tid;
 
-	/* Never change this, it causes problems on Ex000 systems. */
-	if (bucket->pil == 12)
-		return goal_cpu;
-
 	if (tlb_type == cheetah) {
 		tid = __cpu_logical_map[goal_cpu] << 26;
 		tid &= IMAP_AID_SAFARI;
@@ -1114,11 +1159,16 @@
 
 	save_and_cli(flags);
 	cpu = 0;
-	for(level = 0; level < NR_IRQS; level++) {
+
+	/*
+	 * Skip the timer at [0], and very rare error/power intrs at [15].
+	 * Also level [12], it causes problems on Ex000 systems.
+	 */
+	for(level = 1; level < NR_IRQS; level++) {
 		struct irqaction *p = irq_action[level];
+		if (level == 12) continue;
 		while(p) {
-			if(p->flags & SA_IMAP_MASKED)
-				cpu = retarget_one_irq(p, cpu);
+			cpu = retarget_one_irq(p, cpu);
 			p = p->next;
 		}
 	}
@@ -1228,7 +1278,173 @@
 			     : "g1");
 }
 
-void init_irq_proc(void)
+static struct proc_dir_entry * root_irq_dir;
+static struct proc_dir_entry * irq_dir [NUM_IVECS];
+
+#ifdef CONFIG_SMP
+
+#define HEX_DIGITS 16
+
+static unsigned int parse_hex_value (const char *buffer,
+		unsigned long count, unsigned long *ret)
 {
-	/* For now, nothing... */
+	unsigned char hexnum [HEX_DIGITS];
+	unsigned long value;
+	int i;
+
+	if (!count)
+		return -EINVAL;
+	if (count > HEX_DIGITS)
+		count = HEX_DIGITS;
+	if (copy_from_user(hexnum, buffer, count))
+		return -EFAULT;
+
+	/*
+	 * Parse the first 8 characters as a hex string, any non-hex char
+	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+	 */
+	value = 0;
+
+	for (i = 0; i < count; i++) {
+		unsigned int c = hexnum[i];
+
+		switch (c) {
+			case '0' ... '9': c -= '0'; break;
+			case 'a' ... 'f': c -= 'a'-10; break;
+			case 'A' ... 'F': c -= 'A'-10; break;
+		default:
+			goto out;
+		}
+		value = (value << 4) | c;
+	}
+out:
+	*ret = value;
+	return 0;
 }
+
+static unsigned long hw_to_logical(unsigned long mask)
+{
+	unsigned long new_mask = 0UL;
+	int i;
+
+	for (i = 0; i < NR_CPUS; i++) {
+		if (mask & (1UL << i)) {
+			int logical = cpu_number_map(i);
+
+			new_mask |= (1UL << logical);
+		}
+	}
+
+	return new_mask;
+}
+
+static unsigned long logical_to_hw(unsigned long mask)
+{
+	unsigned long new_mask = 0UL;
+	int i;
+
+	for (i = 0; i < NR_CPUS; i++) {
+		if (mask & (1UL << i)) {
+			int hw = cpu_logical_map(i);
+
+			new_mask |= (1UL << hw);
+		}
+	}
+
+	return new_mask;
+}
+
+static int irq_affinity_read_proc (char *page, char **start, off_t off,
+			int count, int *eof, void *data)
+{
+	struct ino_bucket *bp = ivector_table + (long)data;
+	struct irqaction *ap = bp->irq_info;
+	unsigned long mask = get_smpaff_in_irqaction(ap);
+
+	mask = logical_to_hw(mask);
+
+	if (count < HEX_DIGITS+1)
+		return -EINVAL;
+	return sprintf (page, "%016lx\n", mask == 0 ? ~0UL : mask);
+}
+
+static inline void set_intr_affinity(int irq, unsigned long hw_aff)
+{
+	struct ino_bucket *bp = ivector_table + irq;
+	unsigned long aff = hw_to_logical(hw_aff);
+
+	/*
+	 * Users specify affinity in terms of cpu ids, which is what
+	 * is displayed via /proc/cpuinfo. As soon as we do this, 
+	 * handler_irq() might see and take action.
+	 */
+	put_smpaff_in_irqaction((struct irqaction *)bp->irq_info, aff);
+
+	/* Migration is simply done by the next cpu to service this
+	 * interrupt.
+	 */
+}
+
+static int irq_affinity_write_proc (struct file *file, const char *buffer,
+					unsigned long count, void *data)
+{
+	int irq = (long) data, full_count = count, err;
+	unsigned long new_value;
+
+	err = parse_hex_value(buffer, count, &new_value);
+
+	/*
+	 * Do not allow disabling IRQs completely - it's a too easy
+	 * way to make the system unusable accidentally :-) At least
+	 * one online CPU still has to be targeted.
+	 */
+	new_value &= cpu_online_map;
+	if (!new_value)
+		return -EINVAL;
+
+	set_intr_affinity(irq, new_value);
+
+	return full_count;
+}
+
+#endif
+
+#define MAX_NAMELEN 10
+
+static void register_irq_proc (unsigned int irq)
+{
+	char name [MAX_NAMELEN];
+
+	if (!root_irq_dir || irq_dir[irq])
+		return;
+
+	memset(name, 0, MAX_NAMELEN);
+	sprintf(name, "%x", irq);
+
+	/* create /proc/irq/1234 */
+	irq_dir[irq] = proc_mkdir(name, root_irq_dir);
+
+#ifdef CONFIG_SMP
+	/* XXX SMP affinity not supported on starfire yet. */
+	if (this_is_starfire == 0) {
+		struct proc_dir_entry *entry;
+
+		/* create /proc/irq/1234/smp_affinity */
+		entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
+
+		if (entry) {
+			entry->nlink = 1;
+			entry->data = (void *)(long)irq;
+			entry->read_proc = irq_affinity_read_proc;
+			entry->write_proc = irq_affinity_write_proc;
+		}
+	}
+#endif
+}
+
+void init_irq_proc (void)
+{
+	/* create /proc/irq */
+	root_irq_dir = proc_mkdir("irq", 0);
+}
+
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/kernel/isa.c linux/arch/sparc64/kernel/isa.c
--- v2.4.14/linux/arch/sparc64/kernel/isa.c	Wed May 16 10:31:27 2001
+++ linux/arch/sparc64/kernel/isa.c	Tue Nov 13 09:16:05 2001
@@ -74,7 +74,7 @@
 	irq_prop = prom_getintdefault(isa_dev->prom_node,
 				      "interrupts", -1);
 	if (irq_prop <= 0) {
-		isa_dev->irq = 0;
+		isa_dev->irq = PCI_IRQ_NONE;
 	} else {
 		int i;
 
@@ -85,7 +85,7 @@
 				int ino = grover_irq_table[i].pci_ino;
 
 				if (ino == 0) {
-					isa_dev->irq = 0;
+					isa_dev->irq = PCI_IRQ_NONE;
 				} else {
 					pbm = isa_dev->bus->parent;
 					pcic = pbm->parent;
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/kernel/setup.c linux/arch/sparc64/kernel/setup.c
--- v2.4.14/linux/arch/sparc64/kernel/setup.c	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc64/kernel/setup.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/*  $Id: setup.c,v 1.70 2001/10/25 18:48:03 davem Exp $
+/*  $Id: setup.c,v 1.71 2001/11/13 00:49:28 davem Exp $
  *  linux/arch/sparc64/kernel/setup.c
  *
  *  Copyright (C) 1995,1996  David S. Miller (davem@caip.rutgers.edu)
@@ -20,6 +20,7 @@
 #include <linux/delay.h>
 #include <linux/config.h>
 #include <linux/fs.h>
+#include <linux/seq_file.h>
 #include <linux/kdev_t.h>
 #include <linux/major.h>
 #include <linux/string.h>
@@ -606,54 +607,77 @@
 extern char *sparc_cpu_type[];
 extern char *sparc_fpu_type[];
 
-extern int smp_info(char *);
-extern int smp_bogo(char *);
-extern int mmu_info(char *);
+extern void smp_info(struct seq_file *);
+extern void smp_bogo(struct seq_file *);
+extern void mmu_info(struct seq_file *);
 
 #ifndef CONFIG_SMP
 unsigned long up_clock_tick;
 #endif
 
-int get_cpuinfo(char *buffer)
+static int show_cpuinfo(struct seq_file *m, void *__unused)
 {
-	int cpuid=smp_processor_id();
-	int len;
+	int cpuid = smp_processor_id();
 
-	len = sprintf(buffer, 
-	    "cpu\t\t: %s\n"
-            "fpu\t\t: %s\n"
-            "promlib\t\t: Version 3 Revision %d\n"
-            "prom\t\t: %d.%d.%d\n"
-            "type\t\t: sun4u\n"
-	    "ncpus probed\t: %d\n"
-	    "ncpus active\t: %d\n"
+	seq_printf(m, 
+		   "cpu\t\t: %s\n"
+		   "fpu\t\t: %s\n"
+		   "promlib\t\t: Version 3 Revision %d\n"
+		   "prom\t\t: %d.%d.%d\n"
+		   "type\t\t: sun4u\n"
+		   "ncpus probed\t: %d\n"
+		   "ncpus active\t: %d\n"
 #ifndef CONFIG_SMP
-            "Cpu0Bogo\t: %lu.%02lu\n"
-	    "Cpu0ClkTck\t: %016lx\n"
+		   "Cpu0Bogo\t: %lu.%02lu\n"
+		   "Cpu0ClkTck\t: %016lx\n"
 #endif
-	    ,
-            sparc_cpu_type[cpuid],
-            sparc_fpu_type[cpuid],
-            prom_rev, prom_prev >> 16, (prom_prev >> 8) & 0xff, prom_prev & 0xff,
-	    linux_num_cpus, smp_num_cpus
+		   ,
+		   sparc_cpu_type[cpuid],
+		   sparc_fpu_type[cpuid],
+		   prom_rev,
+		   prom_prev >> 16,
+		   (prom_prev >> 8) & 0xff,
+		   prom_prev & 0xff,
+		   linux_num_cpus,
+		   smp_num_cpus
 #ifndef CONFIG_SMP
-	    , loops_per_jiffy/(500000/HZ), (loops_per_jiffy/(5000/HZ)) % 100,
-	    up_clock_tick
+		   , loops_per_jiffy/(500000/HZ),
+		   (loops_per_jiffy/(5000/HZ)) % 100,
+		   up_clock_tick
 #endif
-	    );
+		);
 #ifdef CONFIG_SMP
-	len += smp_bogo(buffer + len);
+	smp_bogo(m);
 #endif
-	len += mmu_info(buffer + len);
+	mmu_info(m);
 #ifdef CONFIG_SMP
-	len += smp_info(buffer + len);
+	smp_info(m);
 #endif
-#undef ZS_LOG
-#ifdef ZS_LOG
-	{
-		extern int zs_dumplog(char *);
-		len += zs_dumplog(buffer + len);
-	}
-#endif
-	return len;
+	return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	/* The pointer we are returning is arbitrary,
+	 * it just has to be non-NULL and not IS_ERR
+	 * in the success case.
+	 */
+	return *pos == 0 ? &c_start : NULL;
 }
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/kernel/smp.c linux/arch/sparc64/kernel/smp.c
--- v2.4.14/linux/arch/sparc64/kernel/smp.c	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc64/kernel/smp.c	Tue Nov 13 09:16:05 2001
@@ -15,6 +15,8 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/head.h>
 #include <asm/ptrace.h>
@@ -68,31 +70,30 @@
 
 __setup("maxcpus=", maxcpus);
 
-int smp_info(char *buf)
+void smp_info(struct seq_file *m)
 {
-	int len = 7, i;
+	int i;
 	
-	strcpy(buf, "State:\n");
-	for (i = 0; i < NR_CPUS; i++)
+	seq_printf(m, "State:\n");
+	for (i = 0; i < NR_CPUS; i++) {
 		if (cpu_present_map & (1UL << i))
-			len += sprintf(buf + len,
-					"CPU%d:\t\tonline\n", i);
-	return len;
+			seq_printf(m,
+				   "CPU%d:\t\tonline\n", i);
+	}
 }
 
-int smp_bogo(char *buf)
+void smp_bogo(struct seq_file *m)
 {
-	int len = 0, i;
+	int i;
 	
 	for (i = 0; i < NR_CPUS; i++)
 		if (cpu_present_map & (1UL << i))
-			len += sprintf(buf + len,
-				       "Cpu%dBogo\t: %lu.%02lu\n"
-				       "Cpu%dClkTck\t: %016lx\n",
-				       i, cpu_data[i].udelay_val / (500000/HZ),
-				       (cpu_data[i].udelay_val / (5000/HZ)) % 100,
-				       i, cpu_data[i].clock_tick);
-	return len;
+			seq_printf(m,
+				   "Cpu%dBogo\t: %lu.%02lu\n"
+				   "Cpu%dClkTck\t: %016lx\n",
+				   i, cpu_data[i].udelay_val / (500000/HZ),
+				   (cpu_data[i].udelay_val / (5000/HZ)) % 100,
+				   i, cpu_data[i].clock_tick);
 }
 
 void __init smp_store_cpu_info(int id)
@@ -559,19 +560,30 @@
 
 	smp_cross_call(&xcall_call_function,
 		       0, (u64) &data, 0);
-	if (wait) {
-		while (atomic_read(&data.finished) != cpus)
-			barrier();
-	}
+	/* 
+	 * Wait for other cpus to complete function or at
+	 * least snap the call data.
+	 */
+	while (atomic_read(&data.finished) != cpus)
+		barrier();
 
 	return 0;
 }
 
 void smp_call_function_client(struct call_data_struct *call_data)
 {
-	call_data->func(call_data->info);
-	if (call_data->wait)
+	void (*func) (void *info) = call_data->func;
+	void *info = call_data->info;
+
+	if (call_data->wait) {
+		/* let initiator proceed only after completion */
+		func(info);
 		atomic_inc(&call_data->finished);
+	} else {
+		/* let initiator proceed after getting data */
+		atomic_inc(&call_data->finished);
+		func(info);
+	}
 }
 
 extern unsigned long xcall_flush_tlb_page;
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/mm/init.c linux/arch/sparc64/mm/init.c
--- v2.4.14/linux/arch/sparc64/mm/init.c	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc64/mm/init.c	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/*  $Id: init.c,v 1.199 2001/10/25 18:48:03 davem Exp $
+/*  $Id: init.c,v 1.202 2001/11/13 00:49:28 davem Exp $
  *  arch/sparc64/mm/init.c
  *
  *  Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
@@ -16,6 +16,9 @@
 #include <linux/blk.h>
 #include <linux/swap.h>
 #include <linux/swapctl.h>
+#include <linux/pagemap.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/head.h>
 #include <asm/system.h>
@@ -249,27 +252,23 @@
 	show_buffers();
 }
 
-int mmu_info(char *buf)
+void mmu_info(struct seq_file *m)
 {
-	int len;
-
 	if (tlb_type == cheetah)
-		len = sprintf(buf, "MMU Type\t: Cheetah\n");
+		seq_printf(m, "MMU Type\t: Cheetah\n");
 	else if (tlb_type == spitfire)
-		len = sprintf(buf, "MMU Type\t: Spitfire\n");
+		seq_printf(m, "MMU Type\t: Spitfire\n");
 	else
-		len = sprintf(buf, "MMU Type\t: ???\n");
+		seq_printf(m, "MMU Type\t: ???\n");
 
 #ifdef DCFLUSH_DEBUG
-	len += sprintf(buf + len, "DCPageFlushes\t: %d\n",
-		       atomic_read(&dcpage_flushes));
+	seq_printf(m, "DCPageFlushes\t: %d\n",
+		   atomic_read(&dcpage_flushes));
 #ifdef CONFIG_SMP
-	len += sprintf(buf + len, "DCPageFlushesXC\t: %d\n",
-		       atomic_read(&dcpage_flushes_xcall));
+	seq_printf(m, "DCPageFlushesXC\t: %d\n",
+		   atomic_read(&dcpage_flushes_xcall));
 #endif /* CONFIG_SMP */
 #endif /* DCFLUSH_DEBUG */
-
-	return len;
 }
 
 struct linux_prom_translation {
@@ -1400,7 +1399,7 @@
 	if (second_alias_page)
 		spitfire_flush_dtlb_nucleus_page(second_alias_page);
 
-	flush_tlb_all();
+	__flush_tlb_all();
 
 	{
 		unsigned long zones_size[MAX_NR_ZONES];
diff -u --recursive --new-file v2.4.14/linux/arch/sparc64/mm/ultra.S linux/arch/sparc64/mm/ultra.S
--- v2.4.14/linux/arch/sparc64/mm/ultra.S	Mon Nov  5 15:55:27 2001
+++ linux/arch/sparc64/mm/ultra.S	Tue Nov 13 09:16:05 2001
@@ -1,4 +1,4 @@
-/* $Id: ultra.S,v 1.67 2001/10/23 14:28:20 davem Exp $
+/* $Id: ultra.S,v 1.68 2001/11/09 14:59:19 davem Exp $
  * ultra.S: Don't expand these all over the place...
  *
  * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com)
@@ -316,9 +316,9 @@
 	sethi		%hi(PAGE_SIZE), %o4
 1:	subcc		%o4, (1 << 5), %o4
 	stxa		%g0, [%o0 + %o4] ASI_DCACHE_INVALIDATE
-	membar		#Sync
 	bne,pt		%icc, 1b
 	 nop
+	membar		#Sync
 	/* I-cache flush never needed on Cheetah, see callers. */
 	retl
 	 nop
@@ -509,9 +509,9 @@
 	sethi		%hi(PAGE_SIZE), %g3
 1:	subcc		%g3, (1 << 5), %g3
 	stxa		%g0, [%g1 + %g3] ASI_DCACHE_INVALIDATE
-	membar		#Sync
 	bne,pt		%icc, 1b
 	 nop
+	membar		#Sync
 	retry
 	nop
 
diff -u --recursive --new-file v2.4.14/linux/drivers/Makefile linux/drivers/Makefile
--- v2.4.14/linux/drivers/Makefile	Tue Oct 23 22:48:50 2001
+++ linux/drivers/Makefile	Sun Nov 11 10:09:32 2001
@@ -10,7 +10,7 @@
 		message/i2o message/fusion scsi md ieee1394 pnp isdn atm \
 		fc4 net/hamradio i2c acpi bluetooth
 
-subdir-y :=	parport char block net sound misc media cdrom
+subdir-y :=	parport char block net sound misc media cdrom hotplug
 subdir-m :=	$(subdir-y)
 
 
@@ -48,4 +48,3 @@
 subdir-$(CONFIG_BLUEZ)		+= bluetooth
 
 include $(TOPDIR)/Rules.make
-
diff -u --recursive --new-file v2.4.14/linux/drivers/acpi/os.c linux/drivers/acpi/os.c
--- v2.4.14/linux/drivers/acpi/os.c	Mon Nov  5 15:55:28 2001
+++ linux/drivers/acpi/os.c	Fri Nov  9 13:39:25 2001
@@ -189,11 +189,6 @@
 		return AE_ERROR;
 	}
 
-	if ((unsigned long) phys < virt_to_phys(high_memory)) {
-		*virt = phys_to_virt((unsigned long) phys);
-		return AE_OK;
-	}
-
 	*virt = ioremap((unsigned long) phys, size);
 	if (!*virt)
 		return AE_ERROR;
@@ -204,8 +199,7 @@
 void
 acpi_os_unmap_memory(void *virt, u32 size)
 {
-	if (virt >= high_memory)
-		iounmap(virt);
+	iounmap(virt);
 }
 
 acpi_status
diff -u --recursive --new-file v2.4.14/linux/drivers/acpi/ospm/processor/pr_osl.c linux/drivers/acpi/ospm/processor/pr_osl.c
--- v2.4.14/linux/drivers/acpi/ospm/processor/pr_osl.c	Mon Nov  5 15:55:28 2001
+++ linux/drivers/acpi/ospm/processor/pr_osl.c	Fri Nov  9 13:58:02 2001
@@ -143,7 +143,7 @@
 	PR_CONTEXT		*processor)
 {
 	u32			i = 0;
-	struct proc_dir_entry	*proc_entry = NULL;
+	struct proc_dir_entry	*proc_entry = NULL, *proc;
 	char			processor_uid[16];
 
 	if (!processor) {
@@ -165,15 +165,18 @@
 	sprintf(processor_uid, "%d", processor->uid);
 
 	proc_entry = proc_mkdir(processor_uid, pr_proc_root);
-	if (!proc_entry) {
+	if (!proc_entry)
 		return(AE_ERROR);
-	}
 
-	create_proc_read_entry(PR_PROC_STATUS, S_IFREG | S_IRUGO,
-		proc_entry, pr_osl_proc_read_status, (void*)processor);
+	proc = create_proc_read_entry(PR_PROC_STATUS, S_IFREG | S_IRUGO, 
+				      proc_entry, pr_osl_proc_read_status, (void*)processor);
+	if (!proc_entry)
+		return(AE_ERROR);
 
-	create_proc_read_entry(PR_PROC_INFO, S_IFREG | S_IRUGO,
-		proc_entry, pr_osl_proc_read_info, (void*)processor);
+	proc = create_proc_read_entry(PR_PROC_INFO, S_IFREG | S_IRUGO, 
+				      proc_entry, pr_osl_proc_read_info, (void*)processor);
+	if (!proc_entry)
+		return(AE_ERROR);
 
 	return(AE_OK);
 }
diff -u --recursive --new-file v2.4.14/linux/drivers/atm/Config.in linux/drivers/atm/Config.in
--- v2.4.14/linux/drivers/atm/Config.in	Mon Nov  5 15:55:28 2001
+++ linux/drivers/atm/Config.in	Tue Nov 13 09:19:41 2001
@@ -40,6 +40,12 @@
       bool '  Use suni PHY driver (155Mbps)' CONFIG_ATM_NICSTAR_USE_SUNI
       bool '  Use IDT77015 PHY driver (25Mbps)' CONFIG_ATM_NICSTAR_USE_IDT77105
    fi
+   tristate 'IDT 77252 (NICStAR II)' CONFIG_ATM_IDT77252
+   if [ "$CONFIG_ATM_IDT77252" != "n" ]; then
+      bool '  Enable debugging messages' CONFIG_ATM_IDT77252_DEBUG
+      bool '  Receive ALL cells in raw queue' CONFIG_ATM_IDT77252_RCV_ALL
+      define_bool CONFIG_ATM_IDT77252_USE_SUNI y
+   fi
    tristate 'Madge Ambassador (Collage PCI 155 Server)' CONFIG_ATM_AMBASSADOR
    if [ "$CONFIG_ATM_AMBASSADOR" != "n" ]; then
       bool '  Enable debugging messages' CONFIG_ATM_AMBASSADOR_DEBUG
diff -u --recursive --new-file v2.4.14/linux/drivers/atm/Makefile linux/drivers/atm/Makefile
--- v2.4.14/linux/drivers/atm/Makefile	Mon Nov  5 15:55:28 2001
+++ linux/drivers/atm/Makefile	Wed Nov  7 14:39:36 2001
@@ -12,6 +12,7 @@
 obj-$(CONFIG_ATM_ENI) += eni.o suni.o
 obj-$(CONFIG_ATM_ZATM) += zatm.o uPD98402.o
 obj-$(CONFIG_ATM_NICSTAR) += nicstar.o
+obj-$(CONFIG_ATM_IDT77252) += idt77252.o
 
 ifeq ($(CONFIG_ATM_NICSTAR_USE_SUNI),y)
   obj-$(CONFIG_ATM_NICSTAR) += suni.o
@@ -19,6 +20,10 @@
 
 ifeq ($(CONFIG_ATM_NICSTAR_USE_IDT77105),y)
   obj-$(CONFIG_ATM_NICSTAR) += idt77105.o
+endif
+
+ifeq ($(CONFIG_ATM_IDT77252_USE_SUNI),y)
+  obj-$(CONFIG_ATM_IDT77252) += suni.o
 endif
 
 obj-$(CONFIG_ATM_HORIZON) += horizon.o
diff -u --recursive --new-file v2.4.14/linux/drivers/atm/eni.c linux/drivers/atm/eni.c
--- v2.4.14/linux/drivers/atm/eni.c	Sun Sep 23 11:40:57 2001
+++ linux/drivers/atm/eni.c	Fri Nov  9 13:41:42 2001
@@ -2266,7 +2266,7 @@
 	}
 	dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL);
 	if (!dev) goto out2;
-	pci_dev->driver_data = dev;
+	pci_set_drvdata(pci_dev, dev);
 	eni_dev->pci_dev = pci_dev;
 	ENI_DEV(dev) = eni_dev;
 	eni_dev->asic = ent->driver_data;
diff -u --recursive --new-file v2.4.14/linux/drivers/atm/firestream.c linux/drivers/atm/firestream.c
--- v2.4.14/linux/drivers/atm/firestream.c	Sun Sep 23 11:40:57 2001
+++ linux/drivers/atm/firestream.c	Fri Nov  9 13:58:03 2001
@@ -912,6 +912,9 @@
 		if (IS_FS50(dev)) {
 			/* Increment the channel numer: take a free one next time.  */
 			for (to=33;to;to--, dev->channo++) {
+				/* We only have 32 channels */
+				if (dev->channo >= 32)
+					dev->channo = 0;
 				/* If we need to do RX, AND the RX is inuse, try the next */
 				if (DO_DIRECTION(rxtp) && dev->atm_vccs[dev->channo])
 					continue;
@@ -1226,7 +1229,7 @@
 {
 	func_enter ();
 	func_exit ();
-	return 0;
+	return -ENOIOCTLCMD;
 }
 
 
diff -u --recursive --new-file v2.4.14/linux/drivers/atm/idt77252.c linux/drivers/atm/idt77252.c
--- v2.4.14/linux/drivers/atm/idt77252.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/atm/idt77252.c	Tue Nov 13 09:19:41 2001
@@ -0,0 +1,3906 @@
+/******************************************************************* 
+ * ident "$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $"
+ *
+ * $Author: ecd $
+ * $Date: 2001/11/11 08:13:54 $
+ *
+ * Copyright (c) 2000 ATecoM GmbH 
+ *
+ * The author may be reached at ecd@atecom.com.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ * THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR   IMPLIED
+ * WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ * NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT,  INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ * USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *******************************************************************/
+static char const rcsid[] =
+"$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $";
+
+
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/pci.h>
+#include <linux/skbuff.h>
+#include <linux/kernel.h>
+#include <linux/vmalloc.h>
+#include <linux/netdevice.h>
+#include <linux/atmdev.h>
+#include <linux/atm.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/bitops.h>
+#include <linux/wait.h>
+#include <asm/semaphore.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/atomic.h>
+#include <asm/byteorder.h>
+
+#ifdef CONFIG_ATM_IDT77252_USE_SUNI
+#include "suni.h"
+#endif /* CONFIG_ATM_IDT77252_USE_SUNI */
+
+
+#include "idt77252.h"
+#include "idt77252_tables.h"
+
+static unsigned int vpibits = 1;
+
+
+#define CONFIG_ATM_IDT77252_SEND_IDLE 1
+
+
+/*
+ * Debug HACKs.
+ */
+#define DEBUG_MODULE 1
+#undef HAVE_EEPROM	/* does not work, yet. */
+
+#ifdef CONFIG_ATM_IDT77252_DEBUG
+static unsigned long debug = DBG_GENERAL;
+#endif
+
+
+#define SAR_RX_DELAY	(SAR_CFG_RXINT_NODELAY)
+
+
+/*
+ * SCQ Handling.
+ */
+static struct scq_info *alloc_scq(struct idt77252_dev *, int);
+static void free_scq(struct idt77252_dev *, struct scq_info *);
+static int queue_skb(struct idt77252_dev *, struct vc_map *,
+		     struct sk_buff *, int oam);
+static void drain_scq(struct idt77252_dev *, struct vc_map *);
+static unsigned long get_free_scd(struct idt77252_dev *, struct vc_map *);
+static void fill_scd(struct idt77252_dev *, struct scq_info *, int);
+
+/*
+ * FBQ Handling.
+ */
+static int push_rx_skb(struct idt77252_dev *,
+		       struct sk_buff *, int queue);
+static void recycle_rx_skb(struct idt77252_dev *, struct sk_buff *);
+static void flush_rx_pool(struct idt77252_dev *, struct rx_pool *);
+static void recycle_rx_pool_skb(struct idt77252_dev *,
+				struct rx_pool *);
+static void add_rx_skb(struct idt77252_dev *, int queue,
+		       unsigned int size, unsigned int count);
+
+/*
+ * RSQ Handling.
+ */
+static int init_rsq(struct idt77252_dev *);
+static void deinit_rsq(struct idt77252_dev *);
+static void idt77252_rx(struct idt77252_dev *);
+
+/*
+ * TSQ handling.
+ */
+static int init_tsq(struct idt77252_dev *);
+static void deinit_tsq(struct idt77252_dev *);
+static void idt77252_tx(struct idt77252_dev *);
+
+
+/*
+ * ATM Interface.
+ */
+static void idt77252_dev_close(struct atm_dev *dev);
+static int idt77252_open(struct atm_vcc *vcc, short vpi, int vci);
+static void idt77252_close(struct atm_vcc *vcc);
+static int idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb);
+static int idt77252_send_oam(struct atm_vcc *vcc, void *cell,
+			     int flags);
+static void idt77252_phy_put(struct atm_dev *dev, unsigned char value,
+			     unsigned long addr);
+static unsigned char idt77252_phy_get(struct atm_dev *dev, unsigned long addr);
+static int idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos,
+			       int flags);
+static int idt77252_proc_read(struct atm_dev *dev, loff_t * pos,
+			      char *page);
+static void idt77252_interrupt(int irq, void *dev_id,
+			       struct pt_regs *regs);
+static void idt77252_softint(void *dev_id);
+
+
+static struct atmdev_ops idt77252_ops =
+{
+	dev_close:	idt77252_dev_close,
+	open:		idt77252_open,
+	close:		idt77252_close,
+	send:		idt77252_send,
+	send_oam:	idt77252_send_oam,
+	phy_put:	idt77252_phy_put,
+	phy_get:	idt77252_phy_get,
+	change_qos:	idt77252_change_qos,
+	proc_read:	idt77252_proc_read
+};
+
+static struct idt77252_dev *idt77252_chain = NULL;
+static unsigned int idt77252_sram_write_errors = 0;
+
+/*****************************************************************************/
+/*                                                                           */
+/* I/O and Utility Bus                                                       */
+/*                                                                           */
+/*****************************************************************************/
+
+static void
+waitfor_idle(struct idt77252_dev *card)
+{
+	u32 stat;
+
+	stat = readl(SAR_REG_STAT);
+	while (stat & SAR_STAT_CMDBZ)
+		stat = readl(SAR_REG_STAT);
+}
+
+static u32
+read_sram(struct idt77252_dev *card, unsigned long addr)
+{
+	unsigned long flags;
+	u32 value;
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	writel(SAR_CMD_READ_SRAM | (addr << 2), SAR_REG_CMD);
+	waitfor_idle(card);
+	value = readl(SAR_REG_DR0);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+	return value;
+}
+
+static void
+write_sram(struct idt77252_dev *card, unsigned long addr, u32 value)
+{
+	unsigned long flags;
+
+	if ((idt77252_sram_write_errors == 0) &&
+	    (((addr > card->tst[0] + card->tst_size - 2) &&
+	      (addr < card->tst[0] + card->tst_size)) ||
+	     ((addr > card->tst[1] + card->tst_size - 2) &&
+	      (addr < card->tst[1] + card->tst_size)))) {
+		printk("%s: ERROR: TST JMP section at %08lx written: %08x\n",
+		       card->name, addr, value);
+	}
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	writel(value, SAR_REG_DR0);
+	writel(SAR_CMD_WRITE_SRAM | (addr << 2), SAR_REG_CMD);
+	waitfor_idle(card);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+}
+
+static u8
+read_utility(void *dev, unsigned long ubus_addr)
+{
+	struct idt77252_dev *card = dev;
+	unsigned long flags;
+	u8 value;
+
+	if (!card) {
+		printk("Error: No such device.\n");
+		return -1;
+	}
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	writel(SAR_CMD_READ_UTILITY + ubus_addr, SAR_REG_CMD);
+	waitfor_idle(card);
+	value = readl(SAR_REG_DR0);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+	return value;
+}
+
+static void
+write_utility(void *dev, unsigned long ubus_addr, u8 value)
+{
+	struct idt77252_dev *card = dev;
+	unsigned long flags;
+
+	if (!card) {
+		printk("Error: No such device.\n");
+		return;
+	}
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	writel((u32) value, SAR_REG_DR0);
+	writel(SAR_CMD_WRITE_UTILITY + ubus_addr, SAR_REG_CMD);
+	waitfor_idle(card);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+}
+
+#ifdef HAVE_EEPROM
+static u32 rdsrtab[] =
+{
+	SAR_GP_EECS | SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO,	/* 1 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO	/* 1 */
+};
+
+static u32 wrentab[] =
+{
+	SAR_GP_EECS | SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO,	/* 1 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO,	/* 1 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK			/* 0 */
+};
+
+static u32 rdtab[] =
+{
+	SAR_GP_EECS | SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO,	/* 1 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO	/* 1 */
+};
+
+static u32 wrtab[] =
+{
+	SAR_GP_EECS | SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	0,
+	SAR_GP_EESCLK,			/* 0 */
+	SAR_GP_EEDO,
+	SAR_GP_EESCLK | SAR_GP_EEDO,	/* 1 */
+	0,
+	SAR_GP_EESCLK			/* 0 */
+};
+
+static u32 clktab[] =
+{
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0,
+	SAR_GP_EESCLK,
+	0
+};
+
+static u32
+idt77252_read_gp(struct idt77252_dev *card)
+{
+	u32 gp;
+
+	gp = readl(SAR_REG_GP);
+#if 0
+	printk("RD: %s\n", gp & SAR_GP_EEDI ? "1" : "0");
+#endif
+	return gp;
+}
+
+static void
+idt77252_write_gp(struct idt77252_dev *card, u32 value)
+{
+	unsigned long flags;
+
+#if 0
+	printk("WR: %s %s %s\n", value & SAR_GP_EECS ? "   " : "/CS",
+	       value & SAR_GP_EESCLK ? "HIGH" : "LOW ",
+	       value & SAR_GP_EEDO   ? "1" : "0");
+#endif
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	waitfor_idle(card);
+	writel(value, SAR_REG_GP);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+}
+
+static u8
+idt77252_eeprom_read_status(struct idt77252_dev *card)
+{
+	u8 byte;
+	u32 gp;
+	int i, j;
+
+	gp = idt77252_read_gp(card) & ~(SAR_GP_EESCLK|SAR_GP_EECS|SAR_GP_EEDO);
+
+	for (i = 0; i < sizeof(rdsrtab)/sizeof(rdsrtab[0]); i++) {
+		idt77252_write_gp(card, gp | rdsrtab[i]);
+		udelay(5);
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	byte = 0;
+	for (i = 0, j = 0; i < 8; i++) {
+		byte <<= 1;
+
+		idt77252_write_gp(card, gp | clktab[j++]);
+		udelay(5);
+
+		byte |= idt77252_read_gp(card) & SAR_GP_EEDI ? 1 : 0;
+
+		idt77252_write_gp(card, gp | clktab[j++]);
+		udelay(5);
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	return byte;
+}
+
+static u8
+idt77252_eeprom_read_byte(struct idt77252_dev *card, u8 offset)
+{
+	u8 byte;
+	u32 gp;
+	int i, j;
+
+	gp = idt77252_read_gp(card) & ~(SAR_GP_EESCLK|SAR_GP_EECS|SAR_GP_EEDO);
+
+	for (i = 0; i < sizeof(rdtab)/sizeof(rdtab[0]); i++) {
+		idt77252_write_gp(card, gp | rdtab[i]);
+		udelay(5);
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	for (i = 0, j = 0; i < 8; i++) {
+		idt77252_write_gp(card, gp | clktab[j++] |
+					(offset & 1 ? SAR_GP_EEDO : 0));
+		udelay(5);
+
+		idt77252_write_gp(card, gp | clktab[j++] |
+					(offset & 1 ? SAR_GP_EEDO : 0));
+		udelay(5);
+
+		offset >>= 1;
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	byte = 0;
+	for (i = 0, j = 0; i < 8; i++) {
+		byte <<= 1;
+
+		idt77252_write_gp(card, gp | clktab[j++]);
+		udelay(5);
+
+		byte |= idt77252_read_gp(card) & SAR_GP_EEDI ? 1 : 0;
+
+		idt77252_write_gp(card, gp | clktab[j++]);
+		udelay(5);
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	return byte;
+}
+
+static void
+idt77252_eeprom_write_byte(struct idt77252_dev *card, u8 offset, u8 data)
+{
+	u32 gp;
+	int i, j;
+
+	gp = idt77252_read_gp(card) & ~(SAR_GP_EESCLK|SAR_GP_EECS|SAR_GP_EEDO);
+
+	for (i = 0; i < sizeof(wrentab)/sizeof(wrentab[0]); i++) {
+		idt77252_write_gp(card, gp | wrentab[i]);
+		udelay(5);
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	for (i = 0; i < sizeof(wrtab)/sizeof(wrtab[0]); i++) {
+		idt77252_write_gp(card, gp | wrtab[i]);
+		udelay(5);
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	for (i = 0, j = 0; i < 8; i++) {
+		idt77252_write_gp(card, gp | clktab[j++] |
+					(offset & 1 ? SAR_GP_EEDO : 0));
+		udelay(5);
+
+		idt77252_write_gp(card, gp | clktab[j++] |
+					(offset & 1 ? SAR_GP_EEDO : 0));
+		udelay(5);
+
+		offset >>= 1;
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+
+	for (i = 0, j = 0; i < 8; i++) {
+		idt77252_write_gp(card, gp | clktab[j++] |
+					(data & 1 ? SAR_GP_EEDO : 0));
+		udelay(5);
+
+		idt77252_write_gp(card, gp | clktab[j++] |
+					(data & 1 ? SAR_GP_EEDO : 0));
+		udelay(5);
+
+		data >>= 1;
+	}
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+}
+
+static void
+idt77252_eeprom_init(struct idt77252_dev *card)
+{
+	u32 gp;
+
+	gp = idt77252_read_gp(card) & ~(SAR_GP_EESCLK|SAR_GP_EECS|SAR_GP_EEDO);
+
+	idt77252_write_gp(card, gp | SAR_GP_EECS | SAR_GP_EESCLK);
+	udelay(5);
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+	idt77252_write_gp(card, gp | SAR_GP_EECS | SAR_GP_EESCLK);
+	udelay(5);
+	idt77252_write_gp(card, gp | SAR_GP_EECS);
+	udelay(5);
+}
+#endif /* HAVE_EEPROM */
+
+
+#ifdef CONFIG_ATM_IDT77252_DEBUG
+static void
+dump_tct(struct idt77252_dev *card, int index)
+{
+	unsigned long tct;
+	int i;
+
+	tct = (unsigned long) (card->tct_base + index * SAR_SRAM_TCT_SIZE);
+
+	printk("%s: TCT %x:", card->name, index);
+	for (i = 0; i < 8; i++) {
+		printk(" %08x", read_sram(card, tct + i));
+	}
+	printk("\n");
+}
+
+static void
+idt77252_tx_dump(struct idt77252_dev *card)
+{
+	struct atm_vcc *vcc;
+	struct vc_map *vc;
+	int i;
+
+	printk("%s\n", __FUNCTION__);
+	for (i = 0; i < card->tct_size; i++) {
+		vc = card->vcs[i];
+		if (!vc)
+			continue;
+
+		vcc = NULL;
+		if (vc->rx_vcc)
+			vcc = vc->rx_vcc;
+		else if (vc->tx_vcc)
+			vcc = vc->tx_vcc;
+
+		if (!vcc)
+			continue;
+
+		printk("%s: Connection %d:\n", card->name, vc->index);
+		dump_tct(card, vc->index);
+	}
+}
+#endif
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* SCQ Handling                                                              */
+/*                                                                           */
+/*****************************************************************************/
+
+static int
+sb_pool_add(struct idt77252_dev *card, struct sk_buff *skb, int queue)
+{
+	struct sb_pool *pool = &card->sbpool[queue];
+	int index;
+
+	index = pool->index;
+	while (pool->skb[index]) {
+		index = (index + 1) & FBQ_MASK;
+		if (index == pool->index)
+			return -ENOBUFS;
+	}
+
+	pool->skb[index] = skb;
+	IDT77252_PRV_POOL(skb) = POOL_HANDLE(queue, index);
+
+	pool->index = (index + 1) & FBQ_MASK;
+	return 0;
+}
+
+static void
+sb_pool_remove(struct idt77252_dev *card, struct sk_buff *skb)
+{
+	unsigned int queue, index;
+	u32 handle;
+
+	handle = IDT77252_PRV_POOL(skb);
+
+	queue = POOL_QUEUE(handle);
+	if (queue > 3)
+		return;
+
+	index = POOL_INDEX(handle);
+	if (index > FBQ_SIZE - 1)
+		return;
+
+	card->sbpool[queue].skb[index] = NULL;
+}
+
+static struct sk_buff *
+sb_pool_skb(struct idt77252_dev *card, u32 handle)
+{
+	unsigned int queue, index;
+
+	queue = POOL_QUEUE(handle);
+	if (queue > 3)
+		return NULL;
+
+	index = POOL_INDEX(handle);
+	if (index > FBQ_SIZE - 1)
+		return NULL;
+
+	return card->sbpool[queue].skb[index];
+}
+
+static struct scq_info *
+alloc_scq(struct idt77252_dev *card, int class)
+{
+	struct scq_info *scq;
+
+	scq = (struct scq_info *) kmalloc(sizeof(struct scq_info), GFP_KERNEL);
+	if (!scq)
+		return NULL;
+	memset(scq, 0, sizeof(struct scq_info));
+
+	scq->base = pci_alloc_consistent(card->pcidev, SCQ_SIZE,
+					 &scq->paddr);
+	if (scq->base == NULL) {
+		kfree(scq);
+		return NULL;
+	}
+	memset(scq->base, 0, SCQ_SIZE);
+
+	scq->next = scq->base;
+	scq->last = scq->base + (SCQ_ENTRIES - 1);
+	atomic_set(&scq->used, 0);
+
+	spin_lock_init(&scq->lock);
+	spin_lock_init(&scq->skblock);
+
+	skb_queue_head_init(&scq->transmit);
+	skb_queue_head_init(&scq->pending);
+
+	TXPRINTK("idt77252: SCQ: base 0x%p, next 0x%p, last 0x%p, paddr %08x\n",
+		 scq->base, scq->next, scq->last, scq->paddr);
+
+	return scq;
+}
+
+static void
+free_scq(struct idt77252_dev *card, struct scq_info *scq)
+{
+	struct sk_buff *skb;
+	struct atm_vcc *vcc;
+
+	pci_free_consistent(card->pcidev, SCQ_SIZE,
+			    scq->base, scq->paddr);
+
+	while ((skb = skb_dequeue(&scq->transmit))) {
+		pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+				 skb->len, PCI_DMA_TODEVICE);
+
+		vcc = ATM_SKB(skb)->vcc;
+		if (vcc->pop)
+			vcc->pop(vcc, skb);
+		else
+			dev_kfree_skb(skb);
+	}
+
+	while ((skb = skb_dequeue(&scq->pending))) {
+		pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+				 skb->len, PCI_DMA_TODEVICE);
+
+		vcc = ATM_SKB(skb)->vcc;
+		if (vcc->pop)
+			vcc->pop(vcc, skb);
+		else
+			dev_kfree_skb(skb);
+	}
+
+	kfree(scq);
+}
+
+
+static int
+push_on_scq(struct idt77252_dev *card, struct vc_map *vc, struct sk_buff *skb)
+{
+	struct scq_info *scq = vc->scq;
+	unsigned long flags;
+	struct scqe *tbd;
+	int entries;
+
+	TXPRINTK("%s: SCQ: next 0x%p\n", card->name, scq->next);
+
+	atomic_inc(&scq->used);
+	entries = atomic_read(&scq->used);
+	if (entries > (SCQ_ENTRIES - 1)) {
+		atomic_dec(&scq->used);
+		goto out;
+	}
+
+	skb_queue_tail(&scq->transmit, skb);
+
+	spin_lock_irqsave(&vc->lock, flags);
+	if (vc->estimator) {
+		struct atm_vcc *vcc = vc->tx_vcc;
+
+		vc->estimator->cells += (skb->len + 47) / 48;
+		if (atomic_read(&vcc->tx_inuse) > (vcc->sk->sndbuf >> 1)) {
+			u32 cps = vc->estimator->maxcps;
+
+			vc->estimator->cps = cps;
+			vc->estimator->avcps = cps << 5;
+			if (vc->lacr < vc->init_er) {
+				vc->lacr = vc->init_er;
+				writel(TCMDQ_LACR | (vc->lacr << 16) |
+				       vc->index, SAR_REG_TCMDQ);
+			}
+		}
+	}
+	spin_unlock_irqrestore(&vc->lock, flags);
+
+	tbd = &IDT77252_PRV_TBD(skb);
+
+	spin_lock_irqsave(&scq->lock, flags);
+	scq->next->word_1 = cpu_to_le32(tbd->word_1 |
+					SAR_TBD_TSIF | SAR_TBD_GTSI);
+	scq->next->word_2 = cpu_to_le32(tbd->word_2);
+	scq->next->word_3 = cpu_to_le32(tbd->word_3);
+	scq->next->word_4 = cpu_to_le32(tbd->word_4);
+
+	if (scq->next == scq->last)
+		scq->next = scq->base;
+	else
+		scq->next++;
+
+	write_sram(card, scq->scd,
+		   scq->paddr +
+		   (u32)((unsigned long)scq->next - (unsigned long)scq->base));
+	spin_unlock_irqrestore(&scq->lock, flags);
+
+	scq->trans_start = jiffies;
+
+	if (test_and_clear_bit(VCF_IDLE, &vc->flags)) {
+		writel(TCMDQ_START_LACR | (vc->lacr << 16) | vc->index,
+		       SAR_REG_TCMDQ);
+	}
+
+	TXPRINTK("%d entries in SCQ used (push).\n", atomic_read(&scq->used));
+
+	XPRINTK("%s: SCQ (after push %2d) head = 0x%x, next = 0x%p.\n",
+		card->name, atomic_read(&scq->used),
+		read_sram(card, scq->scd + 1), scq->next);
+
+	return 0;
+
+out:
+	if (jiffies - scq->trans_start > HZ) {
+		printk("%s: Error pushing TBD for %d.%d\n",
+		       card->name, vc->tx_vcc->vpi, vc->tx_vcc->vci);
+		idt77252_tx_dump(card);
+		scq->trans_start = jiffies;
+	}
+
+	return -ENOBUFS;
+}
+
+
+static void
+drain_scq(struct idt77252_dev *card, struct vc_map *vc)
+{
+	struct scq_info *scq = vc->scq;
+	struct sk_buff *skb;
+	struct atm_vcc *vcc;
+
+	TXPRINTK("%s: SCQ (before drain %2d) next = 0x%p.\n",
+		 card->name, atomic_read(&scq->used), scq->next);
+
+	skb = skb_dequeue(&scq->transmit);
+	if (skb) {
+		TXPRINTK("%s: freeing skb at %p.\n", card->name, skb);
+
+		pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+				 skb->len, PCI_DMA_TODEVICE);
+
+		vcc = ATM_SKB(skb)->vcc;
+
+		if (vcc->pop)
+			vcc->pop(vcc, skb);
+		else
+			dev_kfree_skb(skb);
+
+		atomic_inc(&vcc->stats->tx);
+	}
+
+	atomic_dec(&scq->used);
+
+	spin_lock(&scq->skblock);
+	while ((skb = skb_dequeue(&scq->pending))) {
+		if (push_on_scq(card, vc, skb)) {
+			skb_queue_head(&vc->scq->pending, skb);
+			break;
+		}
+	}
+	spin_unlock(&scq->skblock);
+}
+
+static int
+queue_skb(struct idt77252_dev *card, struct vc_map *vc,
+	  struct sk_buff *skb, int oam)
+{
+	struct atm_vcc *vcc;
+	struct scqe *tbd;
+	unsigned long flags;
+	int error;
+	int aal;
+
+	if (skb->len == 0) {
+		printk("%s: invalid skb->len (%d)\n", card->name, skb->len);
+		return -EINVAL;
+	}
+
+	TXPRINTK("%s: Sending %d bytes of data.\n",
+		 card->name, skb->len);
+
+	tbd = &IDT77252_PRV_TBD(skb);
+	vcc = ATM_SKB(skb)->vcc;
+
+	IDT77252_PRV_PADDR(skb) = pci_map_single(card->pcidev, skb->data,
+						 skb->len, PCI_DMA_TODEVICE);
+
+	error = -EINVAL;
+
+	if (oam) {
+		if (skb->len != 52)
+			goto errout;
+
+		tbd->word_1 = SAR_TBD_OAM | ATM_CELL_PAYLOAD | SAR_TBD_EPDU;
+		tbd->word_2 = IDT77252_PRV_PADDR(skb) + 4;
+		tbd->word_3 = 0x00000000;
+		tbd->word_4 = (skb->data[0] << 24) | (skb->data[1] << 16) |
+			      (skb->data[2] <<  8) | (skb->data[3] <<  0);
+
+		if (test_bit(VCF_RSV, &vc->flags))
+			vc = card->vcs[0];
+
+		goto done;
+	}
+
+	if (test_bit(VCF_RSV, &vc->flags)) {
+		printk("%s: Trying to transmit on reserved VC\n", card->name);
+		goto errout;
+	}
+
+	aal = vcc->qos.aal;
+
+	switch (aal) {
+	case ATM_AAL0:
+	case ATM_AAL34:
+		if (skb->len > 52)
+			goto errout;
+
+		if (aal == ATM_AAL0)
+			tbd->word_1 = SAR_TBD_EPDU | SAR_TBD_AAL0 |
+				      ATM_CELL_PAYLOAD;
+		else
+			tbd->word_1 = SAR_TBD_EPDU | SAR_TBD_AAL34 |
+				      ATM_CELL_PAYLOAD;
+
+		tbd->word_2 = IDT77252_PRV_PADDR(skb) + 4;
+		tbd->word_3 = 0x00000000;
+		tbd->word_4 = (skb->data[0] << 24) | (skb->data[1] << 16) |
+			      (skb->data[2] <<  8) | (skb->data[3] <<  0);
+		break;
+
+	case ATM_AAL5:
+		tbd->word_1 = SAR_TBD_EPDU | SAR_TBD_AAL5 | skb->len;
+		tbd->word_2 = IDT77252_PRV_PADDR(skb);
+		tbd->word_3 = skb->len;
+		tbd->word_4 = (vcc->vpi << SAR_TBD_VPI_SHIFT) |
+			      (vcc->vci << SAR_TBD_VCI_SHIFT);
+		break;
+
+	case ATM_AAL1:
+	case ATM_AAL2:
+	default:
+		printk("%s: Traffic type not supported.\n", card->name);
+		error = -EPROTONOSUPPORT;
+		goto errout;
+	}
+
+done:
+	spin_lock_irqsave(&vc->scq->skblock, flags);
+	skb_queue_tail(&vc->scq->pending, skb);
+
+	while ((skb = skb_dequeue(&vc->scq->pending))) {
+		if (push_on_scq(card, vc, skb)) {
+			skb_queue_head(&vc->scq->pending, skb);
+			break;
+		}
+	}
+	spin_unlock_irqrestore(&vc->scq->skblock, flags);
+
+	return 0;
+
+errout:
+	pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+			 skb->len, PCI_DMA_TODEVICE);
+	return error;
+}
+
+static unsigned long
+get_free_scd(struct idt77252_dev *card, struct vc_map *vc)
+{
+	int i;
+
+	for (i = 0; i < card->scd_size; i++) {
+		if (!card->scd2vc[i]) {
+			card->scd2vc[i] = vc;
+			vc->scd_index = i;
+			return card->scd_base + i * SAR_SRAM_SCD_SIZE;
+		}
+	}
+	return 0;
+}
+
+static void
+fill_scd(struct idt77252_dev *card, struct scq_info *scq, int class)
+{
+	write_sram(card, scq->scd, scq->paddr);
+	write_sram(card, scq->scd + 1, 0x00000000);
+	write_sram(card, scq->scd + 2, 0xffffffff);
+	write_sram(card, scq->scd + 3, 0x00000000);
+}
+
+static void
+clear_scd(struct idt77252_dev *card, struct scq_info *scq, int class)
+{
+	return;
+}
+
+/*****************************************************************************/
+/*                                                                           */
+/* RSQ Handling                                                              */
+/*                                                                           */
+/*****************************************************************************/
+
+static int
+init_rsq(struct idt77252_dev *card)
+{
+	struct rsq_entry *rsqe;
+
+	card->rsq.base = pci_alloc_consistent(card->pcidev, RSQSIZE,
+					      &card->rsq.paddr);
+	if (card->rsq.base == NULL) {
+		printk("%s: can't allocate RSQ.\n", card->name);
+		return -1;
+	}
+	memset(card->rsq.base, 0, RSQSIZE);
+
+	card->rsq.last = card->rsq.base + RSQ_NUM_ENTRIES - 1;
+	card->rsq.next = card->rsq.last;
+	for (rsqe = card->rsq.base; rsqe <= card->rsq.last; rsqe++)
+		rsqe->word_4 = 0;
+
+	writel((unsigned long) card->rsq.last - (unsigned long) card->rsq.base,
+	       SAR_REG_RSQH);
+	writel(card->rsq.paddr, SAR_REG_RSQB);
+
+	IPRINTK("%s: RSQ base at 0x%lx (0x%x).\n", card->name,
+		(unsigned long) card->rsq.base,
+		readl(SAR_REG_RSQB));
+	IPRINTK("%s: RSQ head = 0x%x, base = 0x%x, tail = 0x%x.\n",
+		card->name,
+		readl(SAR_REG_RSQH),
+		readl(SAR_REG_RSQB),
+		readl(SAR_REG_RSQT));
+
+	return 0;
+}
+
+static void
+deinit_rsq(struct idt77252_dev *card)
+{
+	pci_free_consistent(card->pcidev, RSQSIZE,
+			    card->rsq.base, card->rsq.paddr);
+}
+
+static void
+dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
+{
+	struct atm_vcc *vcc;
+	struct sk_buff *skb;
+	struct rx_pool *rpp;
+	struct vc_map *vc;
+	u32 header, vpi, vci;
+	u32 stat;
+	int i;
+
+	stat = le32_to_cpu(rsqe->word_4);
+
+	if (stat & SAR_RSQE_IDLE) {
+		RXPRINTK("%s: message about inactive connection.\n",
+			 card->name);
+		return;
+	}
+
+	skb = sb_pool_skb(card, le32_to_cpu(rsqe->word_2));
+	if (skb == NULL) {
+		printk("%s: NULL skb in %s, rsqe: %08x %08x %08x %08x\n",
+		       card->name, __FUNCTION__,
+		       le32_to_cpu(rsqe->word_1), le32_to_cpu(rsqe->word_2),
+		       le32_to_cpu(rsqe->word_3), le32_to_cpu(rsqe->word_4));
+		return;
+	}
+
+	header = le32_to_cpu(rsqe->word_1);
+	vpi = (header >> 16) & 0x00ff;
+	vci = (header >>  0) & 0xffff;
+
+	RXPRINTK("%s: SDU for %d.%d received in buffer 0x%p (data 0x%p).\n",
+		 card->name, vpi, vci, skb, skb->data);
+
+	if ((vpi >= (1 << card->vpibits)) || (vci != (vci & card->vcimask))) {
+		printk("%s: SDU received for out-of-range vc %u.%u\n",
+		       card->name, vpi, vci);
+		recycle_rx_skb(card, skb);
+		return;
+	}
+
+	vc = card->vcs[VPCI2VC(card, vpi, vci)];
+	if (!vc || !test_bit(VCF_RX, &vc->flags)) {
+		printk("%s: SDU received on non RX vc %u.%u\n",
+		       card->name, vpi, vci);
+		recycle_rx_skb(card, skb);
+		return;
+	}
+
+	vcc = vc->rx_vcc;
+
+	pci_dma_sync_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+			    skb->end - skb->data, PCI_DMA_FROMDEVICE);
+
+	if ((vcc->qos.aal == ATM_AAL0) ||
+	    (vcc->qos.aal == ATM_AAL34)) {
+		struct sk_buff *sb;
+		unsigned char *cell;
+		u32 aal0;
+
+		cell = skb->data;
+		for (i = (stat & SAR_RSQE_CELLCNT); i; i--) {
+			if ((sb = dev_alloc_skb(64)) == NULL) {
+				printk("%s: Can't allocate buffers for aal0.\n",
+				       card->name);
+				atomic_add(i, &vcc->stats->rx_drop);
+				break;
+			}
+			if (!atm_charge(vcc, sb->truesize)) {
+				RXPRINTK("%s: atm_charge() dropped aal0 packets.\n",
+					 card->name);
+				atomic_add(i - 1, &vcc->stats->rx_drop);
+				dev_kfree_skb(sb);
+				break;
+			}
+			aal0 = (vpi << ATM_HDR_VPI_SHIFT) |
+			       (vci << ATM_HDR_VCI_SHIFT);
+			aal0 |= (stat & SAR_RSQE_EPDU) ? 0x00000002 : 0;
+			aal0 |= (stat & SAR_RSQE_CLP)  ? 0x00000001 : 0;
+
+			*((u32 *) sb->data) = aal0;
+			skb_put(sb, sizeof(u32));
+			memcpy(skb_put(sb, ATM_CELL_PAYLOAD),
+			       cell, ATM_CELL_PAYLOAD);
+
+			ATM_SKB(sb)->vcc = vcc;
+			sb->stamp = xtime;
+			vcc->push(vcc, sb);
+			atomic_inc(&vcc->stats->rx);
+
+			cell += ATM_CELL_PAYLOAD;
+		}
+
+		recycle_rx_skb(card, skb);
+		return;
+	}
+	if (vcc->qos.aal != ATM_AAL5) {
+		printk("%s: Unexpected AAL type in dequeue_rx(): %d.\n",
+		       card->name, vcc->qos.aal);
+		recycle_rx_skb(card, skb);
+		return;
+	}
+	skb->len = (stat & SAR_RSQE_CELLCNT) * ATM_CELL_PAYLOAD;
+
+	rpp = &vc->rcv.rx_pool;
+
+	rpp->len += skb->len;
+	if (!rpp->count++)
+		rpp->first = skb;
+	*rpp->last = skb;
+	rpp->last = &skb->next;
+
+	if (stat & SAR_RSQE_EPDU) {
+		unsigned char *l1l2;
+		unsigned int len;
+
+		l1l2 = (unsigned char *) ((unsigned long) skb->data + skb->len - 6);
+
+		len = (l1l2[0] << 8) | l1l2[1];
+		len = len ? len : 0x10000;
+
+		RXPRINTK("%s: PDU has %d bytes.\n", card->name, len);
+
+		if ((len + 8 > rpp->len) || (len + (47 + 8) < rpp->len)) {
+			RXPRINTK("%s: AAL5 PDU size mismatch: %d != %d. "
+			         "(CDC: %08x)\n",
+			         card->name, len, rpp->len, readl(SAR_REG_CDC));
+			recycle_rx_pool_skb(card, rpp);
+			atomic_inc(&vcc->stats->rx_err);
+			return;
+		}
+		if (stat & SAR_RSQE_CRC) {
+			RXPRINTK("%s: AAL5 CRC error.\n", card->name);
+			recycle_rx_pool_skb(card, rpp);
+			atomic_inc(&vcc->stats->rx_err);
+			return;
+		}
+		if (rpp->count > 1) {
+			struct sk_buff *sb;
+
+			skb = dev_alloc_skb(rpp->len);
+			if (!skb) {
+				RXPRINTK("%s: Can't alloc RX skb.\n",
+					 card->name);
+				recycle_rx_pool_skb(card, rpp);
+				atomic_inc(&vcc->stats->rx_err);
+				return;
+			}
+			if (!atm_charge(vcc, skb->truesize)) {
+				recycle_rx_pool_skb(card, rpp);
+				dev_kfree_skb(skb);
+				return;
+			}
+			sb = rpp->first;
+			for (i = 0; i < rpp->count; i++) {
+				memcpy(skb_put(skb, sb->len),
+				       sb->data, sb->len);
+				sb = sb->next;
+			}
+
+			recycle_rx_pool_skb(card, rpp);
+
+			skb_trim(skb, len);
+			ATM_SKB(skb)->vcc = vcc;
+			skb->stamp = xtime;
+
+			vcc->push(vcc, skb);
+			atomic_inc(&vcc->stats->rx);
+
+			return;
+		}
+
+		skb->next = NULL;
+		flush_rx_pool(card, rpp);
+
+		if (!atm_charge(vcc, skb->truesize)) {
+			recycle_rx_skb(card, skb);
+			return;
+		}
+
+		pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+				 skb->end - skb->data, PCI_DMA_FROMDEVICE);
+		sb_pool_remove(card, skb);
+
+		skb_trim(skb, len);
+		ATM_SKB(skb)->vcc = vcc;
+		skb->stamp = xtime;
+
+		vcc->push(vcc, skb);
+		atomic_inc(&vcc->stats->rx);
+
+		if (skb->truesize > SAR_FB_SIZE_3)
+			add_rx_skb(card, 3, SAR_FB_SIZE_3, 1);
+		else if (skb->truesize > SAR_FB_SIZE_2)
+			add_rx_skb(card, 2, SAR_FB_SIZE_2, 1);
+		else if (skb->truesize > SAR_FB_SIZE_1)
+			add_rx_skb(card, 1, SAR_FB_SIZE_1, 1);
+		else
+			add_rx_skb(card, 0, SAR_FB_SIZE_0, 1);
+		return;
+	}
+}
+
+static void
+idt77252_rx(struct idt77252_dev *card)
+{
+	struct rsq_entry *rsqe;
+
+	if (card->rsq.next == card->rsq.last)
+		rsqe = card->rsq.base;
+	else
+		rsqe = card->rsq.next + 1;
+
+	if (!(le32_to_cpu(rsqe->word_4) & SAR_RSQE_VALID)) {
+		RXPRINTK("%s: no entry in RSQ.\n", card->name);
+		return;
+	}
+
+	do {
+		dequeue_rx(card, rsqe);
+		rsqe->word_4 = 0;
+		card->rsq.next = rsqe;
+		if (card->rsq.next == card->rsq.last)
+			rsqe = card->rsq.base;
+		else
+			rsqe = card->rsq.next + 1;
+	} while (le32_to_cpu(rsqe->word_4) & SAR_RSQE_VALID);
+
+	writel((unsigned long) card->rsq.next - (unsigned long) card->rsq.base,
+	       SAR_REG_RSQH);
+}
+
+static void
+idt77252_rx_raw(struct idt77252_dev *card)
+{
+	struct sk_buff	*queue;
+	u32		head, tail;
+	struct atm_vcc	*vcc;
+	struct vc_map	*vc;
+	struct sk_buff	*sb;
+
+	if (card->raw_cell_head == NULL) {
+		u32 handle = le32_to_cpu(*(card->raw_cell_hnd + 1));
+		card->raw_cell_head = sb_pool_skb(card, handle);
+	}
+
+	queue = card->raw_cell_head;
+	if (!queue)
+		return;
+
+	head = IDT77252_PRV_PADDR(queue) + (queue->data - queue->head - 16);
+	tail = readl(SAR_REG_RAWCT);
+
+	pci_dma_sync_single(card->pcidev, IDT77252_PRV_PADDR(queue),
+			    queue->end - queue->head - 16, PCI_DMA_FROMDEVICE);
+
+	while (head != tail) {
+		unsigned int vpi, vci, pti;
+		u32 header;
+
+		header = le32_to_cpu(*(u32 *) &queue->data[0]);
+
+		vpi = (header & ATM_HDR_VPI_MASK) >> ATM_HDR_VPI_SHIFT;
+		vci = (header & ATM_HDR_VCI_MASK) >> ATM_HDR_VCI_SHIFT;
+		pti = (header & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT;
+
+#ifdef CONFIG_ATM_IDT77252_DEBUG
+		if (debug & DBG_RAW_CELL) {
+			int i;
+
+			printk("%s: raw cell %x.%02x.%04x.%x.%x\n",
+			       card->name, (header >> 28) & 0x000f,
+			       (header >> 20) & 0x00ff,
+			       (header >>  4) & 0xffff,
+			       (header >>  1) & 0x0007,
+			       (header >>  0) & 0x0001);
+			for (i = 16; i < 64; i++)
+				printk(" %02x", queue->data[i]);
+			printk("\n");
+		}
+#endif
+
+		if (vpi >= (1<<card->vpibits) || vci >= (1<<card->vcibits)) {
+			RPRINTK("%s: SDU received for out-of-range vc %u.%u\n",
+				card->name, vpi, vci);
+			goto drop;
+		}
+
+		vc = card->vcs[VPCI2VC(card, vpi, vci)];
+		if (!vc || !test_bit(VCF_RX, &vc->flags)) {
+			RPRINTK("%s: SDU received on non RX vc %u.%u\n",
+				card->name, vpi, vci);
+			goto drop;
+		}
+
+		vcc = vc->rx_vcc;
+
+		if (vcc->qos.aal != ATM_AAL0) {
+			RPRINTK("%s: raw cell for non AAL0 vc %u.%u\n",
+				card->name, vpi, vci);
+			atomic_inc(&vcc->stats->rx_drop);
+			goto drop;
+		}
+	
+		if ((sb = dev_alloc_skb(64)) == NULL) {
+			printk("%s: Can't allocate buffers for AAL0.\n",
+			       card->name);
+			atomic_inc(&vcc->stats->rx_err);
+			goto drop;
+		}
+
+		if ((vcc->sk != NULL) && !atm_charge(vcc, sb->truesize)) {
+			RXPRINTK("%s: atm_charge() dropped AAL0 packets.\n",
+				 card->name);
+			dev_kfree_skb(sb);
+			goto drop;
+		}
+
+		*((u32 *) sb->data) = header;
+		skb_put(sb, sizeof(u32));
+		memcpy(skb_put(sb, ATM_CELL_PAYLOAD), &(queue->data[16]),
+		       ATM_CELL_PAYLOAD);
+
+		ATM_SKB(sb)->vcc = vcc;
+		sb->stamp = xtime;
+		vcc->push(vcc, sb);
+		atomic_inc(&vcc->stats->rx);
+
+drop:
+		skb_pull(queue, 64);
+
+		head = IDT77252_PRV_PADDR(queue)
+					+ (queue->data - queue->head - 16);
+
+		if (queue->len < 128) {
+			struct sk_buff *next;
+			u32 handle;
+
+			head = le32_to_cpu(*(u32 *) &queue->data[0]);
+			handle = le32_to_cpu(*(u32 *) &queue->data[4]);
+
+			next = sb_pool_skb(card, handle);
+			recycle_rx_skb(card, queue);
+
+			if (next) {
+				card->raw_cell_head = next;
+				queue = card->raw_cell_head;
+				pci_dma_sync_single(card->pcidev,
+						    IDT77252_PRV_PADDR(queue),
+						    queue->end - queue->data,
+						    PCI_DMA_FROMDEVICE);
+			} else {
+				card->raw_cell_head = NULL;
+				printk("%s: raw cell queue overrun\n",
+				       card->name);
+				break;
+			}
+		}
+	}
+}
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* TSQ Handling                                                              */
+/*                                                                           */
+/*****************************************************************************/
+
+static int
+init_tsq(struct idt77252_dev *card)
+{
+	struct tsq_entry *tsqe;
+
+	card->tsq.base = pci_alloc_consistent(card->pcidev, RSQSIZE,
+					      &card->tsq.paddr);
+	if (card->tsq.base == NULL) {
+		printk("%s: can't allocate TSQ.\n", card->name);
+		return -1;
+	}
+	memset(card->tsq.base, 0, TSQSIZE);
+
+	card->tsq.last = card->tsq.base + TSQ_NUM_ENTRIES - 1;
+	card->tsq.next = card->tsq.last;
+	for (tsqe = card->tsq.base; tsqe <= card->tsq.last; tsqe++)
+		tsqe->word_2 = cpu_to_le32(SAR_TSQE_INVALID);
+
+	writel(card->tsq.paddr, SAR_REG_TSQB);
+	writel((unsigned long) card->tsq.next - (unsigned long) card->tsq.base,
+	       SAR_REG_TSQH);
+
+	return 0;
+}
+
+static void
+deinit_tsq(struct idt77252_dev *card)
+{
+	pci_free_consistent(card->pcidev, TSQSIZE,
+			    card->tsq.base, card->tsq.paddr);
+}
+
+static void
+idt77252_tx(struct idt77252_dev *card)
+{
+	struct tsq_entry *tsqe;
+	unsigned int vpi, vci;
+	struct vc_map *vc;
+	u32 conn, stat;
+
+	if (card->tsq.next == card->tsq.last)
+		tsqe = card->tsq.base;
+	else
+		tsqe = card->tsq.next + 1;
+
+	TXPRINTK("idt77252_tx: tsq  %p: base %p, next %p, last %p\n", tsqe,
+		 card->tsq.base, card->tsq.next, card->tsq.last);
+	TXPRINTK("idt77252_tx: tsqb %08x, tsqt %08x, tsqh %08x, \n",
+		 readl(SAR_REG_TSQB),
+		 readl(SAR_REG_TSQT),
+		 readl(SAR_REG_TSQH));
+
+	stat = le32_to_cpu(tsqe->word_2);
+
+	if (stat & SAR_TSQE_INVALID)
+		return;
+
+	do {
+		TXPRINTK("tsqe: 0x%p [0x%08x 0x%08x]\n", tsqe,
+			 le32_to_cpu(tsqe->word_1),
+			 le32_to_cpu(tsqe->word_2));
+
+		switch (stat & SAR_TSQE_TYPE) {
+		case SAR_TSQE_TYPE_TIMER:
+			TXPRINTK("%s: Timer RollOver detected.\n", card->name);
+			break;
+
+		case SAR_TSQE_TYPE_IDLE:
+
+			conn = le32_to_cpu(tsqe->word_1);
+
+			if (SAR_TSQE_TAG(stat) == 0x10) {
+#ifdef	NOTDEF
+				printk("%s: Connection %d halted.\n",
+				       card->name,
+				       le32_to_cpu(tsqe->word_1) & 0x1fff);
+#endif
+				break;
+			}
+
+			vc = card->vcs[conn & 0x1fff];
+			if (!vc) {
+				printk("%s: could not find VC from conn %d\n",
+				       card->name, conn & 0x1fff);
+				break;
+			}
+
+			printk("%s: Connection %d IDLE.\n",
+			       card->name, vc->index);
+
+			set_bit(VCF_IDLE, &vc->flags);
+			break;
+
+		case SAR_TSQE_TYPE_TSR:
+
+			conn = le32_to_cpu(tsqe->word_1);
+
+			vc = card->vcs[conn & 0x1fff];
+			if (!vc) {
+				printk("%s: no VC at index %d\n",
+				       card->name,
+				       le32_to_cpu(tsqe->word_1) & 0x1fff);
+				break;
+			}
+
+			drain_scq(card, vc);
+			break;
+
+		case SAR_TSQE_TYPE_TBD_COMP:
+
+			conn = le32_to_cpu(tsqe->word_1);
+
+			vpi = (conn >> SAR_TBD_VPI_SHIFT) & 0x00ff;
+			vci = (conn >> SAR_TBD_VCI_SHIFT) & 0xffff;
+
+			if (vpi >= (1 << card->vpibits) ||
+			    vci >= (1 << card->vcibits)) {
+				printk("%s: TBD complete: "
+				       "out of range VPI.VCI %u.%u\n",
+				       card->name, vpi, vci);
+				break;
+			}
+
+			vc = card->vcs[VPCI2VC(card, vpi, vci)];
+			if (!vc) {
+				printk("%s: TBD complete: "
+				       "no VC at VPI.VCI %u.%u\n",
+				       card->name, vpi, vci);
+				break;
+			}
+
+			drain_scq(card, vc);
+			break;
+		}
+
+		tsqe->word_2 = cpu_to_le32(SAR_TSQE_INVALID);
+
+		card->tsq.next = tsqe;
+		if (card->tsq.next == card->tsq.last)
+			tsqe = card->tsq.base;
+		else
+			tsqe = card->tsq.next + 1;
+
+		TXPRINTK("tsqe: %p: base %p, next %p, last %p\n", tsqe,
+			 card->tsq.base, card->tsq.next, card->tsq.last);
+
+		stat = le32_to_cpu(tsqe->word_2);
+
+	} while (!(stat & SAR_TSQE_INVALID));
+
+	writel((unsigned long)card->tsq.next - (unsigned long)card->tsq.base,
+	       SAR_REG_TSQH);
+
+	XPRINTK("idt77252_tx-after writel%d: TSQ head = 0x%x, tail = 0x%x, next = 0x%p.\n",
+		card->index, readl(SAR_REG_TSQH),
+		readl(SAR_REG_TSQT), card->tsq.next);
+}
+
+
+static void
+tst_timer(unsigned long data)
+{
+	struct idt77252_dev *card = (struct idt77252_dev *)data;
+	unsigned long base, idle, jump;
+	unsigned long flags;
+	u32 pc;
+	int e;
+
+	spin_lock_irqsave(&card->tst_lock, flags);
+
+	base = card->tst[card->tst_index];
+	idle = card->tst[card->tst_index ^ 1];
+
+	if (test_bit(TST_SWITCH_WAIT, &card->tst_state)) {
+		jump = base + card->tst_size - 2;
+
+		pc = readl(SAR_REG_NOW) >> 2;
+		if ((pc ^ idle) & ~(card->tst_size - 1)) {
+			mod_timer(&card->tst_timer, jiffies + 1);
+			goto out;
+		}
+
+		clear_bit(TST_SWITCH_WAIT, &card->tst_state);
+
+		card->tst_index ^= 1;
+		write_sram(card, jump, TSTE_OPC_JMP | (base << 2));
+
+		base = card->tst[card->tst_index];
+		idle = card->tst[card->tst_index ^ 1];
+
+		for (e = 0; e < card->tst_size - 2; e++) {
+			if (card->soft_tst[e].tste & TSTE_PUSH_IDLE) {
+				write_sram(card, idle + e,
+					   card->soft_tst[e].tste & TSTE_MASK);
+				card->soft_tst[e].tste &= ~(TSTE_PUSH_IDLE);
+			}
+		}
+	}
+
+	if (test_and_clear_bit(TST_SWITCH_PENDING, &card->tst_state)) {
+
+		for (e = 0; e < card->tst_size - 2; e++) {
+			if (card->soft_tst[e].tste & TSTE_PUSH_ACTIVE) {
+				write_sram(card, idle + e,
+					   card->soft_tst[e].tste & TSTE_MASK);
+				card->soft_tst[e].tste &= ~(TSTE_PUSH_ACTIVE);
+				card->soft_tst[e].tste |= TSTE_PUSH_IDLE;
+			}
+		}
+
+		jump = base + card->tst_size - 2;
+
+		write_sram(card, jump, TSTE_OPC_NULL);
+		set_bit(TST_SWITCH_WAIT, &card->tst_state);
+
+		mod_timer(&card->tst_timer, jiffies + 1);
+	}
+
+out:
+	spin_unlock_irqrestore(&card->tst_lock, flags);
+}
+
+static int
+__fill_tst(struct idt77252_dev *card, struct vc_map *vc,
+	   int n, unsigned int opc)
+{
+	unsigned long cl, avail;
+	unsigned long idle;
+	int e, r;
+	u32 data;
+
+	avail = card->tst_size - 2;
+	for (e = 0; e < avail; e++) {
+		if (card->soft_tst[e].vc == NULL)
+			break;
+	}
+	if (e >= avail) {
+		printk("%s: No free TST entries found\n", card->name);
+		return -1;
+	}
+
+	NPRINTK("%s: conn %d: first TST entry at %d.\n",
+		card->name, vc ? vc->index : -1, e);
+
+	r = n;
+	cl = avail;
+	data = opc & TSTE_OPC_MASK;
+	if (vc && (opc != TSTE_OPC_NULL))
+		data = opc | vc->index;
+
+	idle = card->tst[card->tst_index ^ 1];
+
+	/*
+	 * Fill Soft TST.
+	 */
+	while (r > 0) {
+		if ((cl >= avail) && (card->soft_tst[e].vc == NULL)) {
+			if (vc)
+				card->soft_tst[e].vc = vc;
+			else
+				card->soft_tst[e].vc = (void *)-1;
+
+			card->soft_tst[e].tste = data;
+			if (timer_pending(&card->tst_timer))
+				card->soft_tst[e].tste |= TSTE_PUSH_ACTIVE;
+			else {
+				write_sram(card, idle + e, data);
+				card->soft_tst[e].tste |= TSTE_PUSH_IDLE;
+			}
+
+			cl -= card->tst_size;
+			r--;
+		}
+
+		if (++e == avail)
+			e = 0;
+		cl += n;
+	}
+
+	return 0;
+}
+
+static int
+fill_tst(struct idt77252_dev *card, struct vc_map *vc, int n, unsigned int opc)
+{
+	unsigned long flags;
+	int res;
+
+	spin_lock_irqsave(&card->tst_lock, flags);
+
+	res = __fill_tst(card, vc, n, opc);
+
+	set_bit(TST_SWITCH_PENDING, &card->tst_state);
+	if (!timer_pending(&card->tst_timer))
+		mod_timer(&card->tst_timer, jiffies + 1);
+
+	spin_unlock_irqrestore(&card->tst_lock, flags);
+	return res;
+}
+
+static int
+__clear_tst(struct idt77252_dev *card, struct vc_map *vc)
+{
+	unsigned long idle;
+	int e;
+
+	idle = card->tst[card->tst_index ^ 1];
+
+	for (e = 0; e < card->tst_size - 2; e++) {
+		if (card->soft_tst[e].vc == vc) {
+			card->soft_tst[e].vc = NULL;
+
+			card->soft_tst[e].tste = TSTE_OPC_VAR;
+			if (timer_pending(&card->tst_timer))
+				card->soft_tst[e].tste |= TSTE_PUSH_ACTIVE;
+			else {
+				write_sram(card, idle + e, TSTE_OPC_VAR);
+				card->soft_tst[e].tste |= TSTE_PUSH_IDLE;
+			}
+		}
+	}
+
+	return 0;
+}
+
+static int
+clear_tst(struct idt77252_dev *card, struct vc_map *vc)
+{
+	unsigned long flags;
+	int res;
+
+	spin_lock_irqsave(&card->tst_lock, flags);
+
+	res = __clear_tst(card, vc);
+
+	set_bit(TST_SWITCH_PENDING, &card->tst_state);
+	if (!timer_pending(&card->tst_timer))
+		mod_timer(&card->tst_timer, jiffies + 1);
+
+	spin_unlock_irqrestore(&card->tst_lock, flags);
+	return res;
+}
+
+static int
+change_tst(struct idt77252_dev *card, struct vc_map *vc,
+	   int n, unsigned int opc)
+{
+	unsigned long flags;
+	int res;
+
+	spin_lock_irqsave(&card->tst_lock, flags);
+
+	__clear_tst(card, vc);
+	res = __fill_tst(card, vc, n, opc);
+
+	set_bit(TST_SWITCH_PENDING, &card->tst_state);
+	if (!timer_pending(&card->tst_timer))
+		mod_timer(&card->tst_timer, jiffies + 1);
+
+	spin_unlock_irqrestore(&card->tst_lock, flags);
+	return res;
+}
+
+
+static int
+set_tct(struct idt77252_dev *card, struct vc_map *vc)
+{
+	unsigned long tct;
+
+	tct = (unsigned long) (card->tct_base + vc->index * SAR_SRAM_TCT_SIZE);
+
+	switch (vc->class) {
+	case SCHED_CBR:
+		OPRINTK("%s: writing TCT at 0x%lx, SCD 0x%lx.\n",
+		        card->name, tct, vc->scq->scd);
+
+		write_sram(card, tct + 0, TCT_CBR | vc->scq->scd);
+		write_sram(card, tct + 1, 0);
+		write_sram(card, tct + 2, 0);
+		write_sram(card, tct + 3, 0);
+		write_sram(card, tct + 4, 0);
+		write_sram(card, tct + 5, 0);
+		write_sram(card, tct + 6, 0);
+		write_sram(card, tct + 7, 0);
+		break;
+
+	case SCHED_UBR:
+		OPRINTK("%s: writing TCT at 0x%lx, SCD 0x%lx.\n",
+		        card->name, tct, vc->scq->scd);
+
+		write_sram(card, tct + 0, TCT_UBR | vc->scq->scd);
+		write_sram(card, tct + 1, 0);
+		write_sram(card, tct + 2, TCT_TSIF);
+		write_sram(card, tct + 3, TCT_HALT | TCT_IDLE);
+		write_sram(card, tct + 4, 0);
+		write_sram(card, tct + 5, vc->init_er);
+		write_sram(card, tct + 6, 0);
+		write_sram(card, tct + 7, TCT_FLAG_UBR);
+		break;
+
+	case SCHED_VBR:
+	case SCHED_ABR:
+	default:
+		return -ENOSYS;
+	}
+
+	return 0;
+}
+
+/*****************************************************************************/
+/*                                                                           */
+/* FBQ Handling                                                              */
+/*                                                                           */
+/*****************************************************************************/
+
+static __inline__ int
+idt77252_fbq_level(struct idt77252_dev *card, int queue)
+{
+	return (readl(SAR_REG_STAT) >> (16 + (queue << 2))) & 0x0f;
+}
+
+static __inline__ int
+idt77252_fbq_full(struct idt77252_dev *card, int queue)
+{
+	return (readl(SAR_REG_STAT) >> (16 + (queue << 2))) == 0x0f;
+}
+
+static int
+push_rx_skb(struct idt77252_dev *card, struct sk_buff *skb, int queue)
+{
+	unsigned long flags;
+	u32 handle;
+	u32 addr;
+
+	skb->data = skb->tail = skb->head;
+	skb->len = 0;
+
+	skb_reserve(skb, 16);
+
+	switch (queue) {
+	case 0:
+		skb_put(skb, SAR_FB_SIZE_0);
+		break;
+	case 1:
+		skb_put(skb, SAR_FB_SIZE_1);
+		break;
+	case 2:
+		skb_put(skb, SAR_FB_SIZE_2);
+		break;
+	case 3:
+		skb_put(skb, SAR_FB_SIZE_3);
+		break;
+	default:
+		dev_kfree_skb(skb);
+		return -1;
+	}
+
+	if (idt77252_fbq_full(card, queue))
+		return -1;
+
+	memset(&skb->data[(skb->len & ~(0x3f)) - 64], 0, 2 * sizeof(u32));
+
+	handle = IDT77252_PRV_POOL(skb);
+	addr = IDT77252_PRV_PADDR(skb);
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	writel(handle, card->fbq[queue]);
+	writel(addr, card->fbq[queue]);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+
+	return 0;
+}
+
+static void
+add_rx_skb(struct idt77252_dev *card, int queue,
+	   unsigned int size, unsigned int count)
+{
+	struct sk_buff *skb;
+	dma_addr_t paddr;
+	u32 handle;
+
+	while (count--) {
+		skb = dev_alloc_skb(size);
+		if (!skb)
+			return;
+
+		if (sb_pool_add(card, skb, queue)) {
+			printk("%s: SB POOL full\n", __FUNCTION__);
+			goto outfree;
+		}
+
+		paddr = pci_map_single(card->pcidev, skb->data,
+				       skb->end - skb->data,
+				       PCI_DMA_FROMDEVICE);
+		IDT77252_PRV_PADDR(skb) = paddr;
+
+		if (push_rx_skb(card, skb, queue)) {
+			printk("%s: FB QUEUE full\n", __FUNCTION__);
+			goto outunmap;
+		}
+	}
+
+	return;
+
+outunmap:
+	pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+			 skb->end - skb->data, PCI_DMA_FROMDEVICE);
+
+	handle = IDT77252_PRV_POOL(skb);
+	card->sbpool[POOL_QUEUE(handle)].skb[POOL_INDEX(handle)] = NULL;
+
+outfree:
+	dev_kfree_skb(skb);
+}
+
+
+static void
+recycle_rx_skb(struct idt77252_dev *card, struct sk_buff *skb)
+{
+	u32 handle = IDT77252_PRV_POOL(skb);
+	int err;
+
+	err = push_rx_skb(card, skb, POOL_QUEUE(handle));
+	if (err) {
+		pci_unmap_single(card->pcidev, IDT77252_PRV_PADDR(skb),
+				 skb->end - skb->data, PCI_DMA_FROMDEVICE);
+		sb_pool_remove(card, skb);
+		dev_kfree_skb(skb);
+	}
+}
+
+static void
+flush_rx_pool(struct idt77252_dev *card, struct rx_pool *rpp)
+{
+	rpp->len = 0;
+	rpp->count = 0;
+	rpp->first = NULL;
+	rpp->last = &rpp->first;
+}
+
+static void
+recycle_rx_pool_skb(struct idt77252_dev *card, struct rx_pool *rpp)
+{
+	struct sk_buff *skb, *next;
+	int i;
+
+	skb = rpp->first;
+	for (i = 0; i < rpp->count; i++) {
+		next = skb->next;
+		skb->next = NULL;
+		recycle_rx_skb(card, skb);
+		skb = next;
+	}
+	flush_rx_pool(card, rpp);
+}
+
+/*****************************************************************************/
+/*                                                                           */
+/* ATM Interface                                                             */
+/*                                                                           */
+/*****************************************************************************/
+
+static void
+idt77252_phy_put(struct atm_dev *dev, unsigned char value, unsigned long addr)
+{
+	write_utility(dev->dev_data, 0x100 + (addr & 0x1ff), value);
+}
+
+static unsigned char
+idt77252_phy_get(struct atm_dev *dev, unsigned long addr)
+{
+	return read_utility(dev->dev_data, 0x100 + (addr & 0x1ff));
+}
+
+static int
+idt77252_send_skb(struct atm_vcc *vcc, struct sk_buff *skb, int oam)
+{
+	struct atm_dev *dev = vcc->dev;
+	struct idt77252_dev *card = dev->dev_data;
+	struct vc_map *vc = vcc->dev_data;
+	int err;
+
+	if (vc == NULL) {
+		printk("%s: NULL connection in send().\n", card->name);
+		atomic_inc(&vcc->stats->tx_err);
+		dev_kfree_skb(skb);
+		return -EINVAL;
+	}
+	if (!test_bit(VCF_TX, &vc->flags)) {
+		printk("%s: Trying to transmit on a non-tx VC.\n", card->name);
+		atomic_inc(&vcc->stats->tx_err);
+		dev_kfree_skb(skb);
+		return -EINVAL;
+	}
+
+	switch (vcc->qos.aal) {
+	case ATM_AAL0:
+	case ATM_AAL1:
+	case ATM_AAL5:
+		break;
+	default:
+		printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal);
+		atomic_inc(&vcc->stats->tx_err);
+		dev_kfree_skb(skb);
+		return -EINVAL;
+	}
+
+	if (ATM_SKB(skb)->iovcnt != 0) {
+		printk("%s: No scatter-gather yet.\n", card->name);
+		atomic_inc(&vcc->stats->tx_err);
+		dev_kfree_skb(skb);
+		return -EINVAL;
+	}
+	ATM_SKB(skb)->vcc = vcc;
+
+	err = queue_skb(card, vc, skb, oam);
+	if (err) {
+		atomic_inc(&vcc->stats->tx_err);
+		dev_kfree_skb(skb);
+		return err;
+	}
+
+	return 0;
+}
+
+int
+idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb)
+{
+	return idt77252_send_skb(vcc, skb, 0);
+}
+
+static int
+idt77252_send_oam(struct atm_vcc *vcc, void *cell, int flags)
+{
+	struct atm_dev *dev = vcc->dev;
+	struct idt77252_dev *card = dev->dev_data;
+	struct sk_buff *skb;
+
+	skb = dev_alloc_skb(64);
+	if (!skb) {
+		printk("%s: Out of memory in send_oam().\n", card->name);
+		atomic_inc(&vcc->stats->tx_err);
+		return -ENOMEM;
+	}
+	atomic_add(skb->truesize + ATM_PDU_OVHD, &vcc->tx_inuse);
+	ATM_SKB(skb)->iovcnt = 0;
+
+	memcpy(skb_put(skb, 52), cell, 52);
+
+	return idt77252_send_skb(vcc, skb, 1);
+}
+
+static __inline__ unsigned int
+idt77252_fls(unsigned int x)
+{
+	int r = 1;
+
+	if (x == 0)
+		return 0;
+	if (x & 0xffff0000) {
+		x >>= 16;
+		r += 16;
+	}
+	if (x & 0xff00) {
+		x >>= 8;
+		r += 8;
+	}
+	if (x & 0xf0) {
+		x >>= 4;
+		r += 4;
+	}
+	if (x & 0xc) {
+		x >>= 2;
+		r += 2;
+	}
+	if (x & 0x2)
+		r += 1;
+	return r;
+}
+
+static u16
+idt77252_int_to_atmfp(unsigned int rate)
+{
+	u16 m, e;
+
+	if (rate == 0)
+		return 0;
+	e = idt77252_fls(rate) - 1;
+	if (e < 9)
+		m = (rate - (1 << e)) << (9 - e);
+	else if (e == 9)
+		m = (rate - (1 << e));
+	else /* e > 9 */
+		m = (rate - (1 << e)) >> (e - 9);
+	return 0x4000 | (e << 9) | m;
+}
+
+static u8
+idt77252_rate_logindex(struct idt77252_dev *card, int pcr)
+{
+	u16 afp;
+
+	afp = idt77252_int_to_atmfp(pcr < 0 ? -pcr : pcr);
+	if (pcr < 0)
+		return rate_to_log[(afp >> 5) & 0x1ff];
+	return rate_to_log[((afp >> 5) + 1) & 0x1ff];
+}
+
+static void
+idt77252_est_timer(unsigned long data)
+{
+	struct vc_map *vc = (struct vc_map *)data;
+	struct idt77252_dev *card = vc->card;
+	struct rate_estimator *est;
+	unsigned long flags;
+	u32 rate, cps;
+	u64 ncells;
+	u8 lacr;
+
+	spin_lock_irqsave(&vc->lock, flags);
+	est = vc->estimator;
+	if (!est)
+		goto out;
+
+	ncells = est->cells;
+
+	rate = ((u32)(ncells - est->last_cells)) << (7 - est->interval);
+	est->last_cells = ncells;
+	est->avcps += ((long)rate - (long)est->avcps) >> est->ewma_log;
+	est->cps = (est->avcps + 0x1f) >> 5;
+
+	cps = est->cps;
+	if (cps < (est->maxcps >> 4))
+		cps = est->maxcps >> 4;
+
+	lacr = idt77252_rate_logindex(card, cps);
+	if (lacr > vc->max_er)
+		lacr = vc->max_er;
+
+	if (lacr != vc->lacr) {
+		vc->lacr = lacr;
+		writel(TCMDQ_LACR|(vc->lacr << 16)|vc->index, SAR_REG_TCMDQ);
+	}
+
+	est->timer.expires = jiffies + ((HZ / 4) << est->interval);
+	add_timer(&est->timer);
+
+out:
+	spin_unlock_irqrestore(&vc->lock, flags);
+}
+
+static struct rate_estimator *
+idt77252_init_est(struct vc_map *vc, int pcr)
+{
+	struct rate_estimator *est;
+
+	est = kmalloc(sizeof(struct rate_estimator), GFP_KERNEL);
+	if (!est)
+		return NULL;
+	memset(est, 0, sizeof(*est));
+
+	est->maxcps = pcr < 0 ? -pcr : pcr;
+	est->cps = est->maxcps;
+	est->avcps = est->cps << 5;
+
+	est->interval = 2;		/* XXX: make this configurable */
+	est->ewma_log = 2;		/* XXX: make this configurable */
+	est->timer.data = (unsigned long)vc;
+	est->timer.function = idt77252_est_timer;
+	init_timer(&est->timer);
+
+	est->timer.expires = jiffies + ((HZ / 4) << est->interval);
+	add_timer(&est->timer);
+
+	return est;
+}
+
+static int
+idt77252_init_cbr(struct idt77252_dev *card, struct vc_map *vc,
+		  struct atm_vcc *vcc, struct atm_qos *qos)
+{
+	int tst_free, tst_used, tst_entries;
+	unsigned long tmpl, modl;
+	int tcr, tcra;
+
+	if ((qos->txtp.max_pcr == 0) &&
+	    (qos->txtp.pcr == 0) && (qos->txtp.min_pcr == 0)) {
+		printk("%s: trying to open a CBR VC with cell rate = 0\n",
+		       card->name);
+		return -EINVAL;
+	}
+
+	tst_used = 0;
+	tst_free = card->tst_free;
+	if (test_bit(VCF_TX, &vc->flags))
+		tst_used = vc->ntste;
+	tst_free += tst_used;
+
+	tcr = atm_pcr_goal(&qos->txtp);
+	tcra = tcr >= 0 ? tcr : -tcr;
+
+	TXPRINTK("%s: CBR target cell rate = %d\n", card->name, tcra);
+
+	tmpl = (unsigned long) tcra * ((unsigned long) card->tst_size - 2);
+	modl = tmpl % (unsigned long)card->utopia_pcr;
+
+	tst_entries = (int) (tmpl / card->utopia_pcr);
+	if (tcr > 0) {
+		if (modl > 0)
+			tst_entries++;
+	} else if (tcr == 0) {
+		tst_entries = tst_free - SAR_TST_RESERVED;
+		if (tst_entries <= 0) {
+			printk("%s: no CBR bandwidth free.\n", card->name);
+			return -ENOSR;
+		}
+	}
+
+	if (tst_entries == 0) {
+		printk("%s: selected CBR bandwidth < granularity.\n",
+		       card->name);
+		return -EINVAL;
+	}
+
+	if (tst_entries > (tst_free - SAR_TST_RESERVED)) {
+		printk("%s: not enough CBR bandwidth free.\n", card->name);
+		return -ENOSR;
+	}
+
+	vc->ntste = tst_entries;
+
+	card->tst_free = tst_free - tst_entries;
+	if (test_bit(VCF_TX, &vc->flags)) {
+		if (tst_used == tst_entries)
+			return 0;
+
+		OPRINTK("%s: modify %d -> %d entries in TST.\n",
+			card->name, tst_used, tst_entries);
+		change_tst(card, vc, tst_entries, TSTE_OPC_CBR);
+		return 0;
+	}
+
+	OPRINTK("%s: setting %d entries in TST.\n", card->name, tst_entries);
+	fill_tst(card, vc, tst_entries, TSTE_OPC_CBR);
+	return 0;
+}
+
+static int
+idt77252_init_ubr(struct idt77252_dev *card, struct vc_map *vc,
+		  struct atm_vcc *vcc, struct atm_qos *qos)
+{
+	unsigned long flags;
+	int tcr;
+
+	spin_lock_irqsave(&vc->lock, flags);
+	if (vc->estimator) {
+		del_timer(&vc->estimator->timer);
+		kfree(vc->estimator);
+		vc->estimator = NULL;
+	}
+	spin_unlock_irqrestore(&vc->lock, flags);
+
+	tcr = atm_pcr_goal(&qos->txtp);
+	if (tcr == 0)
+		tcr = card->link_pcr;
+
+	vc->estimator = idt77252_init_est(vc, tcr);
+
+	vc->class = SCHED_UBR;
+	vc->init_er = idt77252_rate_logindex(card, tcr);
+	vc->lacr = vc->init_er;
+	if (tcr < 0)
+		vc->max_er = vc->init_er;
+	else
+		vc->max_er = 0xff;
+
+	return 0;
+}
+
+static int
+idt77252_init_tx(struct idt77252_dev *card, struct vc_map *vc,
+		 struct atm_vcc *vcc, struct atm_qos *qos)
+{
+	int error;
+
+	if (test_bit(VCF_TX, &vc->flags))
+		return -EBUSY;
+
+	switch (qos->txtp.traffic_class) {
+		case ATM_CBR:
+			vc->class = SCHED_CBR;
+			break;
+
+		case ATM_UBR:
+			vc->class = SCHED_UBR;
+			break;
+
+		case ATM_VBR:
+		case ATM_ABR:
+		default:
+			return -EPROTONOSUPPORT;
+	}
+
+	vc->scq = alloc_scq(card, vc->class);
+	if (!vc->scq) {
+		printk("%s: can't get SCQ.\n", card->name);
+		return -ENOMEM;
+	}
+
+	vc->scq->scd = get_free_scd(card, vc);
+	if (vc->scq->scd == 0) {
+		printk("%s: no SCD available.\n", card->name);
+		free_scq(card, vc->scq);
+		return -ENOMEM;
+	}
+
+	fill_scd(card, vc->scq, vc->class);
+
+	if (set_tct(card, vc)) {
+		printk("%s: class %d not supported.\n",
+		       card->name, qos->txtp.traffic_class);
+
+		card->scd2vc[vc->scd_index] = NULL;
+		free_scq(card, vc->scq);
+		return -EPROTONOSUPPORT;
+	}
+
+	switch (vc->class) {
+		case SCHED_CBR:
+			error = idt77252_init_cbr(card, vc, vcc, qos);
+			if (error) {
+				card->scd2vc[vc->scd_index] = NULL;
+				free_scq(card, vc->scq);
+				return error;
+			}
+
+			clear_bit(VCF_IDLE, &vc->flags);
+			writel(TCMDQ_START | vc->index, SAR_REG_TCMDQ);
+			break;
+
+		case SCHED_UBR:
+			error = idt77252_init_ubr(card, vc, vcc, qos);
+			if (error) {
+				card->scd2vc[vc->scd_index] = NULL;
+				free_scq(card, vc->scq);
+				return error;
+			}
+
+			set_bit(VCF_IDLE, &vc->flags);
+			break;
+	}
+
+	vc->tx_vcc = vcc;
+	set_bit(VCF_TX, &vc->flags);
+	return 0;
+}
+
+static int
+idt77252_init_rx(struct idt77252_dev *card, struct vc_map *vc,
+		 struct atm_vcc *vcc, struct atm_qos *qos)
+{
+	unsigned long flags;
+	unsigned long addr;
+	u32 rcte = 0;
+
+	if (test_bit(VCF_RX, &vc->flags))
+		return -EBUSY;
+
+	vc->rx_vcc = vcc;
+	set_bit(VCF_RX, &vc->flags);
+
+	if ((vcc->vci == 3) || (vcc->vci == 4))
+		return 0;
+
+	flush_rx_pool(card, &vc->rcv.rx_pool);
+
+	rcte |= SAR_RCTE_CONNECTOPEN;
+	rcte |= SAR_RCTE_RAWCELLINTEN;
+
+	switch (qos->aal) {
+		case ATM_AAL0:
+			rcte |= SAR_RCTE_RCQ;
+			break;
+		case ATM_AAL1:
+			rcte |= SAR_RCTE_OAM; /* Let SAR drop Video */
+			break;
+		case ATM_AAL34:
+			rcte |= SAR_RCTE_AAL34;
+			break;
+		case ATM_AAL5:
+			rcte |= SAR_RCTE_AAL5;
+			break;
+		default:
+			rcte |= SAR_RCTE_RCQ;
+			break;
+	}
+
+	if (qos->aal != ATM_AAL5)
+		rcte |= SAR_RCTE_FBP_1;
+	else if (qos->rxtp.max_sdu > SAR_FB_SIZE_2)
+		rcte |= SAR_RCTE_FBP_3;
+	else if (qos->rxtp.max_sdu > SAR_FB_SIZE_1)
+		rcte |= SAR_RCTE_FBP_2;
+	else if (qos->rxtp.max_sdu > SAR_FB_SIZE_0)
+		rcte |= SAR_RCTE_FBP_1;
+	else
+		rcte |= SAR_RCTE_FBP_01;
+
+	addr = card->rct_base + (vc->index << 2);
+
+	OPRINTK("%s: writing RCT at 0x%lx\n", card->name, addr);
+	write_sram(card, addr, rcte);
+
+	spin_lock_irqsave(&card->cmd_lock, flags);
+	writel(SAR_CMD_OPEN_CONNECTION | (addr << 2), SAR_REG_CMD);
+	waitfor_idle(card);
+	spin_unlock_irqrestore(&card->cmd_lock, flags);
+
+	return 0;
+}
+
+static int
+idt77252_find_vcc(struct atm_vcc *vcc, short *vpi, int *vci)
+{
+	struct atm_vcc *walk;
+
+	if (*vpi == ATM_VPI_ANY) {
+		*vpi = 0;
+		walk = vcc->dev->vccs;
+		while (walk) {
+			if ((walk->vci == *vci) && (walk->vpi == *vpi)) {
+				(*vpi)++;
+				walk = vcc->dev->vccs;
+				continue;
+			}
+			walk = walk->next;
+		}
+	}
+
+	if (*vci == ATM_VCI_ANY) {
+		*vci = ATM_NOT_RSV_VCI;
+		walk = vcc->dev->vccs;
+		while (walk) {
+			if ((walk->vci == *vci) && (walk->vpi == *vpi)) {
+				(*vci)++;
+				walk = vcc->dev->vccs;
+				continue;
+			}
+			walk = walk->next;
+		}
+	}
+
+	return 0;
+}
+
+static int
+idt77252_open(struct atm_vcc *vcc, short vpi, int vci)
+{
+	struct atm_dev *dev = vcc->dev;
+	struct idt77252_dev *card = dev->dev_data;
+	struct vc_map *vc;
+	unsigned int index;
+	unsigned int inuse;
+	int error;
+
+	idt77252_find_vcc(vcc, &vpi, &vci);
+
+	if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC)
+		return 0;
+
+	if (vpi >= (1 << card->vpibits)) {
+		printk("%s: unsupported VPI: %d\n", card->name, vpi);
+		return -EINVAL;
+	}
+
+	if (vci >= (1 << card->vcibits)) {
+		printk("%s: unsupported VCI: %d\n", card->name, vci);
+		return -EINVAL;
+	}
+
+	vcc->vpi = vpi;
+	vcc->vci = vci;
+	set_bit(ATM_VF_ADDR, &vcc->flags);
+
+	down(&card->mutex);
+
+	OPRINTK("%s: opening vpi.vci: %d.%d\n", card->name, vpi, vci);
+
+	switch (vcc->qos.aal) {
+	case ATM_AAL0:
+	case ATM_AAL1:
+	case ATM_AAL5:
+		break;
+	default:
+		printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal);
+		up(&card->mutex);
+		return -EPROTONOSUPPORT;
+	}
+
+	index = VPCI2VC(card, vpi, vci);
+	if (!card->vcs[index]) {
+		card->vcs[index] = kmalloc(sizeof(struct vc_map), GFP_KERNEL);
+		if (!card->vcs[index]) {
+			printk("%s: can't alloc vc in open()\n", card->name);
+			up(&card->mutex);
+			return -ENOMEM;
+		}
+		memset(card->vcs[index], 0, sizeof(struct vc_map));
+
+		card->vcs[index]->card = card;
+		card->vcs[index]->index = index;
+
+		spin_lock_init(&card->vcs[index]->lock);
+	}
+	vc = card->vcs[index];
+
+	vcc->dev_data = vc;
+
+	IPRINTK("%s: idt77252_open: vc = %d (%d.%d) %s/%s (max RX SDU: %u)\n",
+	        card->name, vc->index, vcc->vpi, vcc->vci,
+	        vcc->qos.rxtp.traffic_class != ATM_NONE ? "rx" : "--",
+	        vcc->qos.txtp.traffic_class != ATM_NONE ? "tx" : "--",
+	        vcc->qos.rxtp.max_sdu);
+
+	inuse = 0;
+	if (vcc->qos.txtp.traffic_class != ATM_NONE &&
+	    test_bit(VCF_TX, &vc->flags))
+		inuse = 1;
+	if (vcc->qos.rxtp.traffic_class != ATM_NONE &&
+	    test_bit(VCF_RX, &vc->flags))
+		inuse += 2;
+
+	if (inuse) {
+		printk("%s: %s vci already in use.\n", card->name,
+		       inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx");
+		up(&card->mutex);
+		return -EADDRINUSE;
+	}
+
+	if (vcc->qos.txtp.traffic_class != ATM_NONE) {
+		error = idt77252_init_tx(card, vc, vcc, &vcc->qos);
+		if (error) {
+			up(&card->mutex);
+			return error;
+		}
+	}
+
+	if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
+		error = idt77252_init_rx(card, vc, vcc, &vcc->qos);
+		if (error) {
+			up(&card->mutex);
+			return error;
+		}
+	}
+
+	set_bit(ATM_VF_READY, &vcc->flags);
+	MOD_INC_USE_COUNT;
+
+	up(&card->mutex);
+	return 0;
+}
+
+static void
+idt77252_close(struct atm_vcc *vcc)
+{
+	struct atm_dev *dev = vcc->dev;
+	struct idt77252_dev *card = dev->dev_data;
+	struct vc_map *vc = vcc->dev_data;
+	unsigned long flags;
+	unsigned long addr;
+	int timeout;
+
+	down(&card->mutex);
+
+	IPRINTK("%s: idt77252_close: vc = %d (%d.%d)\n",
+		card->name, vc->index, vcc->vpi, vcc->vci);
+
+	clear_bit(ATM_VF_READY, &vcc->flags);
+
+	if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
+
+		spin_lock_irqsave(&vc->lock, flags);
+		clear_bit(VCF_RX, &vc->flags);
+		vc->rx_vcc = NULL;
+		spin_unlock_irqrestore(&vc->lock, flags);
+
+		if ((vcc->vci == 3) || (vcc->vci == 4))
+			goto done;
+
+		addr = card->rct_base + vc->index * SAR_SRAM_RCT_SIZE;
+
+		spin_lock_irqsave(&card->cmd_lock, flags);
+		writel(SAR_CMD_CLOSE_CONNECTION | (addr << 2), SAR_REG_CMD);
+		waitfor_idle(card);
+		spin_unlock_irqrestore(&card->cmd_lock, flags);
+
+		if (vc->rcv.rx_pool.count) {
+			DPRINTK("%s: closing a VC with pending rx buffers.\n",
+				card->name);
+
+			recycle_rx_pool_skb(card, &vc->rcv.rx_pool);
+		}
+	}
+
+done:
+	if (vcc->qos.txtp.traffic_class != ATM_NONE) {
+
+		spin_lock_irqsave(&vc->lock, flags);
+		clear_bit(VCF_TX, &vc->flags);
+		clear_bit(VCF_IDLE, &vc->flags);
+		clear_bit(VCF_RSV, &vc->flags);
+		vc->tx_vcc = NULL;
+
+		if (vc->estimator) {
+			del_timer(&vc->estimator->timer);
+			kfree(vc->estimator);
+			vc->estimator = NULL;
+		}
+		spin_unlock_irqrestore(&vc->lock, flags);
+
+		timeout = 5 * HZ;
+		while (atomic_read(&vc->scq->used) > 0) {
+			timeout = schedule_timeout(timeout);
+			if (!timeout)
+				break;
+		}
+		if (!timeout)
+			printk("%s: SCQ drain timeout: %u used\n",
+			       card->name, atomic_read(&vc->scq->used));
+
+		writel(TCMDQ_HALT | vc->index, SAR_REG_TCMDQ);
+		clear_scd(card, vc->scq, vc->class);
+
+		if (vc->class == SCHED_CBR) {
+			clear_tst(card, vc);
+			card->tst_free += vc->ntste;
+			vc->ntste = 0;
+		}
+
+		card->scd2vc[vc->scd_index] = NULL;
+		free_scq(card, vc->scq);
+	}
+
+	MOD_DEC_USE_COUNT;
+	up(&card->mutex);
+}
+
+static int
+idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags)
+{
+	struct atm_dev *dev = vcc->dev;
+	struct idt77252_dev *card = dev->dev_data;
+	struct vc_map *vc = vcc->dev_data;
+	int error = 0;
+
+	down(&card->mutex);
+
+	if (qos->txtp.traffic_class != ATM_NONE) {
+	    	if (!test_bit(VCF_TX, &vc->flags)) {
+			error = idt77252_init_tx(card, vc, vcc, qos);
+			if (error)
+				goto out;
+		} else {
+			switch (qos->txtp.traffic_class) {
+			case ATM_CBR:
+				error = idt77252_init_cbr(card, vc, vcc, qos);
+				if (error)
+					goto out;
+				break;
+
+			case ATM_UBR:
+				error = idt77252_init_ubr(card, vc, vcc, qos);
+				if (error)
+					goto out;
+
+				if (!test_bit(VCF_IDLE, &vc->flags)) {
+					writel(TCMDQ_LACR | (vc->lacr << 16) |
+					       vc->index, SAR_REG_TCMDQ);
+				}
+				break;
+
+			case ATM_VBR:
+			case ATM_ABR:
+				error = -EOPNOTSUPP;
+				goto out;
+			}
+		}
+	}
+
+	if ((qos->rxtp.traffic_class != ATM_NONE) &&
+	    !test_bit(VCF_RX, &vc->flags)) {
+		error = idt77252_init_rx(card, vc, vcc, qos);
+		if (error)
+			goto out;
+	}
+
+	memcpy(&vcc->qos, qos, sizeof(struct atm_qos));
+
+	set_bit(ATM_VF_HASQOS, &vcc->flags);
+
+out:
+	up(&card->mutex);
+	return error;
+}
+
+static int
+idt77252_proc_read(struct atm_dev *dev, loff_t * pos, char *page)
+{
+	struct idt77252_dev *card = dev->dev_data;
+	int i, left;
+
+	left = (int) *pos;
+	if (!left--)
+		return sprintf(page, "IDT77252 Interrupts:\n");
+	if (!left--)
+		return sprintf(page, "TSIF:  %lu\n", card->irqstat[15]);
+	if (!left--)
+		return sprintf(page, "TXICP: %lu\n", card->irqstat[14]);
+	if (!left--)
+		return sprintf(page, "TSQF:  %lu\n", card->irqstat[12]);
+	if (!left--)
+		return sprintf(page, "TMROF: %lu\n", card->irqstat[11]);
+	if (!left--)
+		return sprintf(page, "PHYI:  %lu\n", card->irqstat[10]);
+	if (!left--)
+		return sprintf(page, "FBQ3A: %lu\n", card->irqstat[8]);
+	if (!left--)
+		return sprintf(page, "FBQ2A: %lu\n", card->irqstat[7]);
+	if (!left--)
+		return sprintf(page, "RSQF:  %lu\n", card->irqstat[6]);
+	if (!left--)
+		return sprintf(page, "EPDU:  %lu\n", card->irqstat[5]);
+	if (!left--)
+		return sprintf(page, "RAWCF: %lu\n", card->irqstat[4]);
+	if (!left--)
+		return sprintf(page, "FBQ1A: %lu\n", card->irqstat[3]);
+	if (!left--)
+		return sprintf(page, "FBQ0A: %lu\n", card->irqstat[2]);
+	if (!left--)
+		return sprintf(page, "RSQAF: %lu\n", card->irqstat[1]);
+	if (!left--)
+		return sprintf(page, "IDT77252 Transmit Connection Table:\n");
+
+	for (i = 0; i < card->tct_size; i++) {
+		unsigned long tct;
+		struct atm_vcc *vcc;
+		struct vc_map *vc;
+		char *p;
+
+		vc = card->vcs[i];
+		if (!vc)
+			continue;
+
+		vcc = NULL;
+		if (vc->tx_vcc)
+			vcc = vc->tx_vcc;
+		if (!vcc)
+			continue;
+		if (left--)
+			continue;
+
+		p = page;
+		p += sprintf(p, "  %4u: %u.%u: ", i, vcc->vpi, vcc->vci);
+		tct = (unsigned long) (card->tct_base + i * SAR_SRAM_TCT_SIZE);
+
+		for (i = 0; i < 8; i++)
+			p += sprintf(p, " %08x", read_sram(card, tct + i));
+		p += sprintf(p, "\n");
+		return p - page;
+	}
+	return 0;
+}
+
+/*****************************************************************************/
+/*                                                                           */
+/* Interrupt handler                                                         */
+/*                                                                           */
+/*****************************************************************************/
+
+static void
+idt77252_collect_stat(struct idt77252_dev *card)
+{
+	u32 cdc, vpec, icc;
+
+	cdc = readl(SAR_REG_CDC);
+	vpec = readl(SAR_REG_VPEC);
+	icc = readl(SAR_REG_ICC);
+
+#ifdef	NOTDEF
+	printk("%s:", card->name);
+
+	if (cdc & 0x7f0000) {
+		char *s = "";
+
+		printk(" [");
+		if (cdc & (1 << 22)) {
+			printk("%sRM ID", s);
+			s = " | ";
+		}
+		if (cdc & (1 << 21)) {
+			printk("%sCON TAB", s);
+			s = " | ";
+		}
+		if (cdc & (1 << 20)) {
+			printk("%sNO FB", s);
+			s = " | ";
+		}
+		if (cdc & (1 << 19)) {
+			printk("%sOAM CRC", s);
+			s = " | ";
+		}
+		if (cdc & (1 << 18)) {
+			printk("%sRM CRC", s);
+			s = " | ";
+		}
+		if (cdc & (1 << 17)) {
+			printk("%sRM FIFO", s);
+			s = " | ";
+		}
+		if (cdc & (1 << 16)) {
+			printk("%sRX FIFO", s);
+			s = " | ";
+		}
+		printk("]");
+	}
+
+	printk(" CDC %04x, VPEC %04x, ICC: %04x\n",
+	       cdc & 0xffff, vpec & 0xffff, icc & 0xffff);
+#endif
+}
+
+static void
+idt77252_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
+{
+	struct idt77252_dev *card = dev_id;
+	u32 stat;
+
+	stat = readl(SAR_REG_STAT) & 0xffff;
+	if (!stat)	/* no interrupt for us */
+		return;
+
+	if (test_and_set_bit(IDT77252_BIT_INTERRUPT, &card->flags)) {
+		printk("%s: Re-entering irq_handler()\n", card->name);
+		goto out;
+	}
+
+	writel(stat, SAR_REG_STAT);	/* reset interrupt */
+
+	if (stat & SAR_STAT_TSIF) {	/* entry written to TSQ  */
+		INTPRINTK("%s: TSIF\n", card->name);
+		card->irqstat[15]++;
+		idt77252_tx(card);
+	}
+	if (stat & SAR_STAT_TXICP) {	/* Incomplete CS-PDU has  */
+		INTPRINTK("%s: TXICP\n", card->name);
+		card->irqstat[14]++;
+#ifdef CONFIG_ATM_IDT77252_DEBUG
+		idt77252_tx_dump(card);
+#endif
+	}
+	if (stat & SAR_STAT_TSQF) {	/* TSQ 7/8 full           */
+		INTPRINTK("%s: TSQF\n", card->name);
+		card->irqstat[12]++;
+		idt77252_tx(card);
+	}
+	if (stat & SAR_STAT_TMROF) {	/* Timer overflow         */
+		INTPRINTK("%s: TMROF\n", card->name);
+		card->irqstat[11]++;
+		idt77252_collect_stat(card);
+	}
+
+	if (stat & SAR_STAT_EPDU) {	/* Got complete CS-PDU    */
+		INTPRINTK("%s: EPDU\n", card->name);
+		card->irqstat[5]++;
+		idt77252_rx(card);
+	}
+	if (stat & SAR_STAT_RSQAF) {	/* RSQ is 7/8 full        */
+		INTPRINTK("%s: RSQAF\n", card->name);
+		card->irqstat[1]++;
+		idt77252_rx(card);
+	}
+	if (stat & SAR_STAT_RSQF) {	/* RSQ is full            */
+		INTPRINTK("%s: RSQF\n", card->name);
+		card->irqstat[6]++;
+		idt77252_rx(card);
+	}
+	if (stat & SAR_STAT_RAWCF) {	/* Raw cell received      */
+		INTPRINTK("%s: RAWCF\n", card->name);
+		card->irqstat[4]++;
+		idt77252_rx_raw(card);
+	}
+
+	if (stat & SAR_STAT_PHYI) {	/* PHY device interrupt   */
+		INTPRINTK("%s: PHYI", card->name);
+		card->irqstat[10]++;
+		if (card->atmdev->phy && card->atmdev->phy->interrupt)
+			card->atmdev->phy->interrupt(card->atmdev);
+	}
+
+	if (stat & (SAR_STAT_FBQ0A | SAR_STAT_FBQ1A |
+		    SAR_STAT_FBQ2A | SAR_STAT_FBQ3A)) {
+
+		writel(readl(SAR_REG_CFG) & ~(SAR_CFG_FBIE), SAR_REG_CFG);
+
+		INTPRINTK("%s: FBQA: %04x\n", card->name, stat);
+
+		if (stat & SAR_STAT_FBQ0A)
+			card->irqstat[2]++;
+		if (stat & SAR_STAT_FBQ1A)
+			card->irqstat[3]++;
+		if (stat & SAR_STAT_FBQ2A)
+			card->irqstat[7]++;
+		if (stat & SAR_STAT_FBQ3A)
+			card->irqstat[8]++;
+
+		queue_task(&card->tqueue, &tq_immediate);
+		mark_bh(IMMEDIATE_BH);
+	}
+
+out:
+	clear_bit(IDT77252_BIT_INTERRUPT, &card->flags);
+}
+
+static void
+idt77252_softint(void *dev_id)
+{
+	struct idt77252_dev *card = dev_id;
+	u32 stat;
+	int done;
+
+	for (done = 1; ; done = 1) {
+		stat = readl(SAR_REG_STAT) >> 16;
+
+		if ((stat & 0x0f) < SAR_FBQ0_HIGH) {
+			add_rx_skb(card, 0, SAR_FB_SIZE_0, 32);
+			done = 0;
+		}
+
+		stat >>= 4;
+		if ((stat & 0x0f) < SAR_FBQ1_HIGH) {
+			add_rx_skb(card, 1, SAR_FB_SIZE_1, 32);
+			done = 0;
+		}
+
+		stat >>= 4;
+		if ((stat & 0x0f) < SAR_FBQ2_HIGH) {
+			add_rx_skb(card, 2, SAR_FB_SIZE_2, 32);
+			done = 0;
+		}
+
+		stat >>= 4;
+		if ((stat & 0x0f) < SAR_FBQ3_HIGH) {
+			add_rx_skb(card, 3, SAR_FB_SIZE_3, 32);
+			done = 0;
+		}
+
+		if (done)
+			break;
+	}
+
+	writel(readl(SAR_REG_CFG) | SAR_CFG_FBIE, SAR_REG_CFG);
+}
+
+
+static int
+open_card_oam(struct idt77252_dev *card)
+{
+	unsigned long flags;
+	unsigned long addr;
+	struct vc_map *vc;
+	int vpi, vci;
+	int index;
+	u32 rcte;
+
+	for (vpi = 0; vpi < (1 << card->vpibits); vpi++) {
+		for (vci = 3; vci < 5; vci++) {
+			index = VPCI2VC(card, vpi, vci);
+
+			vc = kmalloc(sizeof(struct vc_map), GFP_KERNEL);
+			if (!vc) {
+				printk("%s: can't alloc vc\n", card->name);
+				return -ENOMEM;
+			}
+			memset(vc, 0, sizeof(struct vc_map));
+
+			vc->index = index;
+			card->vcs[index] = vc;
+
+			flush_rx_pool(card, &vc->rcv.rx_pool);
+
+			rcte = SAR_RCTE_CONNECTOPEN |
+			       SAR_RCTE_RAWCELLINTEN |
+			       SAR_RCTE_RCQ |
+			       SAR_RCTE_FBP_1;
+
+			addr = card->rct_base + (vc->index << 2);
+			write_sram(card, addr, rcte);
+
+			spin_lock_irqsave(&card->cmd_lock, flags);
+			writel(SAR_CMD_OPEN_CONNECTION | (addr << 2),
+			       SAR_REG_CMD);
+			waitfor_idle(card);
+			spin_unlock_irqrestore(&card->cmd_lock, flags);
+		}
+	}
+
+	return 0;
+}
+
+static void
+close_card_oam(struct idt77252_dev *card)
+{
+	unsigned long flags;
+	unsigned long addr;
+	struct vc_map *vc;
+	int vpi, vci;
+	int index;
+
+	for (vpi = 0; vpi < (1 << card->vpibits); vpi++) {
+		for (vci = 3; vci < 5; vci++) {
+			index = VPCI2VC(card, vpi, vci);
+			vc = card->vcs[index];
+
+			addr = card->rct_base + vc->index * SAR_SRAM_RCT_SIZE;
+
+			spin_lock_irqsave(&card->cmd_lock, flags);
+			writel(SAR_CMD_CLOSE_CONNECTION | (addr << 2),
+			       SAR_REG_CMD);
+			waitfor_idle(card);
+			spin_unlock_irqrestore(&card->cmd_lock, flags);
+
+			if (vc->rcv.rx_pool.count) {
+				DPRINTK("%s: closing a VC "
+					"with pending rx buffers.\n",
+					card->name);
+
+				recycle_rx_pool_skb(card, &vc->rcv.rx_pool);
+			}
+		}
+	}
+}
+
+static int
+open_card_ubr0(struct idt77252_dev *card)
+{
+	struct vc_map *vc;
+
+	vc = kmalloc(sizeof(struct vc_map), GFP_KERNEL);
+	if (!vc) {
+		printk("%s: can't alloc vc\n", card->name);
+		return -ENOMEM;
+	}
+	memset(vc, 0, sizeof(struct vc_map));
+	card->vcs[0] = vc;
+	vc->class = SCHED_UBR0;
+
+	vc->scq = alloc_scq(card, vc->class);
+	if (!vc->scq) {
+		printk("%s: can't get SCQ.\n", card->name);
+		return -ENOMEM;
+	}
+
+	card->scd2vc[0] = vc;
+	vc->scd_index = 0;
+	vc->scq->scd = card->scd_base;
+
+	fill_scd(card, vc->scq, vc->class);
+
+	write_sram(card, card->tct_base + 0, TCT_UBR | card->scd_base);
+	write_sram(card, card->tct_base + 1, 0);
+	write_sram(card, card->tct_base + 2, 0);
+	write_sram(card, card->tct_base + 3, 0);
+	write_sram(card, card->tct_base + 4, 0);
+	write_sram(card, card->tct_base + 5, 0);
+	write_sram(card, card->tct_base + 6, 0);
+	write_sram(card, card->tct_base + 7, TCT_FLAG_UBR);
+
+	clear_bit(VCF_IDLE, &vc->flags);
+	writel(TCMDQ_START | 0, SAR_REG_TCMDQ);
+	return 0;
+}
+
+static int
+idt77252_dev_open(struct idt77252_dev *card)
+{
+	u32 conf;
+
+	if (!test_bit(IDT77252_BIT_INIT, &card->flags)) {
+		printk("%s: SAR not yet initialized.\n", card->name);
+		return -1;
+	}
+
+	conf = SAR_CFG_RXPTH|	/* enable receive path                  */
+	    SAR_RX_DELAY |	/* interrupt on complete PDU		*/
+	    SAR_CFG_RAWIE |	/* interrupt enable on raw cells        */
+	    SAR_CFG_RQFIE |	/* interrupt on RSQ almost full         */
+	    SAR_CFG_TMOIE |	/* interrupt on timer overflow          */
+	    SAR_CFG_FBIE |	/* interrupt on low free buffers        */
+	    SAR_CFG_TXEN |	/* transmit operation enable            */
+	    SAR_CFG_TXINT |	/* interrupt on transmit status         */
+	    SAR_CFG_TXUIE |	/* interrupt on transmit underrun       */
+	    SAR_CFG_TXSFI |	/* interrupt on TSQ almost full         */
+	    SAR_CFG_PHYIE	/* enable PHY interrupts		*/
+	    ;
+
+#ifdef CONFIG_ATM_IDT77252_RCV_ALL
+	/* Test RAW cell receive. */
+	conf |= SAR_CFG_VPECA;
+#endif
+
+	writel(readl(SAR_REG_CFG) | conf, SAR_REG_CFG);
+
+	if (open_card_oam(card)) {
+		printk("%s: Error initializing OAM.\n", card->name);
+		return -1;
+	}
+
+	if (open_card_ubr0(card)) {
+		printk("%s: Error initializing UBR0.\n", card->name);
+		return -1;
+	}
+
+	IPRINTK("%s: opened IDT77252 ABR SAR.\n", card->name);
+	return 0;
+}
+
+void
+idt77252_dev_close(struct atm_dev *dev)
+{
+	struct idt77252_dev *card = dev->dev_data;
+	u32 conf;
+
+	close_card_oam(card);
+
+	conf = SAR_CFG_RXPTH |	/* enable receive path           */
+	    SAR_RX_DELAY |	/* interrupt on complete PDU     */
+	    SAR_CFG_RAWIE |	/* interrupt enable on raw cells */
+	    SAR_CFG_RQFIE |	/* interrupt on RSQ almost full  */
+	    SAR_CFG_TMOIE |	/* interrupt on timer overflow   */
+	    SAR_CFG_FBIE |	/* interrupt on low free buffers */
+	    SAR_CFG_TXEN |	/* transmit operation enable     */
+	    SAR_CFG_TXINT |	/* interrupt on transmit status  */
+	    SAR_CFG_TXUIE |	/* interrupt on xmit underrun    */
+	    SAR_CFG_TXSFI	/* interrupt on TSQ almost full  */
+	    ;
+
+	writel(readl(SAR_REG_CFG) & ~(conf), SAR_REG_CFG);
+
+	DIPRINTK("%s: closed IDT77252 ABR SAR.\n", card->name);
+}
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* Initialisation and Deinitialization of IDT77252                           */
+/*                                                                           */
+/*****************************************************************************/
+
+
+static void
+deinit_card(struct idt77252_dev *card)
+{
+	struct sk_buff *skb;
+	int i, j;
+
+	if (!test_bit(IDT77252_BIT_INIT, &card->flags)) {
+		printk("%s: SAR not yet initialized.\n", card->name);
+		return;
+	}
+	DIPRINTK("idt77252: deinitialize card %u\n", card->index);
+
+	writel(0, SAR_REG_CFG);
+
+	if (card->atmdev)
+		atm_dev_deregister(card->atmdev);
+
+	for (i = 0; i < 4; i++) {
+		for (j = 0; j < FBQ_SIZE; j++) {
+			skb = card->sbpool[i].skb[j];
+			if (skb) {
+				pci_unmap_single(card->pcidev,
+						 IDT77252_PRV_PADDR(skb),
+						 skb->end - skb->data,
+						 PCI_DMA_FROMDEVICE);
+				card->sbpool[i].skb[j] = NULL;
+				dev_kfree_skb(skb);
+			}
+		}
+	}
+
+	if (card->soft_tst)
+		vfree(card->soft_tst);
+
+	if (card->scd2vc)
+		vfree(card->scd2vc);
+
+	if (card->vcs)
+		vfree(card->vcs);
+
+	if (card->raw_cell_hnd) {
+		pci_free_consistent(card->pcidev, 2 * sizeof(u32),
+				    card->raw_cell_hnd, card->raw_cell_paddr);
+	}
+
+	if (card->rsq.base) {
+		DIPRINTK("%s: Release RSQ ...\n", card->name);
+		deinit_rsq(card);
+	}
+
+	if (card->tsq.base) {
+		DIPRINTK("%s: Release TSQ ...\n", card->name);
+		deinit_tsq(card);
+	}
+
+	DIPRINTK("idt77252: Release IRQ.\n");
+	free_irq(card->pcidev->irq, card);
+
+	for (i = 0; i < 4; i++) {
+		if (card->fbq[i])
+			iounmap((void *) card->fbq[i]);
+	}
+
+	if (card->membase)
+		iounmap((void *) card->membase);
+
+	clear_bit(IDT77252_BIT_INIT, &card->flags);
+	DIPRINTK("%s: Card deinitialized.\n", card->name);
+}
+
+
+static int __devinit
+init_sram(struct idt77252_dev *card)
+{
+	int i;
+
+	for (i = 0; i < card->sramsize; i += 4)
+		write_sram(card, (i >> 2), 0);
+
+	/* set SRAM layout for THIS card */
+	if (card->sramsize == (512 * 1024)) {
+		card->tct_base = SAR_SRAM_TCT_128_BASE;
+		card->tct_size = (SAR_SRAM_TCT_128_TOP - card->tct_base + 1)
+		    / SAR_SRAM_TCT_SIZE;
+		card->rct_base = SAR_SRAM_RCT_128_BASE;
+		card->rct_size = (SAR_SRAM_RCT_128_TOP - card->rct_base + 1)
+		    / SAR_SRAM_RCT_SIZE;
+		card->rt_base = SAR_SRAM_RT_128_BASE;
+		card->scd_base = SAR_SRAM_SCD_128_BASE;
+		card->scd_size = (SAR_SRAM_SCD_128_TOP - card->scd_base + 1)
+		    / SAR_SRAM_SCD_SIZE;
+		card->tst[0] = SAR_SRAM_TST1_128_BASE;
+		card->tst[1] = SAR_SRAM_TST2_128_BASE;
+		card->tst_size = SAR_SRAM_TST1_128_TOP - card->tst[0] + 1;
+		card->abrst_base = SAR_SRAM_ABRSTD_128_BASE;
+		card->abrst_size = SAR_ABRSTD_SIZE_8K;
+		card->fifo_base = SAR_SRAM_FIFO_128_BASE;
+		card->fifo_size = SAR_RXFD_SIZE_32K;
+	} else {
+		card->tct_base = SAR_SRAM_TCT_32_BASE;
+		card->tct_size = (SAR_SRAM_TCT_32_TOP - card->tct_base + 1)
+		    / SAR_SRAM_TCT_SIZE;
+		card->rct_base = SAR_SRAM_RCT_32_BASE;
+		card->rct_size = (SAR_SRAM_RCT_32_TOP - card->rct_base + 1)
+		    / SAR_SRAM_RCT_SIZE;
+		card->rt_base = SAR_SRAM_RT_32_BASE;
+		card->scd_base = SAR_SRAM_SCD_32_BASE;
+		card->scd_size = (SAR_SRAM_SCD_32_TOP - card->scd_base + 1)
+		    / SAR_SRAM_SCD_SIZE;
+		card->tst[0] = SAR_SRAM_TST1_32_BASE;
+		card->tst[1] = SAR_SRAM_TST2_32_BASE;
+		card->tst_size = (SAR_SRAM_TST1_32_TOP - card->tst[0] + 1);
+		card->abrst_base = SAR_SRAM_ABRSTD_32_BASE;
+		card->abrst_size = SAR_ABRSTD_SIZE_1K;
+		card->fifo_base = SAR_SRAM_FIFO_32_BASE;
+		card->fifo_size = SAR_RXFD_SIZE_4K;
+	}
+
+	/* Initialize TCT */
+	for (i = 0; i < card->tct_size; i++) {
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 0, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 1, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 2, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 3, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 4, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 5, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 6, 0);
+		write_sram(card, i * SAR_SRAM_TCT_SIZE + 7, 0);
+	}
+
+	/* Initialize RCT */
+	for (i = 0; i < card->rct_size; i++) {
+		write_sram(card, card->rct_base + i * SAR_SRAM_RCT_SIZE,
+				    (u32) SAR_RCTE_RAWCELLINTEN);
+		write_sram(card, card->rct_base + i * SAR_SRAM_RCT_SIZE + 1,
+				    (u32) 0);
+		write_sram(card, card->rct_base + i * SAR_SRAM_RCT_SIZE + 2,
+				    (u32) 0);
+		write_sram(card, card->rct_base + i * SAR_SRAM_RCT_SIZE + 3,
+				    (u32) 0xffffffff);
+	}
+
+	writel((SAR_FBQ0_LOW << 28) | 0x00000000 | 0x00000000 |
+	       (SAR_FB_SIZE_0 / 48), SAR_REG_FBQS0);
+	writel((SAR_FBQ1_LOW << 28) | 0x00000000 | 0x00000000 |
+	       (SAR_FB_SIZE_1 / 48), SAR_REG_FBQS1);
+	writel((SAR_FBQ2_LOW << 28) | 0x00000000 | 0x00000000 |
+	       (SAR_FB_SIZE_2 / 48), SAR_REG_FBQS2);
+	writel((SAR_FBQ3_LOW << 28) | 0x00000000 | 0x00000000 |
+	       (SAR_FB_SIZE_3 / 48), SAR_REG_FBQS3);
+
+	/* Initialize rate table  */
+	for (i = 0; i < 256; i++) {
+		write_sram(card, card->rt_base + i, log_to_rate[i]);
+	}
+
+	for (i = 0; i < 128; i++) {
+		unsigned int tmp;
+
+		tmp  = rate_to_log[(i << 2) + 0] << 0;
+		tmp |= rate_to_log[(i << 2) + 1] << 8;
+		tmp |= rate_to_log[(i << 2) + 2] << 16;
+		tmp |= rate_to_log[(i << 2) + 3] << 24;
+		write_sram(card, card->rt_base + 256 + i, tmp);
+	}
+
+#if 0 /* Fill RDF and AIR tables. */
+	for (i = 0; i < 128; i++) {
+		unsigned int tmp;
+
+		tmp = RDF[0][(i << 1) + 0] << 16;
+		tmp |= RDF[0][(i << 1) + 1] << 0;
+		write_sram(card, card->rt_base + 512 + i, tmp);
+	}
+
+	for (i = 0; i < 128; i++) {
+		unsigned int tmp;
+
+		tmp = AIR[0][(i << 1) + 0] << 16;
+		tmp |= AIR[0][(i << 1) + 1] << 0;
+		write_sram(card, card->rt_base + 640 + i, tmp);
+	}
+#endif
+
+	IPRINTK("%s: initialize rate table ...\n", card->name);
+	writel(card->rt_base << 2, SAR_REG_RTBL);
+
+	/* Initialize TSTs */
+	IPRINTK("%s: initialize TST ...\n", card->name);
+	card->tst_free = card->tst_size - 2;	/* last two are jumps */
+
+	for (i = card->tst[0]; i < card->tst[0] + card->tst_size - 2; i++)
+		write_sram(card, i, TSTE_OPC_VAR);
+	write_sram(card, i++, TSTE_OPC_JMP | (card->tst[0] << 2));
+	idt77252_sram_write_errors = 1;
+	write_sram(card, i++, TSTE_OPC_JMP | (card->tst[1] << 2));
+	idt77252_sram_write_errors = 0;
+	for (i = card->tst[1]; i < card->tst[1] + card->tst_size - 2; i++)
+		write_sram(card, i, TSTE_OPC_VAR);
+	write_sram(card, i++, TSTE_OPC_JMP | (card->tst[1] << 2));
+	idt77252_sram_write_errors = 1;
+	write_sram(card, i++, TSTE_OPC_JMP | (card->tst[0] << 2));
+	idt77252_sram_write_errors = 0;
+
+	card->tst_index = 0;
+	writel(card->tst[0] << 2, SAR_REG_TSTB);
+
+	/* Initialize ABRSTD and Receive FIFO */
+	IPRINTK("%s: initialize ABRSTD ...\n", card->name);
+	writel(card->abrst_size | (card->abrst_base << 2),
+	       SAR_REG_ABRSTD);
+
+	IPRINTK("%s: initialize receive fifo ...\n", card->name);
+	writel(card->fifo_size | (card->fifo_base << 2),
+	       SAR_REG_RXFD);
+
+	IPRINTK("%s: SRAM initialization complete.\n", card->name);
+	return 0;
+}
+
+static int __devinit
+init_card(struct atm_dev *dev)
+{
+	struct idt77252_dev *card = dev->dev_data;
+	struct pci_dev *pcidev = card->pcidev;
+	unsigned long tmpl, modl;
+	unsigned int linkrate, rsvdcr;
+	unsigned int tst_entries;
+	struct net_device *tmp;
+	char tname[10];
+
+	u32 size;
+	u_char pci_byte;
+	u32 conf;
+	int i, k;
+
+	if (test_bit(IDT77252_BIT_INIT, &card->flags)) {
+		printk("Error: SAR already initialized.\n");
+		return -1;
+	}
+
+/*****************************************************************/
+/*   P C I   C O N F I G U R A T I O N                           */
+/*****************************************************************/
+
+	/* Set PCI Retry-Timeout and TRDY timeout */
+	IPRINTK("%s: Checking PCI retries.\n", card->name);
+	if (pci_read_config_byte(pcidev, 0x40, &pci_byte) != 0) {
+		printk("%s: can't read PCI retry timeout.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	if (pci_byte != 0) {
+		IPRINTK("%s: PCI retry timeout: %d, set to 0.\n",
+			card->name, pci_byte);
+		if (pci_write_config_byte(pcidev, 0x40, 0) != 0) {
+			printk("%s: can't set PCI retry timeout.\n",
+			       card->name);
+			deinit_card(card);
+			return -1;
+		}
+	}
+	IPRINTK("%s: Checking PCI TRDY.\n", card->name);
+	if (pci_read_config_byte(pcidev, 0x41, &pci_byte) != 0) {
+		printk("%s: can't read PCI TRDY timeout.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	if (pci_byte != 0) {
+		IPRINTK("%s: PCI TRDY timeout: %d, set to 0.\n",
+		        card->name, pci_byte);
+		if (pci_write_config_byte(pcidev, 0x41, 0) != 0) {
+			printk("%s: can't set PCI TRDY timeout.\n", card->name);
+			deinit_card(card);
+			return -1;
+		}
+	}
+	/* Reset Timer register */
+	if (readl(SAR_REG_STAT) & SAR_STAT_TMROF) {
+		printk("%s: resetting timer overflow.\n", card->name);
+		writel(SAR_STAT_TMROF, SAR_REG_STAT);
+	}
+	IPRINTK("%s: Request IRQ ... ", card->name);
+	if (request_irq(pcidev->irq, idt77252_interrupt, SA_INTERRUPT|SA_SHIRQ,
+			card->name, card) != 0) {
+		printk("%s: can't allocate IRQ.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	IPRINTK("got %d.\n", pcidev->irq);
+
+/*****************************************************************/
+/*   C H E C K   A N D   I N I T   S R A M                       */
+/*****************************************************************/
+
+	IPRINTK("%s: Initializing SRAM\n", card->name);
+
+	/* preset size of connecton table, so that init_sram() knows about it */
+	conf =	SAR_CFG_TX_FIFO_SIZE_9 |	/* Use maximum fifo size */
+		SAR_CFG_RXSTQ_SIZE_8k |		/* Receive Status Queue is 8k */
+		SAR_CFG_IDLE_CLP |		/* Set CLP on idle cells */
+#ifndef CONFIG_ATM_IDT77252_SEND_IDLE
+		SAR_CFG_NO_IDLE |		/* Do not send idle cells */
+#endif
+		0;
+
+	if (card->sramsize == (512 * 1024))
+		conf |= SAR_CFG_CNTBL_1k;
+	else
+		conf |= SAR_CFG_CNTBL_512;
+
+	switch (vpibits) {
+	case 0:
+		conf |= SAR_CFG_VPVCS_0;
+		break;
+	default:
+	case 1:
+		conf |= SAR_CFG_VPVCS_1;
+		break;
+	case 2:
+		conf |= SAR_CFG_VPVCS_2;
+		break;
+	case 8:
+		conf |= SAR_CFG_VPVCS_8;
+		break;
+	}
+
+	writel(readl(SAR_REG_CFG) | conf, SAR_REG_CFG);
+
+	if (init_sram(card) < 0)
+		return -1;
+
+/********************************************************************/
+/*  A L L O C   R A M   A N D   S E T   V A R I O U S   T H I N G S */
+/********************************************************************/
+	/* Initialize TSQ */
+	if (0 != init_tsq(card)) {
+		deinit_card(card);
+		return -1;
+	}
+	/* Initialize RSQ */
+	if (0 != init_rsq(card)) {
+		deinit_card(card);
+		return -1;
+	}
+
+	card->vpibits = vpibits;
+	if (card->sramsize == (512 * 1024)) {
+		card->vcibits = 10 - card->vpibits;
+	} else {
+		card->vcibits = 9 - card->vpibits;
+	}
+
+	card->vcimask = 0;
+	for (k = 0, i = 1; k < card->vcibits; k++) {
+		card->vcimask |= i;
+		i <<= 1;
+	}
+
+	IPRINTK("%s: Setting VPI/VCI mask to zero.\n", card->name);
+	writel(0, SAR_REG_VPM);
+
+	/* Little Endian Order   */
+	writel(0, SAR_REG_GP);
+
+	/* Initialize RAW Cell Handle Register  */
+	card->raw_cell_hnd = pci_alloc_consistent(card->pcidev, 2 * sizeof(u32),
+						  &card->raw_cell_paddr);
+	if (!card->raw_cell_hnd) {
+		printk("%s: memory allocation failure.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	memset(card->raw_cell_hnd, 0, 2 * sizeof(u32));
+	writel(card->raw_cell_paddr, SAR_REG_RAWHND);
+	IPRINTK("%s: raw cell handle is at 0x%p.\n", card->name,
+		card->raw_cell_hnd);
+
+	size = sizeof(struct vc_map *) * card->tct_size;
+	IPRINTK("%s: allocate %d byte for VC map.\n", card->name, size);
+	if (NULL == (card->vcs = vmalloc(size))) {
+		printk("%s: memory allocation failure.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	memset(card->vcs, 0, size);
+
+	size = sizeof(struct vc_map *) * card->scd_size;
+	IPRINTK("%s: allocate %d byte for SCD to VC mapping.\n",
+	        card->name, size);
+	if (NULL == (card->scd2vc = vmalloc(size))) {
+		printk("%s: memory allocation failure.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	memset(card->scd2vc, 0, size);
+
+	size = sizeof(struct tst_info) * (card->tst_size - 2);
+	IPRINTK("%s: allocate %d byte for TST to VC mapping.\n",
+		card->name, size);
+	if (NULL == (card->soft_tst = vmalloc(size))) {
+		printk("%s: memory allocation failure.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	for (i = 0; i < card->tst_size - 2; i++) {
+		card->soft_tst[i].tste = TSTE_OPC_VAR;
+		card->soft_tst[i].vc = NULL;
+	}
+
+	if (dev->phy == NULL) {
+		printk("%s: No LT device defined.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	if (dev->phy->ioctl == NULL) {
+		printk("%s: LT had no IOCTL funtion defined.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+
+#ifdef	CONFIG_ATM_IDT77252_USE_SUNI
+	/*
+	 * this is a jhs hack to get around special functionality in the
+	 * phy driver for the atecom hardware; the functionality doesn't
+	 * exist in the linux atm suni driver
+	 *
+	 * it isn't the right way to do things, but as the guy from NIST
+	 * said, talking about their measurement of the fine structure
+	 * constant, "it's good enough for government work."
+	 */
+	linkrate = 149760000;
+#endif
+
+	card->link_pcr = (linkrate / 8 / 53);
+	printk("%s: Linkrate on ATM line : %u bit/s, %u cell/s.\n",
+	       card->name, linkrate, card->link_pcr);
+
+#ifdef CONFIG_ATM_IDT77252_SEND_IDLE
+	card->utopia_pcr = card->link_pcr;
+#else
+	card->utopia_pcr = (160000000 / 8 / 54);
+#endif
+
+	rsvdcr = 0;
+	if (card->utopia_pcr > card->link_pcr)
+		rsvdcr = card->utopia_pcr - card->link_pcr;
+
+	tmpl = (unsigned long) rsvdcr * ((unsigned long) card->tst_size - 2);
+	modl = tmpl % (unsigned long)card->utopia_pcr;
+	tst_entries = (int) (tmpl / (unsigned long)card->utopia_pcr);
+	if (modl)
+		tst_entries++;
+	card->tst_free -= tst_entries;
+	fill_tst(card, NULL, tst_entries, TSTE_OPC_NULL);
+
+#ifdef HAVE_EEPROM
+	idt77252_eeprom_init(card);
+	printk("%s: EEPROM: %02x:", card->name,
+		idt77252_eeprom_read_status(card));
+
+	for (i = 0; i < 0x80; i++) {
+		printk(" %02x", 
+		idt77252_eeprom_read_byte(card, i)
+		);
+	}
+	printk("\n");
+#endif /* HAVE_EEPROM */
+
+	/*
+	 * XXX: <hack>
+	 */
+	sprintf(tname, "eth%d", card->index);
+	tmp = dev_get_by_name(tname);	/* jhs: was "tmp = dev_get(tname);" */
+	if (tmp) {
+		memcpy(card->atmdev->esi, tmp->dev_addr, 6);
+
+		printk("%s: ESI %02x:%02x:%02x:%02x:%02x:%02x\n",
+		       card->name, card->atmdev->esi[0], card->atmdev->esi[1],
+		       card->atmdev->esi[2], card->atmdev->esi[3],
+		       card->atmdev->esi[4], card->atmdev->esi[5]);
+	}
+	/*
+	 * XXX: </hack>
+	 */
+
+	/* Set Maximum Deficit Count for now. */
+	writel(0xffff, SAR_REG_MDFCT);
+
+	set_bit(IDT77252_BIT_INIT, &card->flags);
+
+	XPRINTK("%s: IDT77252 ABR SAR initialization complete.\n", card->name);
+	return 0;
+}
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* Probing of IDT77252 ABR SAR                                               */
+/*                                                                           */
+/*****************************************************************************/
+
+
+static int __devinit
+idt77252_preset(struct idt77252_dev *card)
+{
+	u16 pci_command;
+
+/*****************************************************************/
+/*   P C I   C O N F I G U R A T I O N                           */
+/*****************************************************************/
+
+	XPRINTK("%s: Enable PCI master and memory access for SAR.\n",
+		card->name);
+	if (pci_read_config_word(card->pcidev, PCI_COMMAND, &pci_command)) {
+		printk("%s: can't read PCI_COMMAND.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+	if (!(pci_command & PCI_COMMAND_IO)) {
+		printk("%s: PCI_COMMAND: %04x (???)\n",
+		       card->name, pci_command);
+		deinit_card(card);
+		return (-1);
+	}
+	pci_command |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
+	if (pci_write_config_word(card->pcidev, PCI_COMMAND, pci_command)) {
+		printk("%s: can't write PCI_COMMAND.\n", card->name);
+		deinit_card(card);
+		return -1;
+	}
+/*****************************************************************/
+/*   G E N E R I C   R E S E T                                   */
+/*****************************************************************/
+
+	/* Software reset */
+	writel(SAR_CFG_SWRST, SAR_REG_CFG);
+	mdelay(1);
+	writel(0, SAR_REG_CFG);
+
+	IPRINTK("%s: Software resetted.\n", card->name);
+	return 0;
+}
+
+
+static unsigned long __devinit
+probe_sram(struct idt77252_dev *card)
+{
+	u32 data, addr;
+
+	writel(0, SAR_REG_DR0);
+	writel(SAR_CMD_WRITE_SRAM | (0 << 2), SAR_REG_CMD);
+
+	for (addr = 0x4000; addr < 0x80000; addr += 0x4000) {
+		writel(0xdeadbeef, SAR_REG_DR0);
+		writel(SAR_CMD_WRITE_SRAM | (addr << 2), SAR_REG_CMD);
+
+		writel(SAR_CMD_READ_SRAM | (0 << 2), SAR_REG_CMD);
+		data = readl(SAR_REG_DR0);
+
+		if (data != 0)
+			break;
+	}
+
+	return addr * sizeof(u32);
+}
+
+static int __devinit
+idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
+{
+	static struct idt77252_dev **last = &idt77252_chain;
+	static int index = 0;
+
+	unsigned long membase, srambase;
+	struct idt77252_dev *card;
+	struct atm_dev *dev;
+	ushort revision = 0;
+	int i;
+
+
+	if (pci_read_config_word(pcidev, PCI_REVISION_ID, &revision)) {
+		printk("idt77252-%d: can't read PCI_REVISION_ID\n", index);
+		return -ENODEV;
+	}
+
+	card = kmalloc(sizeof(struct idt77252_dev), GFP_KERNEL);
+	if (!card) {
+		printk("idt77252-%d: can't allocate private data\n", index);
+		return -ENOMEM;
+	}
+	memset(card, 0, sizeof(struct idt77252_dev));
+
+	card->revision = revision;
+	card->index = index;
+	card->pcidev = pcidev;
+	sprintf(card->name, "idt77252-%d", card->index);
+
+	card->tqueue.routine = idt77252_softint;
+	card->tqueue.data = (void *)card;
+
+	membase = pci_resource_start(pcidev, 1);
+	srambase = pci_resource_start(pcidev, 2);
+
+	init_MUTEX(&card->mutex);
+	spin_lock_init(&card->cmd_lock);
+	spin_lock_init(&card->tst_lock);
+
+	card->tst_timer.data = (unsigned long)card;
+	card->tst_timer.function = tst_timer;
+	init_timer(&card->tst_timer);
+
+	/* Do the I/O remapping... */
+	card->membase = (unsigned long) ioremap(membase, 1024);
+	if (!card->membase) {
+		printk("%s: can't ioremap() membase\n", card->name);
+		kfree(card);
+		return -EIO;
+	}
+
+	if (idt77252_preset(card)) {
+		printk("%s: preset failed\n", card->name);
+		iounmap((void *) card->membase);
+		kfree(card);
+		return -EIO;
+	}
+
+	dev = atm_dev_register("idt77252", &idt77252_ops, -1, 0);
+	if (!dev) {
+		printk("%s: can't register atm device\n", card->name);
+		iounmap((void *) card->membase);
+		kfree(card);
+		return -EIO;
+	}
+	dev->dev_data = card;
+	card->atmdev = dev;
+
+#ifdef	CONFIG_ATM_IDT77252_USE_SUNI
+	suni_init(dev);
+	if (!dev->phy) {
+		printk("%s: can't init SUNI\n", card->name);
+		deinit_card(card);
+		kfree(card);
+		return -EIO;
+	}
+#endif	/* CONFIG_ATM_IDT77252_USE_SUNI */
+
+	card->sramsize = probe_sram(card);
+
+	for (i = 0; i < 4; i++) {
+		card->fbq[i] = (unsigned long)
+			    ioremap(srambase | 0x200000 | (i << 18), 4);
+		if (!card->fbq[i]) {
+			printk("%s: can't ioremap() FBQ%d\n", card->name, i);
+			deinit_card(card);
+			kfree(card);
+			return -EIO;
+		}
+	}
+
+	printk("%s: ABR SAR (Rev %c): MEM %08lx SRAM %08lx [%u KB]\n",
+	       card->name, ((revision > 1) && (revision < 25)) ?
+	       'A' + revision - 1 : '?', membase, srambase,
+	       card->sramsize / 1024);
+
+	if (init_card(dev)) {
+		printk("%s: init_card failed\n", card->name);
+		deinit_card(card);
+		kfree(card);
+		return -EIO;
+	}
+
+	dev->ci_range.vpi_bits = card->vpibits;
+	dev->ci_range.vci_bits = card->vcibits;
+	dev->link_rate = card->link_pcr;
+
+	if (dev->phy->start)
+		dev->phy->start(dev);
+
+	if (idt77252_dev_open(card)) {
+		printk("%s: dev_open failed\n", card->name);
+
+		if (dev->phy->stop)
+			dev->phy->stop(dev);
+		deinit_card(card);
+		kfree(card);
+		return -EIO;
+	}
+
+	*last = card;
+	last = &card->next;
+	index++;
+
+	return 0;
+}
+
+static struct pci_device_id idt77252_pci_tbl[] __devinitdata =
+{
+	{ PCI_VENDOR_ID_IDT, PCI_DEVICE_ID_IDT_IDT77252,
+	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{ 0, }
+};
+
+static struct pci_driver idt77252_driver = {
+	name:		"idt77252",
+	id_table:	idt77252_pci_tbl,
+	probe:		idt77252_init_one,
+};
+
+static int __init idt77252_init(void)
+{
+	struct sk_buff *skb;
+
+	printk("%s: at %p\n", __FUNCTION__, idt77252_init);
+
+	if (sizeof(skb->cb) < sizeof(struct atm_skb_data) +
+			      sizeof(struct idt77252_skb_prv)) {
+		printk(KERN_ERR "%s: skb->cb is too small (%lu < %lu)\n",
+		       __FUNCTION__, (unsigned long) sizeof(skb->cb),
+		       (unsigned long) sizeof(struct atm_skb_data) +
+				       sizeof(struct idt77252_skb_prv));
+		return -EIO;
+	}
+
+	if (pci_register_driver(&idt77252_driver) > 0)
+		return 0;
+
+	pci_unregister_driver(&idt77252_driver);
+	return -ENODEV;
+}
+
+static void __exit idt77252_exit(void)
+{
+	struct idt77252_dev *card;
+	struct atm_dev *dev;
+
+	pci_unregister_driver(&idt77252_driver);
+
+	while (idt77252_chain) {
+		card = idt77252_chain;
+		dev = card->atmdev;
+		idt77252_chain = card->next;
+
+		if (dev->phy->stop)
+			dev->phy->stop(dev);
+		deinit_card(card);
+		kfree(card);
+	}
+
+	DIPRINTK("idt77252: finished cleanup-module().\n");
+}
+
+module_init(idt77252_init);
+module_exit(idt77252_exit);
+
+EXPORT_NO_SYMBOLS;
+MODULE_LICENSE("GPL");
+
+MODULE_PARM(vpibits, "i");
+MODULE_PARM_DESC(vpibits, "number of VPI bits supported (0, 1, or 2)");
+#ifdef CONFIG_ATM_IDT77252_DEBUG
+MODULE_PARM(debug, "i");
+MODULE_PARM_DESC(debug,   "debug bitmap, see drivers/atm/idt77252.h");
+#endif
+
+MODULE_AUTHOR("Eddie C. Dost <ecd@atecom.com>");
+MODULE_DESCRIPTION("IDT77252 ABR SAR Driver");
diff -u --recursive --new-file v2.4.14/linux/drivers/atm/idt77252.h linux/drivers/atm/idt77252.h
--- v2.4.14/linux/drivers/atm/idt77252.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/atm/idt77252.h	Tue Nov 13 09:19:41 2001
@@ -0,0 +1,818 @@
+/******************************************************************* 
+ * ident "$Id: idt77252.h,v 1.2 2001/11/11 08:13:54 ecd Exp $"
+ *
+ * $Author: ecd $
+ * $Date: 2001/11/11 08:13:54 $
+ *
+ * Copyright (c) 2000 ATecoM GmbH 
+ *
+ * The author may be reached at ecd@atecom.com.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ * THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR   IMPLIED
+ * WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ * NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT,  INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ * USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *******************************************************************/
+
+#ifndef _IDT77252_H
+#define _IDT77252_H 1
+
+
+#include <linux/ptrace.h>
+#include <linux/skbuff.h>
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* Makros                                                                    */
+/*                                                                           */
+/*****************************************************************************/
+#define VPCI2VC(card, vpi, vci) \
+        (((vpi) << card->vcibits) | ((vci) & card->vcimask))
+
+/*****************************************************************************/
+/*                                                                           */
+/*   DEBUGGING definitions                                                   */
+/*                                                                           */
+/*****************************************************************************/
+
+#define DBG_RAW_CELL	0x00000400
+#define DBG_TINY	0x00000200
+#define DBG_GENERAL     0x00000100
+#define DBG_XGENERAL    0x00000080
+#define DBG_INIT        0x00000040
+#define DBG_DEINIT      0x00000020
+#define DBG_INTERRUPT   0x00000010
+#define DBG_OPEN_CONN   0x00000008
+#define DBG_CLOSE_CONN  0x00000004
+#define DBG_RX_DATA     0x00000002
+#define DBG_TX_DATA     0x00000001
+
+#ifdef CONFIG_ATM_IDT77252_DEBUG
+
+#define CPRINTK(args...)   do { if (debug & DBG_CLOSE_CONN) printk(args); } while(0)
+#define OPRINTK(args...)   do { if (debug & DBG_OPEN_CONN)  printk(args); } while(0)
+#define IPRINTK(args...)   do { if (debug & DBG_INIT)       printk(args); } while(0)
+#define INTPRINTK(args...) do { if (debug & DBG_INTERRUPT)  printk(args); } while(0)
+#define DIPRINTK(args...)  do { if (debug & DBG_DEINIT)     printk(args); } while(0)
+#define TXPRINTK(args...)  do { if (debug & DBG_TX_DATA)    printk(args); } while(0)
+#define RXPRINTK(args...)  do { if (debug & DBG_RX_DATA)    printk(args); } while(0)
+#define XPRINTK(args...)   do { if (debug & DBG_XGENERAL)   printk(args); } while(0)
+#define DPRINTK(args...)   do { if (debug & DBG_GENERAL)    printk(args); } while(0)
+#define NPRINTK(args...)   do { if (debug & DBG_TINY)	    printk(args); } while(0)
+#define RPRINTK(args...)   do { if (debug & DBG_RAW_CELL)   printk(args); } while(0)
+
+#else
+
+#define CPRINTK(args...)	do { } while(0)
+#define OPRINTK(args...)	do { } while(0)
+#define IPRINTK(args...)	do { } while(0)
+#define INTPRINTK(args...)	do { } while(0)
+#define DIPRINTK(args...)	do { } while(0)
+#define TXPRINTK(args...)	do { } while(0)
+#define RXPRINTK(args...)	do { } while(0)
+#define XPRINTK(args...)	do { } while(0)
+#define DPRINTK(args...)	do { } while(0)
+#define NPRINTK(args...)	do { } while(0)
+#define RPRINTK(args...)	do { } while(0)
+
+#endif
+
+#define SCHED_UBR0		0
+#define SCHED_UBR		1
+#define SCHED_VBR		2
+#define SCHED_ABR		3
+#define SCHED_CBR		4
+
+#define SCQFULL_TIMEOUT		HZ
+
+/*****************************************************************************/
+/*                                                                           */
+/*   Free Buffer Queue Layout                                                */
+/*                                                                           */
+/*****************************************************************************/
+#define SAR_FB_SIZE_0		(2048 - 256)
+#define SAR_FB_SIZE_1		(4096 - 256)
+#define SAR_FB_SIZE_2		(8192 - 256)
+#define SAR_FB_SIZE_3		(16384 - 256)
+
+#define SAR_FBQ0_LOW		4
+#define SAR_FBQ0_HIGH		8
+#define SAR_FBQ1_LOW		2
+#define SAR_FBQ1_HIGH		4
+#define SAR_FBQ2_LOW		1
+#define SAR_FBQ2_HIGH		2
+#define SAR_FBQ3_LOW		1
+#define SAR_FBQ3_HIGH		2
+
+#if 0
+#define SAR_TST_RESERVED	44	/* Num TST reserved for UBR/ABR/VBR */
+#else
+#define SAR_TST_RESERVED	0	/* Num TST reserved for UBR/ABR/VBR */
+#endif
+
+#define TCT_CBR			0x00000000
+#define TCT_UBR			0x00000000
+#define TCT_VBR			0x40000000
+#define TCT_ABR			0x80000000
+#define TCT_TYPE		0xc0000000
+
+#define TCT_RR			0x20000000
+#define TCT_LMCR		0x08000000
+#define TCT_SCD_MASK		0x0007ffff
+
+#define TCT_TSIF		0x00004000
+#define TCT_HALT		0x80000000
+#define TCT_IDLE		0x40000000
+#define TCT_FLAG_UBR		0x80000000
+
+/*****************************************************************************/
+/*                                                                           */
+/*   Structure describing an IDT77252                                        */
+/*                                                                           */
+/*****************************************************************************/
+
+struct scqe
+{
+	u32		word_1;
+	u32		word_2;
+	u32		word_3;
+	u32		word_4;
+};
+
+#define SCQ_ENTRIES	64
+#define SCQ_SIZE	(SCQ_ENTRIES * sizeof(struct scqe))
+#define SCQ_MASK	(SCQ_SIZE - 1)
+
+struct scq_info
+{
+	struct scqe		*base;
+	struct scqe		*next;
+	struct scqe		*last;
+	dma_addr_t		paddr;
+	spinlock_t		lock;
+	atomic_t		used;
+	unsigned long		trans_start;
+        unsigned long		scd;
+	spinlock_t		skblock;
+	struct sk_buff_head	transmit;
+	struct sk_buff_head	pending;
+};
+
+struct rx_pool {
+	struct sk_buff		*first;
+	struct sk_buff		**last;
+	unsigned int		len;
+	unsigned int		count;
+};
+
+struct aal1 {
+	unsigned int		total;
+	unsigned int		count;
+	struct sk_buff		*data;
+	unsigned char		sequence;
+};
+
+struct rate_estimator {
+	struct timer_list	timer;
+	unsigned int		interval;
+	unsigned int		ewma_log;
+	u64			cells;
+	u64			last_cells;
+	long			avcps;
+	u32			cps;
+	u32			maxcps;
+};
+
+struct vc_map {
+	unsigned int		index;
+	unsigned long		flags;
+#define VCF_TX		0
+#define VCF_RX		1
+#define VCF_IDLE	2
+#define VCF_RSV		3
+	unsigned int		class;
+	u8			init_er;
+	u8			lacr;
+	u8			max_er;
+	unsigned int		ntste;
+	spinlock_t		lock;
+	struct atm_vcc		*tx_vcc;
+	struct atm_vcc		*rx_vcc;
+	struct idt77252_dev	*card;
+	struct scq_info		*scq;		/* To keep track of the SCQ */
+	struct rate_estimator	*estimator;
+	int			scd_index;
+	union {
+		struct rx_pool	rx_pool;
+		struct aal1	aal1;
+	} rcv;
+};
+
+/*****************************************************************************/
+/*                                                                           */
+/*   RCTE - Receive Connection Table Entry                                   */
+/*                                                                           */
+/*****************************************************************************/
+
+struct rct_entry
+{
+	u32		word_1;
+	u32		buffer_handle;
+	u32		dma_address;
+	u32		aal5_crc32;
+};
+
+/*****************************************************************************/
+/*                                                                           */
+/*   RSQ - Receive Status Queue                                              */
+/*                                                                           */
+/*****************************************************************************/
+
+#define SAR_RSQE_VALID      0x80000000
+#define SAR_RSQE_IDLE       0x40000000
+#define SAR_RSQE_BUF_MASK   0x00030000
+#define SAR_RSQE_BUF_ASGN   0x00008000
+#define SAR_RSQE_NZGFC      0x00004000
+#define SAR_RSQE_EPDU       0x00002000
+#define SAR_RSQE_BUF_CONT   0x00001000
+#define SAR_RSQE_EFCIE      0x00000800
+#define SAR_RSQE_CLP        0x00000400
+#define SAR_RSQE_CRC        0x00000200
+#define SAR_RSQE_CELLCNT    0x000001FF
+
+
+#define RSQSIZE            8192
+#define RSQ_NUM_ENTRIES    (RSQSIZE / 16)
+#define RSQ_ALIGNMENT      8192
+
+struct rsq_entry {
+	u32			word_1;
+	u32			word_2;
+	u32			word_3;
+	u32			word_4;
+};
+
+struct rsq_info {
+	struct rsq_entry	*base;
+	struct rsq_entry	*next;
+	struct rsq_entry	*last;
+	dma_addr_t		paddr;
+} rsq_info;
+
+
+/*****************************************************************************/
+/*                                                                           */
+/*   TSQ - Transmit Status Queue                                             */
+/*                                                                           */
+/*****************************************************************************/
+
+#define SAR_TSQE_INVALID         0x80000000
+#define SAR_TSQE_TIMESTAMP       0x00FFFFFF
+#define SAR_TSQE_TYPE		 0x60000000
+#define SAR_TSQE_TYPE_TIMER      0x00000000
+#define SAR_TSQE_TYPE_TSR        0x20000000
+#define SAR_TSQE_TYPE_IDLE       0x40000000
+#define SAR_TSQE_TYPE_TBD_COMP   0x60000000
+
+#define SAR_TSQE_TAG(stat)	(((stat) >> 24) & 0x1f)
+
+#define TSQSIZE            8192
+#define TSQ_NUM_ENTRIES    1024
+#define TSQ_ALIGNMENT      8192
+
+struct tsq_entry
+{
+	u32			word_1;
+	u32			word_2;
+};
+
+struct tsq_info
+{
+	struct tsq_entry	*base;
+	struct tsq_entry	*next;
+	struct tsq_entry	*last;
+	dma_addr_t		paddr;
+};
+
+struct tst_info
+{
+	struct vc_map		*vc;
+	u32			tste;
+};
+
+#define TSTE_MASK		0x601fffff
+
+#define TSTE_OPC_MASK		0x60000000
+#define TSTE_OPC_NULL		0x00000000
+#define TSTE_OPC_CBR		0x20000000
+#define TSTE_OPC_VAR		0x40000000
+#define TSTE_OPC_JMP		0x60000000
+
+#define TSTE_PUSH_IDLE		0x01000000
+#define TSTE_PUSH_ACTIVE	0x02000000
+
+#define TST_SWITCH_DONE		0
+#define TST_SWITCH_PENDING	1
+#define TST_SWITCH_WAIT		2
+
+#define FBQ_SHIFT		9
+#define FBQ_SIZE		(1 << FBQ_SHIFT)
+#define FBQ_MASK		(FBQ_SIZE - 1)
+
+struct sb_pool
+{
+	unsigned int		index;
+	struct sk_buff		*skb[FBQ_SIZE];
+};
+
+#define POOL_HANDLE(queue, index)	(((queue + 1) << 16) | (index))
+#define POOL_QUEUE(handle)		(((handle) >> 16) - 1)
+#define POOL_INDEX(handle)		((handle) & 0xffff)
+
+struct idt77252_dev
+{
+        struct tsq_info		tsq;		/* Transmit Status Queue */
+        struct rsq_info		rsq;		/* Receive Status Queue */
+
+	struct pci_dev		*pcidev;	/* PCI handle (desriptor) */
+	struct atm_dev		*atmdev;	/* ATM device desriptor */
+
+	unsigned long		membase;	/* SAR's memory base address */
+	unsigned long		srambase;	/* SAR's sram  base address */
+	unsigned long		fbq[4];		/* FBQ fill addresses */
+
+	struct semaphore	mutex;
+	spinlock_t		cmd_lock;	/* for r/w utility/sram */
+
+	unsigned long		softstat;
+	unsigned long		flags;		/* see blow */
+
+	struct tq_struct	tqueue;
+
+	unsigned long		tct_base;	/* TCT base address in SRAM */
+        unsigned long		rct_base;	/* RCT base address in SRAM */
+        unsigned long		rt_base;	/* Rate Table base in SRAM */
+        unsigned long		scd_base;	/* SCD base address in SRAM */
+        unsigned long		tst[2];		/* TST base address in SRAM */
+	unsigned long		abrst_base;	/* ABRST base address in SRAM */
+        unsigned long		fifo_base;	/* RX FIFO base in SRAM */
+
+	unsigned long		irqstat[16];
+
+	unsigned int		sramsize;	/* SAR's sram size */
+
+        unsigned int		tct_size;	/* total TCT entries */
+        unsigned int		rct_size;	/* total RCT entries */
+        unsigned int		scd_size;	/* length of SCD */
+        unsigned int		tst_size;	/* total TST entries */
+        unsigned int		tst_free;	/* free TSTEs in TST */
+        unsigned int		abrst_size;	/* size of ABRST in words */
+        unsigned int		fifo_size;	/* size of RX FIFO in words */
+
+        unsigned int		vpibits;	/* Bits used for VPI index */
+        unsigned int		vcibits;	/* Bits used for VCI index */
+        unsigned int		vcimask;	/* Mask for VCI index */
+
+	unsigned int		utopia_pcr;	/* Utopia Itf's Cell Rate */
+	unsigned int		link_pcr;	/* PHY's Peek Cell Rate */
+
+	struct vc_map		**vcs;		/* Open Connections */
+	struct vc_map		**scd2vc;	/* SCD to Connection map */
+
+	struct tst_info		*init_o-ions */
+	+OMMANS, pci_command)) {
+		printk("%s: can;t wrinloc"_{
+	 SRAM */
+
+	t		lined lopg		irqstat[16];
+
+	unsigned int		sramsize;	'Ed lo's srampg		idevinit
+;	/* BSoftware :	idt77252_changekqos,
+	ppcr;	/*lock_1b
+
+	mcr	p15, 0, r1, c7, c7, c7, c7_dev softmdev;	/* ATM deviile the monarch processor +	printk(" CDC %04x, VSx20000100
+#define SAR_TSQE_TYPE_IDLE    
  0x40000000
+#define 000000
+#define 000000
+#define 000000
+#define 000000
+#dt
+	struct•zned tmr
+;	/* BSoftware :	rintk("
+#dt
+	sCS);
+	udelamr
+  Softtwa#define >lock, feags)ock. 
+new-file v2.4.14/lock, feags)ock. define 0000 sb_pool
   u4/lock, feags)ock. >lock, 0000 sb_pool
   u4/lu4/f eithDULE_PA>lock, 0000 sb_po   u4/lu4/f erv_CCL_ol
   u4/lu4Q filags)) {
+		print
+	snru(t semaphore	mu;ex;
+	spinlcck_t8	cmd_lock;	/* for r/w utility/sram */	+
+	unsigned long		softstat;
+	unsigned long		}cc= 1;
+
+	if 	lo: */
       unsigned long		scd_base;	/* SCD base:ng		O
+	stract Ok_* Open ility/srasof	}
 
-	bspstore sra	stract Ok_MCrx(strcr,e :	idt77*y.h>
+#in000000ruct atm_vcc *vccmmand.)ase);
+
+	clear_bit(char *p;
+
+		vc = card->vcs[i];
+		iap		**vcs;	 program is f(, tct + 5, 0);
+		wstrcr,e :act Ok_MCrx(strcr,e :	 /* Fill :	 /
+#in    
+		wstrcr,e :act	zct_si	(slink_p/
+#i :	 /
+#jarch/sparc/mm/srmmu.c
---ueue + 1) << 16) | (r,e :	 /* Fill :	 /
+#in    
+		wstrc)ccmmand.) + 1) << 16) | ->l_type, (short -) addr)
+		| prt -) a+#in    
+		wstrc)ccmmand.)1+ 1) << 16	| prt -)) ->l_type, (short -) addr)
+		| prt -) a+#in    
+		wstrc)ccmmand.rt -) +#in   		| prt -) a+#in    
+		wstrc)cof	}
 
-	bspstore sra	* SCD bbbbbbbstrc)ccmmand.)1d.)0(cof	}
 
-	bspk;	/* fdr
+  Softtwa#define >lock, feags)ock
+		START | vc->index, SAR_REG_TCMDQ);
+			b9
+#defiefineze;	 * total RCT entries */
+     o  unsigned int		scd_size;	/* l
+#defiefinase:ng		O
+	Fill :	 /
+	Fill :
 "(+	Fill :
 "(+	Fill :
 "(+	Fe:n