]> git.neil.brown.name Git - history.git/commitdiff
Import 2.2.2pre5 2.2.2pre5
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:18:13 +0000 (15:18 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:18:13 +0000 (15:18 -0500)
35 files changed:
Documentation/Configure.help
arch/i386/defconfig
arch/i386/kernel/i386_ksyms.c
arch/i386/kernel/io_apic.c
arch/i386/kernel/irq.c
arch/i386/kernel/irq.h
arch/i386/kernel/setup.c
arch/i386/kernel/smp.c
arch/i386/kernel/traps.c
arch/i386/lib/semaphore.S
drivers/char/bttv.c
drivers/char/msp3400.c
drivers/scsi/ide-scsi.c
drivers/scsi/scsi_error.c
fs/buffer.c
fs/hfs/ChangeLog
fs/hfs/catalog.c
fs/hfs/file_hdr.c
fs/lockd/clntproc.c
fs/lockd/svclock.c
fs/lockd/svcproc.c
fs/nfsd/vfs.c
fs/smbfs/file.c
include/asm-i386/irq.h
include/asm-i386/semaphore-helper.h [new file with mode: 0644]
include/asm-i386/semaphore.h
include/net/sock.h
include/net/tcp.h
kernel/ksyms.c
kernel/sched.c
net/core/filter.c
net/core/sock.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_output.c
net/ipv4/timer.c

index bc1ccb663e24928b491239b1f72548bcc6ad42bc..587315e6fd71840bed95556db99fe6504be5cfb5 100644 (file)
@@ -51,7 +51,7 @@
 # All this was shamelessly stolen from several different sources. Many
 # thanks to all the contributors. Feel free to use these help texts in
 # your own kernel configuration tools. The texts are copyrighted (c)
-# 1995-1998 by Axel Boldt and many others and are governed by the GNU
+# 1995-1999 by Axel Boldt and many others and are governed by the GNU
 # General Public License.
 
 Prompt for development and/or incomplete code/drivers
@@ -81,30 +81,33 @@ CONFIG_EXPERIMENTAL
 
 Symmetric Multi Processing
 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 you
-  have a system with more than one CPU, say Y.
+  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
+  you have a system with more than one CPU, say Y.
 
-  A non-SMP kernel will run on any machine, but will use only one CPU of
-  a multi-CPU machine.  An SMP kernel will run on many, but not all,
-  single-CPU machines.  On a single-CPU machine, a non-SMP kernel
-  will run faster than an SMP kernel.
+  If you say Y here, the kernel will run on single and multiprocessor
+  machines, but will use only one CPU of a multiprocessor machine. If
+  you say Y here, the kernel will run on many, but not all,
+  singleprocessor machines. On a singleprocessor machine, the kernel
+  will run faster if you say Y here.
 
-  i486 based SMP boards don't boot CONFIG_M586/M686 kernels. CONFIG_M686
-  SMP kernels might not work on all Pentium based boards.
+  Note that if you say Y here and choose architecture "586" or
+  "Pentium" under "Processor family", the kernel will not work on 486
+  architectures. Similarly, multiprocessor kernels for the "PPro"
+  architecture may not work on all Pentium based boards.
 
-  People using multiprocessor machines should also say Y to "Enhanced
-  Real Time Clock Support", below.  The "Advanced Power Management"
-  code will be disabled in an SMP kernel.
+  People using multiprocessor machines who say Y here should also say
+  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
+  Management" code will be disabled if you say Y here.
 
-  If you don't know what to do here, say N.
-  
   See also: Documentation/SMP.txt, Documentation/smp.tex,
   Documentation/smp.txt, and Documentation/IO-APIC.txt.  Also see the
   SMP-FAQ on the WWW at http://www.irisa.fr/prive/mentre/smp-faq/ (to
   browse the WWW, you need to have access to a machine on the Internet
   that has a program like lynx or netscape).
   
+  If you don't know what to do here, say N.
+  
 Kernel math emulation
 CONFIG_MATH_EMULATION
   Linux can emulate a math coprocessor (used for floating point
@@ -134,9 +137,8 @@ CONFIG_MATH_EMULATION
 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.  Do not say anything but Y unless you
-  know what you are doing.
+  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.
 
 Normal PC floppy disk support
 CONFIG_BLK_DEV_FD
@@ -276,10 +278,17 @@ CONFIG_BLK_DEV_IDE
   performance, look for the hdparm package at
   ftp://metalab.unc.edu:/pub/Linux/kernel/patches/diskdrives/
 
-  If you have one or more IDE drives, say Y here. If your system has
-  no IDE drives, or if memory requirements are really tight, you could
-  say N here, and select the "Old hard disk driver" instead to save
-  about 13 KB of memory in 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 and
+  Documentation/ide.txt. The module will be called ide.o. Do not
+  compile this driver as a module if your root filesystem (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
+  could say N here, and select the "Old hard disk driver" below
+  instead to save about 13 KB of memory in the kernel.
 
 Old hard disk (MFM/RLL/IDE) driver
 CONFIG_BLK_DEV_HD_ONLY
@@ -382,10 +391,12 @@ 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. IDE floppy drives include the
-  LS-120 and the ATAPI ZIP (ATAPI PD-CD/CDR drives are not supported
-  by this driver; support for PD-CD/CDR drives is available if you
-  answer Y to "SCSI emulation support", below).
+  drives, similar to the SCSI protocol. 
+
+  The LS-120 and the IDE/ATAPI Iomega ZIP drive are also supported by
+  this driver. (ATAPI PD-CD/CDR drives are not supported by this
+  driver; support 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
   other IDE devices, as "hdb" or "hdc", or something similar (check
@@ -519,7 +530,8 @@ CONFIG_IDEDMA_AUTO
   If you suspect your hardware is at all flakey, say N here.
   Do NOT email the IDE kernel people regarding this issue!
 
-  It is nearly always safe to say Y to this question.
+  It is normally safe to answer Y to this question unless your
+  motherboard uses a VIA VP2 chipset, in which case you should say N.
 
 Other IDE chipset support
 CONFIG_IDE_CHIPSETS
@@ -572,6 +584,11 @@ PS/2 ESDI hard disk support
 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.
 
 Tekram TRM290 chipset support (EXPERIMENTAL)
 CONFIG_BLK_DEV_TRM290
@@ -1068,6 +1085,10 @@ CONFIG_NET
   contained in the package net-tools, the location and version number
   of which are given in Documentation/Changes.
 
+  For a general introduction to Linux networking, it is highly
+  recommended to read the NET-3-HOWTO, available via FTP (user:
+  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+
 Network aliasing
 CONFIG_NET_ALIAS
   If you say Y here, you will be able to set multiple network
@@ -1178,12 +1199,12 @@ CONFIG_BLK_DEV_SUNFD
 Alpha system type
 CONFIG_ALPHA_GENERIC
   This is the system type of your hardware.  A "generic" kernel will
-  run on any supported Alpha system.  Configuring a kernel for one
-  specific system can save about 200K and operate more efficiently.
+  run on any supported Alpha system. However, if you configure a
+  kernel for your specific system, it will be faster and smaller.
 
   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.azstarnet.com/~axplinux/ (To browse the WWW, you need to
+  http://www.alphalinux.org (To browse the WWW, you need to
   have access to a machine on the Internet that has a program like
   lynx or netscape).  In summary:
 
@@ -1197,7 +1218,8 @@ CONFIG_ALPHA_GENERIC
   EB64+               EB64+ 21064 evaluation board
   EB66                EB66 21066 evaluation board
   EB66+               EB66+ 21066 evaluation board
-  Jensen              DECpc 150, DEC 2000 model 300, DEC 2000 model 500
+  Jensen              DECpc 150, DEC 2000 model 300, 
+                      DEC 2000 model 500
   LX164               AlphaPC164-LX
   Miata               Personal Workstation 433a, 433au, 500a,
                       500au, 600a, or 600au
@@ -1227,7 +1249,7 @@ CONFIG_ALPHA_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.azstarnet.com/~axplinux/ (To browse the WWW, you need to
+  http://www.alphalinux.org (To browse the WWW, you need to
   have access to a machine on the Internet that has a program like
   lynx or netscape).
 
@@ -1333,34 +1355,26 @@ 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. The PCI-HOWTO, available
-  via FTP (user: anonymous) in
+  VESA. If you have PCI, say Y, otherwise N. 
+
+  The PCI-HOWTO, available via FTP (user: anonymous) in
   ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, contains valuable
   information about which PCI hardware does work under Linux and which
   doesn't.
 
-  If some of your PCI devices don't work and you get a warning during
-  boot time ("man dmesg"), please follow the instructions at the top
-  of include/linux/pci.h.
-
 PCI access mode
 CONFIG_PCI_GOBIOS
-  If you have enabled PCI bus support above, you probably want to
-  allow Linux to use your PCI BIOS to detect the PCI devices and
-  determine their configuration. Note: some old PCI motherboards have
-  BIOS bugs and may crash if you say Y here -- for such motherboards,
-  you should say N here and say Y to "PCI direct access support"
-  instead.
-
-  Except for some special cases (embedded systems with no BIOS), you
-  probably should say Y here.
-
-  If you don't want to use the PCI BIOS (e.g., because you run some
-  embedded system with no BIOS at all) or Linux says it cannot use
-  your PCI BIOS, you can enable direct PCI hardware here. It might
-  fail if your machine is based on some unusual chipset, but it
-  usually works. If both PCI BIOS and direct PCI access are enabled,
-  the use of BIOS is preferred. If unsure, say Y.
+  On PCI systems, the BIOS can be used to detect the PCI devices and
+  determine their configuration. However, some old PCI motherboards
+  have BIOS bugs and may crash if this is done. Also, some embedded
+  PCI-based systems don't have any BIOS at all. Linux can also try to
+  detect the PCI hardware directly without using the BIOS.
+
+  With this option, you can specify how Linux should detect the PCI
+  devices. If you choose "BIOS", the BIOS will be used, if you choose
+  "Direct", the BIOS won't be used, and if you choose "Any", the
+  kernel will try the direct access method and falls back to the BIOS
+  if that doesn't work. If unsure, go with the default.
 
 PCI quirks
 CONFIG_PCI_QUIRKS
@@ -1385,11 +1399,8 @@ CONFIG_PCI_OLD_PROC
   PCI (/proc/bus/pci) has been implemented and the old one is
   supported for compatibility reasons only; you'll get the old one (in
   addition to the new one) if you say Y here and to "/proc filesystem
-  support", below. If unsure, say Y.
-
-If you say Y here and to the "/proc filesystem support" below, you
-  will get a directory /proc/pci with information about your PCI
-  hardware. If unsure, say Y.
+  support", below. If unsure, say Y. If you say N, you'll only get the
+  new /proc/bus/pci interface.
 
 MCA support
 CONFIG_MCA
@@ -1398,7 +1409,7 @@ CONFIG_MCA
   Documentation/mca.txt (and especially the web page given there)
   before attempting to build an MCA bus kernel.
 
-SGI Visal Workstation support
+SGI Visual Workstation support
 CONFIG_VISWS
   The SGI Visual Workstation series is an IA32-based workstation
   based on SGI systems chips with some legacy PC hardware attached.
@@ -1593,19 +1604,21 @@ CONFIG_M386
   all x86 CPU types (albeit not optimally fast), you can specify
   "386" here.
 
-  If you specify one of "486" or "Pentium" or "PPro", then the kernel
-  will not necessarily run on earlier architectures (ie a Pentium
-  optimized kernel will run on a PPro, but not necessarily on a i486).
+  If you specify one of "486" or "586" or "Pentium" or "PPro", then
+  the kernel will not necessarily run on earlier architectures (e.g. a
+  Pentium optimized kernel will run on a PPro, but not necessarily on
+  a i486).
 
   Here are the settings recommended for greatest speed:
-   - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX and
-     Cyrix/TI 486DLC/DLC2. Only "386" kernels will run on a 386 class
-     machine.
+   - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI
+     486DLC/DLC2 and UMC 486SX-S. Only "386" kernels will run on a 386
+     class machine.
    - "486" for the AMD/Cyrix/IBM/Intel DX4 or 486DX/DX2/SL/SX/SX2,
      AMD/Cyrix 5x86, NexGen Nx586 and UMC U5D or U5S.
-   - "586" for generic Pentium CPU's, possibly lacking the TSC register.
-   - "Pentium" for the Intel Pentium/Pentium MMX, AMD K5, K6 and K6-3D.
-     This option will assume that you have a time stamp counter.
+   - "586" for generic Pentium CPUs, possibly lacking the TSC 
+     (time stamp counter) register.
+   - "Pentium" for the Intel Pentium/Pentium MMX, AMD K5, K6 and 
+     K6-3D.
    - "PPro" for the Cyrix/IBM/National Semiconductor 6x86MX, MII and
      Intel Pentium II/Pentium Pro.
 
@@ -1667,9 +1680,9 @@ CONFIG_FB
 
   If you are compiling for the x86 architecture, you can say Y if you
   want to play with it, but it is not essential. Please note that
-  running graphical applications that directly touch the hardware (e.g.
-  and accelerated X server) and that are not frame buffer device-aware
-  may cause unexpected results. If unsure, say N.
+  running graphical applications that directly touch the hardware
+  (e.g. an accelerated X server) and that are not frame buffer
+  device-aware may cause unexpected results. If unsure, say N.
 
 Acorn VIDC support
 CONFIG_FB_ACORN
@@ -1807,64 +1820,71 @@ CONFIG_FB_VESA
   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 and the . If unsure, say Y.
+  read Documentation/fb/vesafb.txt. If unsure, say Y.
 
 Backward compatibility mode for Xpmac
 CONFIG_FB_COMPAT_XPMAC
-  If you use the Xpmac X server (common with mklinux), you'll need
-  to enable this to use X. You should consider changing to XFree86
-  which includes a server that supports the frame buffer device
-  directly (XF68_FBDev).
+  If you use the Xpmac X server (common with mklinux), you'll need to
+  say Y here to use X. You should consider changing to XFree86 which
+  includes a server that supports the frame buffer device directly
+  (XF68_FBDev).
 
 Matrox unified accelerated driver
 CONFIG_FB_MATROX
-  Say Y here  if you have  Matrox Millennium,  Matrox Millennium  II, 
+  Say Y here if you have Matrox Millennium, Matrox Millennium II,
   Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox
-  Mystique G200, Matrox Millennium G200  or Matrox Marvel G200 in your 
-  box.  At this time, G100,  Mystique G200 and  Marvel G200 support is
-  untested.  If  you  want,  you  can  select M,  in this  case module
-  matroxfb.o will  be created.  You can pass parameters into driver if 
-  it is compiled  into kernel by  specifying "video=matrox:XXX", where 
-  meaning of XXX you can found at the end of main source file
-  (drivers/video/matroxfb.c)  at  boot time.  Same  parameters  can  be 
-  passed into insmod if driver is used as module.
+  Mystique G200, Matrox Millennium G200 or Matrox Marvel G200 video
+  card in your box. At this time, support for the G100, Mystique G200
+  and Marvel G200 is untested.
+
+  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.
+
+  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. 
 
 Matrox Millennium support
 CONFIG_FB_MATROX_MILLENIUM
-  Say Y here if you  have Matrox Millennium  or Matrox Millennium II in 
-  the box. If you select "Advanced lowlevel driver options", you should 
-  check 4 bpp packed pixel, 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.
+  Say Y here if you have a Matrox Millennium or Matrox Millennium II
+  video card. If you select "Advanced lowlevel driver options" below,
+  you should check 4 bpp packed pixel, 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.
 
 Matrox Mystique support
 CONFIG_FB_MATROX_MYSTIQUE
-  Say Y here if you have  Matrox Mystique or Matrox Mystique 220 in the 
-  box.  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.
+  Say Y here if you have a Matrox Mystique or Matrox Mystique 220
+  video card. If you select "Advanced lowlevel driver options" below,
+  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.
 
 Matrox G100/G200 support
 CONFIG_FB_MATROX_G100
-  Say Y  here if you have Matrox Productiva G100, Matrox Mystique G200,
-  Matrox  Marvel G200  or  Matrox  Millennium G200  in the box.  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.
+  Say Y here if you have a Matrox Productiva G100, Matrox Mystique
+  G200, Matrox Marvel G200 or Matrox Millennium G200 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.
 
 Matrox unified driver multihead support
 CONFIG_FB_MATROX_MULTIHEAD
-  Say Y  here if you  have more  than one (supported) Matrox  device in 
-  computer  and you  want to  use all  of them.  If you  have only  one 
-  device,  you should say N because of driver compiled with Y is larger 
-  and a bit slower, especially on ia32 (ix86).
-  If you compiled  driver as module,  you are VERY  interested in speed 
-  and  you can  use 40KB  of memory  per each  Matrox  device,  you can 
-  compile driver  without multihead  support and  instead of  it insmod 
-  more module instances. In this case, you MUST specify parameter dev=N 
-  to insmod, where N is sequential number of Matrox device  (0 = first, 
-  1 = second and so on).
+  Say Y here if you have more than one (supported) Matrox device in
+  your computer and you want to use all of them. If you have only one
+  device, you should say N because the driver compiled with Y is
+  larger and a bit slower, especially on ia32 (ix86). 
+
+  If you said M to "Matrox unified accelerated driver" and N here, you
+  will still be able to use several Matrox devices simultaneously.
+  This is slightly faster but uses 40 KB of kernel memory per Matrox
+  card. You do this by inserting several instances of the module 
+  matroxfb.o into the kernel with insmod, supplying the parameter
+  "dev=N" where N is 0, 1, etc. for the different Matrox devices.
   
 MDA text console (dual-headed)
 CONFIG_MDA_CONSOLE
@@ -2145,15 +2165,20 @@ CONFIG_ARPD
 TCP/IP networking
 CONFIG_INET
   These are the protocols used on the Internet and on most local
-  Ethernets. The safest is to say Y here (which will enlarge your
-  kernel by about 35 kB), since some programs (e.g. the X window
+  Ethernets. It is highly recommended to say Y here (this will enlarge
+  your kernel by about 35 KB), since some programs (e.g. the X window
   system) use TCP/IP even if your machine is not connected to any
   other computer. You will get the so-called loopback device which
-  allows you to ping yourself (great fun, that!). 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
+  allows you to ping yourself (great fun, that!).
+
+  For an excellent introduction to Linux networking, please read the
+  NET-3-HOWTO, available via FTP (user: anonymous) from
+  ftp://metalab.unc.edu/pub/Linux/docs/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).
   
   If you say Y here and also to "/proc filesystem support" and "Sysctl
@@ -2259,7 +2284,9 @@ IP: 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.
+  you specify. Please see
+  http://www.csn.tu-chemnitz.de/HyperNews/get/linux-ip-nat.html for
+  details. 
 
 IP: optimize as router not host
 CONFIG_IP_ROUTER
@@ -2293,7 +2320,7 @@ CONFIG_IP_FIREWALL
   http://www.rustcorp.com/linux/ipchains/) to allow selective blocking
   of Internet traffic based on type, origin and destination. 
   Note that the Linux firewall code has changed and the old program
-  called ipfwadm won't work anymore.
+  called ipfwadm won't work anymore. Please read the IPCHAINS-HOWTO.
 
   The type of firewall provided by ipchains and this kernel support is
   called a "packet filter". The other type of firewall, a
@@ -2330,10 +2357,10 @@ CONFIG_IP_FIREWALL
 
 IP: firewall packet netlink device
 CONFIG_IP_FIREWALL_NETLINK
-  If you say Y here, you can use the ipchains tool to copy all or part of
-  any packet you specify that hits your Linux firewall to optional user
-  space monitoring software that can then look for attacks and take
-  actions such as paging the administrator of the site.
+  If you say Y here, you can use the ipchains tool to copy all or part
+  of any packet you specify that hits your Linux firewall to optional
+  user space monitoring software that can then look for attacks and
+  take actions such as paging the administrator of the site.
 
   To use this, you need to create a character special file under /dev
   with major number 36 and minor number 3 using mknod ("man mknod"),
@@ -2430,7 +2457,7 @@ CONFIG_IP_MASQUERADE
   host replies, the Linux firewall will silently forward the traffic
   to the corresponding local computer. This way, the computers on your
   local net are completely invisible to the outside world, even though
-  they can reach the outside and can be reached. This makes it
+  they can reach the outside and can receive replies. This makes it
   possible to have the computers on the local network participate on
   the Internet even if they don't have officially registered IP
   addresses. (This last problem can also be solved by connecting the
@@ -2477,8 +2504,8 @@ CONFIG_IP_MASQUERADE_ICMP
 IP: masquerading special modules support
 CONFIG_IP_MASQUERADE_MOD
   This provides support for special modules that can modify the
-  rewriting rules used when masquerading. Please note that this feature
-  adds a little overhead in the input packet processing chain.
+  rewriting rules used when masquerading. Please note that this
+  feature adds a little overhead in the input packet processing chain.
 
   Examples of such modules are ipautofw (allowing the masquerading of
   protocols which don't have their own protocol helpers) and port
@@ -2518,15 +2545,15 @@ CONFIG_IP_MASQUERADE_IPPORTFW
   forwarding of packets from outside to inside a firewall on given
   ports. This could be useful if, for example, you want to run a web
   server behind the firewall or masquerading host and that web server
-  should be visible to the outside world. An external client connects
-  to port 80 of the firewall, the firewall forwards requests to this
-  port to the web server, the web server handles the request and the
-  results are sent through the firewall to the original client. The
-  client thinks that the firewall machine itself is running the web
-  server. This can also be used for load balancing if you have a farm
-  of identical web servers behind the firewall.
-
-  Information about it is available from
+  should be accessible from the outside world. An external client
+  sends a request to port 80 of the firewall, the firewall forwards
+  this request to the web server, the web server handles the request
+  and the results are sent through the firewall to the original
+  client. The client thinks that the firewall machine itself is
+  running the web server. This can also be used for load balancing if
+  you have a farm of identical web servers behind the firewall.
+
+  Information about this feature is available from
   http://www.monmouth.demon.co.uk/ipsubs/portforwarding.html (to
   browse the WWW, you need to have access to a machine on the Internet
   that has a program like lynx or netscape). For general info, please
@@ -2545,12 +2572,14 @@ CONFIG_IP_MASQUERADE_IPPORTFW
 
 IP: ipmarkfw masquerade support
 CONFIG_IP_MASQUERADE_MFW
-  This provides functionality similar to port forwarding, the
-  difference is that Firewall Mark Forwarding uses "firewalling mark" 
-  to select which packets must forward (see ipchains(8), "-m" argument).
+  Firewall Mark Forwarding provides functionality similar to port
+  forwarding (see "IP: ipportfw masquerade support", above), the
+  difference being that Firewall Mark Forwarding uses "firewalling
+  mark" to select which packets must be forwarded (see ipchains(8),
+  "-m" argument).
 
-  The ip_masq_mfw code is still under development and so is currently
-  marked EXPERIMENTAL. If you want to try it, say Y.
+  This code is still under development and so is currently marked
+  EXPERIMENTAL. If you want to try it, 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).
@@ -2736,22 +2765,25 @@ CONFIG_SKB_LARGE
 
 Unix domain sockets
 CONFIG_UNIX
-  This includes Unix domain sockets, the standard Unix mechanism for
-  establishing and 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 an embedded system or something similar, you therefore
-  definitely want to say Y here.
-
-  The socket 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 unix.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt. 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/conf.modules file.
+  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
+  the X Window system and syslog use these sockets even if your
+  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.
 
-  If unsure, say Y.
+  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/conf.modules 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
 CONFIG_IPV6
@@ -2891,14 +2923,14 @@ CONFIG_ATALK
   for details (to browse the WWW, you need to have access to a machine
   on the Internet that has a program like lynx or netscape). EtherTalk
   is the name used for AppleTalk over Ethernet and the cheaper and
-  slower LocalTalk is AppleTalk over a proprietary apple network using
+  slower LocalTalk is AppleTalk over a proprietary Apple network using
   serial links. EtherTalk and LocalTalk are fully supported by Linux.
-  The NET-2-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO contains valuable
-  information as well.
 
   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 NET-3-HOWTO, available via FTP (user: anonymous) in
+  ftp://metalab.unc.edu/pub/Linux/docs/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).
@@ -3472,7 +3504,7 @@ CONFIG_SCSI
   ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. The
   SCSI-Programming-HOWTO contains information about how to add or
   remove an SCSI device from a running Linux machine without
-  rebooting. 
+  rebooting.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3605,11 +3637,13 @@ CONFIG_SCSI_ADVANSYS
 
 Adaptec AHA152X/2825 support
 CONFIG_SCSI_AHA152X
-  This is support for the AVA-1505 (irq etc must be manually specified), 
-  AHA-1510, AHA-1520, AHA-1522, and AHA-2825 SCSI host adapters. It is 
-  explained in section 3.3 of the SCSI-HOWTO, available via FTP 
-  (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. You 
-  might also want to read the comments at the top of 
+  This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825
+  SCSI host adapters. It also works for the AVA-1505, but the IRQ etc.
+  must be manually specified in this case.
+
+  It is explained in section 3.3 of the SCSI-HOWTO, available via FTP
+  (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. You
+  might also want to read the comments at the top of
   drivers/scsi/aha152x.c.
 
   This driver is also available as a module ( = code which can be
@@ -3647,25 +3681,31 @@ CONFIG_SCSI_AHA1740
 Adaptec AIC7xxx chipset SCSI controller support
 CONFIG_SCSI_AIC7XXX
   This is support for the various aic7xxx based Adaptec SCSI
-  controllers. These include the 274x EISA cards; 284x VLB cards; 2902,
-  2910, 293x, 294x, 394x, 3985 and several other PCI and motherboard based
-  SCSI controllers from Adaptec.  It does not support the AAA-13x RAID
-  controllers from Adaptec, nor will it likely ever support them.  It
-  does not support the 2920 cards from Adaptec that use the Future Domain
-  SCSI controller chip.  For those cards, you need the "Future Domain
-  16xx SCSI support" driver.
+  controllers. These include the 274x EISA cards; 284x VLB cards;
+  2902, 2910, 293x, 294x, 394x, 3985 and several other PCI and
+  motherboard based SCSI controllers from Adaptec. It does not support
+  the AAA-13x RAID controllers from Adaptec, nor will it likely ever
+  support them. It does not support the 2920 cards from Adaptec that
+  use the Future Domain SCSI controller chip. For those cards, you
+  need the "Future Domain 16xx SCSI support" driver.
 
   In general, if the controller is based on an Adaptec SCSI controller
-  chip from the aic777x series or the aic78xx series, it should work.  The
-  only exception is the 7810 which is specifically not supported (that's the
-  RAID controller chip on the AAA-13x cards).
+  chip from the aic777x series or the aic78xx series, this driver
+  should work. The only exception is the 7810 which is specifically
+  not supported (that's the RAID controller chip on the AAA-13x
+  cards).
+
+  Note that the AHA2920 SCSI host adapter is *not* supported by this
+  driver; choose "Future Domain 16xx SCSI support" instead if you have
+  one of those.
 
   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/README.aic7xxx
   at a minimum before contacting the maintainer with any questions.  
   The SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO can also be of great help.
+  ftp://metalab.unc.edu/pub/Linux/docs/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),
@@ -3766,16 +3806,15 @@ CONFIG_SCSI_DTC3280
 
 EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support
 CONFIG_SCSI_EATA_DMA
-  This driver is obsolete. You should normally be using the generic EATA
-  driver for this hardware.
-
   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. Note that there is
-  also another driver for the same hardware: "EATA ISA/EISA/PCI
-  support". You should only say Y to one of them. Please read the
-  SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  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
+  via FTP (user: anonymous) at
+  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3818,19 +3857,19 @@ 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
-  random seeks, but this does not necessarily results in a noticeable
+  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
 CONFIG_SCSI_U14_34F_MAX_TAGS
-  This specifies how many SCSI commands can be maximally queued for each
-  probed SCSI device. You should reduce the default value of 8 only if
-  you have disks with buggy or limited tagged command support.
+  This specifies how many SCSI commands can be maximally queued for
+  each probed SCSI device. You should reduce the default value of 8
+  only if you have disks with buggy or limited tagged command support.
   Minimum is 2 and maximum is 14. This value is also the window size
-  used by the elevator sorting option above.
-  The effective value used by the driver for each probed SCSI device is 
-  reported at boot time.
+  used by the elevator sorting option above. The effective value used
+  by the driver for each probed SCSI device is reported at boot time.
 
 Future Domain 16xx SCSI/AHA-2920A support
 CONFIG_SCSI_FUTURE_DOMAIN
@@ -3841,10 +3880,10 @@ CONFIG_SCSI_FUTURE_DOMAIN
   It is explained in section 3.7 of the SCSI-HOWTO, available via FTP
   (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
 
-  NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip and
-  should use the aic7xxx driver (CONFIG_SCSI_AIC7XXX).  The Future Domain
-  driver works with the older Adaptec AHA-2920A boards with a Future Domain
-  chip on them.
+  NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip
+  and should use the aic7xxx driver ("Adaptec AIC7xxx chipset SCSI
+  controller support"). This Future Domain driver works with the older
+  Adaptec AHA-2920A boards with a Future Domain chip on them.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3854,9 +3893,10 @@ CONFIG_SCSI_FUTURE_DOMAIN
 Future Domain MCS-600/700 SCSI support
 CONFIG_SCSI_FD_MCS
  This is support for Future Domain MCS 600/700 MCA SCSI adapters. Some
- PS/2s are also equipped with IBM Fast SCSI Adapter/A which is an OEM
- of the MCS 700. This driver also supports Reply SB16/SCSI card (the 
- SCSI part). It supports multiple adapters in the same system.
+ PS/2 computers are equipped with IBM Fast SCSI Adapter/A which is
+ identical to the MCS 700 and hence also supported by this driver.
+ This driver also supports the Reply SB16/SCSI card (the SCSI part).
+ It supports multiple adapters in the same system.
 
 Generic NCR5380/53c400 SCSI support
 CONFIG_SCSI_GENERIC_NCR5380
@@ -3889,16 +3929,17 @@ CONFIG_SCSI_G_NCR5380_PORT
 
 NCR53c7,8xx SCSI support
 CONFIG_SCSI_NCR53C7xx
-  This is 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 via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If it doesn't work out
-  of the box, you may have to change some settings in
-  drivers/scsi/53c7,8xx.h.
+  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 via FTP (user:
+  anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/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.
 
   Note: there is another driver for the 53c8xx family of controllers
-  ("NCR53C8XX SCSI support" below). You cannot say Y to both of them;
-  you can say M to both and build them as modules, but only one may be
+  ("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.
 
@@ -3942,8 +3983,8 @@ CONFIG_SCSI_NCR53C8XX
   supports FAST-40 transfers with Ultra2 LVD devices.
 
   Note: there is another driver for the 53c8xx family of controllers
-  ("NCR53c7,8xx SCSI support" above). You cannot say Y to both of
-  them; you can say M to both and build them as modules, but only one
+  ("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, it's best to
   use this driver.
 
@@ -4134,10 +4175,10 @@ CONFIG_SCSI_MCA_53C9X
   controller based on the NCR 53C94.  This driver will allow use of
   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.
+  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.
  
 Always IN2000 SCSI support
 CONFIG_SCSI_IN2000
@@ -4155,18 +4196,7 @@ Initio 91XXU(W) SCSI support
 CONFIG_SCSI_INITIO
   This is support for the Initio 91XXU(W) SCSI host adapter.
   Please read the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://sunsite.unc.edu/pub/Linux/docs/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
-
-Initio 91XXU(W) SCSI support
-CONFIG_SCSI_INITIO
-  This is support for the Initio 91XXU(W) SCSI host adapter.
-  Please read the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
+  ftp://metalab.unc.edu/pub/Linux/docs/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),
@@ -4221,14 +4251,18 @@ CONFIG_SCSI_PSI240I
 
 Qlogic FAS SCSI support
 CONFIG_SCSI_QLOGIC_FAS
-  This driver works only with the ISA, VLB, and PCMCIA versions of the
-  Qlogic FastSCSI! cards as well as any other card based on the FASXX
-  chip (including the Control Concepts SCSI/IDE/SIO/PIO/FDC cards); it
-  does NOT support the PCI version. The PCI versions are supported by
-  the Qlogic ISP driver though. Information about this driver is
-  contained in drivers/scsi/README.qlogicfas. You should also read
-  the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  This is a driver for the ISA, VLB, and PCMCIA versions of the Qlogic
+  FastSCSI! cards as well as any other card based on the FASXX chip
+  (including the Control Concepts SCSI/IDE/SIO/PIO/FDC cards).
+
+  This driver does NOT support the PCI versions of these cards. The
+  PCI versions are supported by the Qlogic ISP driver ("Qlogic ISP
+  SCSI support"), below.
+
+  Information about this driver is contained in
+  drivers/scsi/README.qlogicfas. You should also read the SCSI-HOWTO,
+  available via FTP (user: anonymous) at
+  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4241,7 +4275,8 @@ CONFIG_SCSI_QLOGIC_ISP
   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 say Y to "PCI BIOS support" as well.
+  If you say Y here, make sure to say Y 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 via FTP (user: anonymous) at
@@ -4307,14 +4342,25 @@ CONFIG_SCSI_7000FASST
   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.
 
+ACARD SCSI support
+CONFIG_SCSI_ACARD
+  This driver supports the ACARD 870U/W SCSI host adapter.
+
+  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.
+
 EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support
 CONFIG_SCSI_EATA
-  This driver supports all the EATA/DMA-compliant SCSI host adapters.
-  DPT ISA and all EISA i/o addresses are probed looking for the "EATA"
-  signature. If you said Y to "PCI support", 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 SCSI-HOWTO,
-  available via FTP (user: anonymous) at 
+  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
+  SCSI-HOWTO, available via FTP (user: anonymous) at
   ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
 
   Note that there is also another driver for the same hardware
@@ -4330,26 +4376,25 @@ 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.
+  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 definetly reduces the average seek distance when doing
+  CDROMs. 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
 CONFIG_SCSI_EATA_MAX_TAGS
-  This specifies how many SCSI commands can be maximally queued for each
-  probed SCSI device. You should reduce the default value of 16 only if
-  you have disks with buggy or limited tagged command support.
+  This specifies how many SCSI commands can be maximally queued for
+  each probed SCSI device. You should reduce the default value of 16
+  only if you have disks with buggy or limited tagged command support.
   Minimum is 2 and maximum is 62. This value is also the window size
-  used by the elevator sorting option above.
-  The effective value used by the driver for each probed SCSI device is 
-  reported at boot time.
+  used by the elevator sorting option above. The effective value used
+  by the driver for each probed SCSI device is reported at boot time.
 
 NCR53c406a SCSI support
 CONFIG_SCSI_NCR53C406A
@@ -4373,7 +4418,8 @@ CONFIG_SCSI_DC390T
   
   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.
+  Also note that there is another generic Am53C974 driver,
+  "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),
@@ -4403,13 +4449,24 @@ CONFIG_SCSI_AM53C974
   ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, is for you.
 
   Note that there is another driver for AM53C974 based adapters:
-  "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above.
+  "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.
 
+AMI MegaRAID support
+CONFIG_SCSI_MEGARAID
+  This driver supports the AMI MegaRAID 428 and 438 (and maybe 466)
+  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.
+
 GDT SCSI Disk Array Controller support
 CONFIG_SCSI_GDTH
   This is a driver for all SCSI Disk Array Controllers (EISA/ISA/PCI) 
@@ -4421,36 +4478,59 @@ CONFIG_SCSI_GDTH
   If you want to compile it as a module, say M here and read
   Documentation/modules.txt.
 
-IOMEGA Parallel Port ZIP drive SCSI support
+IOMEGA parallel port (ppa - older drives)
 CONFIG_SCSI_PPA
-  This driver supports the parallel port version of IOMEGA's ZIP drive
-  (a 100 MB removable media device). 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 via FTP (user: anonymous) from
+  This driver supports older versions of IOMEGA's parallel port ZIP
+  drive (a 100 MB removable media device).
+
+  Note that you can say N here if you have the SCSI version of the ZIP
+  drive: it will be supported automatically if you said Y to the
+  generic "SCSI disk support", above.
+
+  If you have the ZIP Plus drive or a more recent parallel port ZIP
+  drive (if the supplied cable with the drive is labeled "AutoDetect")
+  then you should say N here and Y to "IOMEGA parallel port (imm -
+  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 via FTP (user: anonymous) from
   ftp://metalab.unc.edu/pub/Linux/docs/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
+  this driver as a module, say M here and read
+  Documentation/modules.txt. The module will be called ppa.o. 
+
+IOMEGA parallel port (imm - newer drives)
+CONFIG_SCSI_IMM
+  This driver supports newer versions of IOMEGA's parallel port ZIP
+  drive (a 100 MB removable media device).
+
   Note that you can say N here if you have the SCSI version of the ZIP
   drive: it will be supported automatically if you said Y to the
   generic "SCSI disk support", above.
 
-  The ZIP Plus drive is supported by the imm driver, also more recent
-  parallel port ZIP drives use an imm compatible interface. If the
-  supplied cable with the drive is labeled "AutoDetect" then you will
-  need the imm driver.
+  If you have the ZIP Plus drive or a more recent parallel port ZIP
+  drive (if the supplied cable with the drive is labeled "AutoDetect")
+  then you should say Y here; if you have an older ZIP drive, say N
+  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 via FTP (user: anonymous) from
+  ftp://metalab.unc.edu/pub/Linux/docs/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
   this driver as a module, say M here and read
-  Documentation/modules.txt. The module will be called ppa.o. 
-
-IOMEGA Parallel Port ZIP drive SCSI support
-CONFIG_SCSI_IMM
-  All "new and improved" parallel port to SCSI interface from Iomega.
-  Please read the comments for the ppa driver for further information
+  Documentation/modules.txt. The module will be called imm.o. 
 
 Force the Iomega ZIP drivers to use EPP-16
 CONFIG_SCSI_IZIP_EPP16
@@ -4460,19 +4540,20 @@ CONFIG_SCSI_IZIP_EPP16
 
   Some parallel port chipsets are slower than their motherboard, and
   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. 
+  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
 CONFIG_SCSI_IZIP_SLOW_CTR
-  Some parallel ports are known to have excessive delays between changing
-  the parallel port control register and good data being available on
-  the parallel port data/status register. This option forces a small delay
-  (1.0 usec to be exact) after changing the control register to let things
-  settle out. Enabling this option may result in a big drop in performance
-  but some very old parallel ports (found in 386 vintage machines) will
-  not work properly.
+  Some parallel ports are known to have excessive delays between
+  changing the parallel port control register and good data being
+  available on the parallel port data/status register. This option
+  forces a small delay (1.0 usec to be exact) after changing the
+  control register to let things settle out. Enabling this option may
+  result in a big drop in performance but some very old parallel ports
+  (found in 386 vintage machines) will not work properly.
 
   Generally, saying N is fine.
 
@@ -4561,11 +4642,11 @@ CONFIG_SCSI_POWERTECSCSI
 
 Network device support?
 CONFIG_NETDEVICES
-  You can say N here if you don't intend to connect 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 via FTP (user: anonymous) in
+  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 via FTP (user: anonymous) in
   ftp://metalab.unc.edu/pub/Linux/docs/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
@@ -4585,9 +4666,9 @@ CONFIG_NETDEVICES
   newer replacement for SLIP) or PLIP (Parallel Line Internet Protocol
   is mainly used to create a mini network by connecting the parallel
   ports of two local machines) or AX.25/KISS (protocol for sending
-  Internet traffic over radio links).
+  Internet traffic over amateur radio links).
 
-  Make sure to read the NET-2-HOWTO. Eventually, you will have to read
+  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 ftp://metalab.unc.edu:/pub/Linux/docs/LDP. If
   unsure, say Y.
@@ -4628,7 +4709,7 @@ CONFIG_SLIP
   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-2-HOWTO, available via FTP (user: anonymous) in
+  NET-3-HOWTO, available via FTP (user: anonymous) in
   ftp://metalab.unc.edu/pub/Linux/docs/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
@@ -4655,7 +4736,7 @@ CONFIG_SLIP_COMPRESSED
   anonymous) from
   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-2-HOWTO, available via FTP
+  definitely want to say Y here. The NET-3-HOWTO, available via FTP
   (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO,
   explains how to configure CSLIP. This won't enlarge your kernel.
 
@@ -4757,8 +4838,9 @@ CONFIG_WAVELAN
   radio frequencies 900 MHz and 2.4 GHz.
   
   This driver support the ISA version of the WaveLAN card. A separate
-  driver for the pcmcia hardware is available in David Hinds'
-  pcmcia-cs package (see the file Documentation/Changes for location).
+  driver for the PCMCIA (PC-card) hardware is available in David
+  Hinds' pcmcia-cs package (see the file Documentation/Changes for
+  location).
 
   If you want to use an ISA WaveLAN card under Linux, say Y and read
   the Ethernet-HOWTO, available via FTP (user: anonymous) in
@@ -4848,7 +4930,7 @@ CONFIG_PLIP
   If you want to use PLIP, say Y and read the PLIP mini-HOWTO,
   available via FTP (user: anonymous) in
   ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini as well as the
-  NET-2-HOWTO in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that
+  NET-3-HOWTO in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that
   the PLIP protocol was changed and this PLIP driver won't work
   together with the PLIP support in Linux versions 1.0.x. This option
   enlarges your kernel by about 8 KB.
@@ -4864,11 +4946,15 @@ CONFIG_EQUALIZER
   If you have two serial connections to some other computer (this
   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 to be supported at the other end as well, either with a similar
-  EQL Linux driver or with a Livingston Portmaster 2e. Say Y if you
-  want this and read Documentation/networking/eql.txt. 
+  lines) or PPP (a better SLIP) on them, 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 EQL
+  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
+  via FTP (user: anonymous) from
+  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4985,16 +5071,18 @@ CONFIG_WAN_ROUTER
   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
-  wish to use your Linux box as a WAN router, say Y here and to the
-  WAN driver for your card, below. You will also need a wan-tools
-  package available via FTP (user: anonymous) from
+  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 via FTP (user: anonymous) from
   ftp://ftp.sangoma.com. Read Documentation/networking/wan-router.txt
   for more information.
 
-  WAN routing support is always built as a module ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want). The module is called wanrouter.o. For general information
-  about modules read Documentation/modules.txt.
+  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.
+
+  If unsure, say N.
 
 Fast switching (read help!)
 CONFIG_NET_FASTROUTE
@@ -5200,30 +5288,42 @@ CONFIG_NET_PROFILE
 Comtrol Hostess SV-11 support
 CONFIG_HOSTESS_SV11
   This is a network card for low speed synchronous serial links, at
-  up to 256Kbits. It supports both PPP and Cisco HDLC
+  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
 CONFIG_COSA
-  This is a driver for COSA and SRP synchronous serial boards.
-  These boards enable 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. The cards can work
-  as the character device, synchronous PPP network device, or the Cisco
-  HDLC network device.
+  This is a driver for COSA and SRP synchronous serial boards. These
+  boards allow 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. The cards can work as the
+  character device, synchronous PPP network device, or the Cisco HDLC
+  network device.
 
   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
+  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
   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 itself.
+  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.
 
+Red Creek Hardware VPN (EXPERIMENTAL)
+CONFIG_RCPCI
+  This is a driver for hardware which provides a Virtual Private
+  Network (VPN). Say Y if you have it.
+
+  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.
+  
 WAN Drivers
 CONFIG_WAN_DRIVERS
   Say Y to this option if your Linux box contains a WAN card and you
@@ -5514,7 +5614,6 @@ CONFIG_ACENIC
   say M here and read Documentation/modules.txt. This is recommended.
   The module will be called acenic.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
@@ -5522,6 +5621,11 @@ CONFIG_LANCE
   ftp://metalab.unc.edu/pub/Linux/docs/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.
+
 3COM cards
 CONFIG_NET_VENDOR_3COM
   If you have a network (Ethernet) card belonging to this class, say Y
@@ -6148,11 +6252,11 @@ CONFIG_NET_POCKET
   one of those, say Y and read the Ethernet-HOWTO, available via FTP
   (user: anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
 
-  If you want to plug a network card into the PCMCIA slot of your
-  laptop instead (PCMCIA is the standard for credit card size
-  extension cards used by all modern laptops), look on the FTP site
-  (user: anonymous) ftp://cb-iris.stanford.edu/pub/pcmcia and say N
-  here.
+  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.
 
   Laptop users should read the Linux Laptop home page at
   http://www.cs.utexas.edu/users/kharker/linux-laptop/ (to browse the
@@ -6283,6 +6387,16 @@ CONFIG_HIPPI
   under Linux, say Y here (you must also remember to enable the driver
   for your HIPPI card below). Most people will say N here.
   
+CERN HIPPI PCI adapter support
+CONFIG_CERN_HIPPI
+  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 cern_hippi.o. If you want to compile it as
+  a module, say M here and read Documentation/modules.txt. If unsure,
+  say N.
+
 Essential RoadRunner HIPPI PCI adapter support
 CONFIG_ROADRUNNER
   Say Y here if this is your PCI HIPPI network card.
@@ -6745,7 +6859,7 @@ CONFIG_MSDOS_FS
 vfat fs support
 CONFIG_VFAT_FS
   This option provides support for normal Windows filesystems with
-  long filenames. That includes noncompressed FAT-based filesystems
+  long filenames. That includes non-compressed FAT-based filesystems
   used by Windows 95, Windows 98, Windows NT 4.0, and mtools. 
 
   You cannot use the VFAT filesystem for your Linux root partition
@@ -6792,21 +6906,24 @@ CONFIG_PROC_FS
   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. The
-  filesystem is explained in the Kernel Hacker's Guide at
-  http://www.redhat.com:8080/HyperNews/get/khg.html on the WWW (to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape), and also on the proc(8)
-  manpage ("man 8 proc").
+  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
   (there is a small number of Interrupt ReQuest lines in your computer
   that are used by the attached devices to gain the CPU's attention --
   often a source of trouble if two devices are mistakenly configured
-  to use the same IRQ). This option will enlarge your kernel by about
-  18 kB. Several programs depend on this, so everyone should say Y
-  here.
+  to use the same IRQ). 
+
+  The /proc filesystem is explained in the file
+  Documentation/proc.txt, in the Kernel Hacker's Guide at
+  http://www.redhat.com:8080/HyperNews/get/khg.html on the WWW (to
+  browse the WWW, you need to have access to a machine on the Internet
+  that has a program like lynx or netscape), and also on the proc(8)
+  manpage ("man 8 proc").
+
+  This option will enlarge your kernel by about 18 KB. Several
+  programs depend on this, so everyone should say Y here.
 
 NFS filesystem support
 CONFIG_NFS_FS
@@ -6834,11 +6951,11 @@ CONFIG_NFS_FS
   say M here and read Documentation/modules.txt. 
 
   If you are configuring a diskless machine which will mount its root
-  filesystem over NFS at boot time, say Y here and to "Root file
-  system on NFS" and to "IP: kernel level autoconfiguration". 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 (user: anonymous) from
+  filesystem over NFS at boot time, say Y here and to "IP: kernel
+  level 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/ .
 
   If you don't know what all this is about, say N.
@@ -6942,7 +7059,7 @@ CONFIG_SYSV_FS
   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 filesystem in Documentation/filesystems/sysv-fs.txt.
-  Saying Y here will enlarge your kernel by about 34 kB.
+  Saying Y here will enlarge your kernel by about 34 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),
@@ -7004,7 +7121,9 @@ CONFIG_ROMFS_FS
 QNX filesystem support (EXPERIMENTAL)
 CONFIG_QNX4FS_FS  
   This is the filesystem used by the operating system QNX 4. Say Y if
-  you intend to mount QNX hard disks or floppies.
+  you intend to mount QNX hard disks or floppies. Unless you say Y to
+  "QNXFS read-write support" below, you will only be able to read
+  these filesystems.
 
   This filesystem support is also available as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
@@ -7013,6 +7132,10 @@ CONFIG_QNX4FS_FS
 
   If unsure, say N.
 
+QNXFS read-write support (FOR TESTING ONLY)
+CONFIG_QNX4FS_RW
+  Say Y if you want to test write support for QNX filesystems.
+
 Kernel automounter support
 CONFIG_AUTOFS_FS
   The automounter is a tool to automatically mount remote filesystems
@@ -7038,7 +7161,8 @@ CONFIG_UFS_FS
   OpenBSD and NeXTstep) use a filesystem called UFS. Some System V
   Unixes can create and mount hard disk partitions and diskettes using
   this filesystem as well. Saying Y here will allow you to read from
-  these partitions and diskettes.
+  these partitions; if you also want to write to them, say Y to the
+  experimental "UFS filesystem write support", below.
 
   If you only intend to mount files from some other Unix over the
   network using NFS, you don't need the UFS filesystem support (but
@@ -7060,44 +7184,42 @@ CONFIG_UFS_FS
 
   If you haven't heard about all of this before, it's safe to say N.
 
-UFS filesystem write support
+UFS filesystem write support (experimental)
 CONFIG_UFS_FS_WRITE
-  You will be able to write to 4.4BSD (e.g. FreeBSD, NetBSD and
-  OpenBSD) and SunOS partitions and diskettes if you say Y to this
-  option in addition to "UFS filesystem support", above.
+  Say Y here if you want to try writing to UFS partitions. This is
+  experimental, so you should back up your UFS partitions beforehand.
 
 BSD disklabel (FreeBSD partition tables) support
 CONFIG_BSD_DISKLABEL
   FreeBSD uses its own hard disk partition scheme on your PC. It
   requires only one entry in the primary partition table of your disk
   and manages it similarly to DOS extended partitions, putting in its
-  first sector a new partition table in disklabel format. Saying Y
+  first sector a new partition table in BSD disklabel format. Saying Y
   here allows you to read these disklabels and further mount FreeBSD
-  partitions read-only from within Linux if you have also said Y to
-  "UFS filesystem support", above. If you don't know what all this
-  is about, say N.
+  partitions from within Linux if you have also said Y to "UFS
+  filesystem support", above. If you don't know what all this is
+  about, say N.
 
 SMD disklabel (Sun partition tables) support
 CONFIG_SMD_DISKLABEL
   Like most systems, SunOS uses its own hard disk partition table
   format, incompatible with all others. Saying Y here allows you to
-  read these partition tables and further mount SunOS disks read-only
-  from within Linux if you have also said Y to "UFS filesystem
-  support", above. This is mainly used to carry data from a SPARC
-  under SunOS to your Linux box via a removable medium like
-  magneto-optical or ZIP 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"). If you don't know what all this is about,
-  say N.
+  read these partition tables and further mount SunOS disks from
+  within Linux if you have also said Y to "UFS filesystem support",
+  above. This is mainly used to carry data from a SPARC under SunOS to
+  your Linux box via a removable medium like magneto-optical or ZIP
+  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"). If
+  you don't know what all this is about, say N.
 
 Solaris (x86) partition table support
 CONFIG_SOLARIS_X86_PARTITION
   Like most systems, Solaris x86 uses its own hard disk partition
   table format, incompatible with all others. Saying Y here allows you
   to read these partition tables and further mount Solaris x86 disks
-  read-only from within Linux if you have also said Y to "UFS
-  filesystem support", above.
+  from within Linux if you have also said Y to "UFS filesystem
+  support", above.
 
 ADFS filesystem support (read only) (EXPERIMENTAL)
 CONFIG_ADFS_FS
@@ -7127,27 +7249,29 @@ CONFIG_DEVPTS_FS
   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. The
-  GNU C library glibc 2.1 contains the requisite support for this mode
-  of operation; you also need clients that use the Unix98 API.
+  traditionally /dev/ttyp2 will then be /dev/pts/2, for example. 
 
-Unixware slices support (EXPERIMENTAL)
-CONFIG_UNIXWARE_DISKLABEL
-  Like some systems, Unixware uses, except DOS-like partition table,
-  its own slice table inside a partition (VTOC - Virtual Table of
-  Contents). Its format is incompatible with all other OSes. Saying Y
-  here allows you to read VTOC and further mount Unixware partitions
-  read-only from within Linux if you have also said Y to "UFS 
-  filesystem support" or "System V and Coherent filesystem support", 
-  above.
+  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.
 
-  This is mainly used to carry data from a Unixware box to your
+UnixWare slices support (EXPERIMENTAL)
+CONFIG_UNIXWARE_DISKLABEL
+  Like some systems, UnixWare uses its own slice table inside a
+  partition (VTOC - Virtual Table of Contents). Its format is
+  incompatible with all other OSes. Saying Y here allows you to read
+  VTOC and further mount UnixWare partitions read-only from within
+  Linux if you have also said Y to "UFS filesystem support" or "System
+  V and Coherent filesystem support", above.
+
+  This is mainly used to carry data from a UnixWare box to your
   Linux box via a removable medium like magneto-optical, ZIP or
   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"). If you don't know what all this is about,
-  say N.
+  preferably "info tar"). 
+
+  If you don't know what all this is about, say N.
 
 Macintosh partition map support
 CONFIG_MAC_PARTITION
@@ -7286,29 +7410,6 @@ CONFIG_NCPFS_NDS_DOMAINS
   servers. Do not say Y if security is primary for you because root
   can read your session key (from /proc/kcore).
 
-nls: Native language codepages and Unicode support
-CONFIG_NLS
-  This is required by the FAT and NTFS filesystems and by the ISO 9660
-  filesystem when it is compiled with Joliet support. Joliet is a
-  Microsoft extension for CDROMs that supports Unicode. This allows
-  translation between different character sets. 
-
-  When dealing with the FAT based filesystems, there are two character
-  sets that are important. The first is the codepage. Codepages are
-  character sets that are used by DOS to allow filenames to have
-  native language characters when character sets were limited to 256
-  characters. The codepage is the character set that is used to store
-  native language characters on disk. The two most common codepages
-  are 437 in the United States and 850 in much of Europe.
-
-  The second important character set is the input/output character
-  set. This is the character set that is displayed on the screen. In
-  the United States, this will almost always be the ISO 8859-1
-  character set. This is the default.
-
-  Linux will only translate the FAT filenames, not the contents of the
-  files.
-
 nls codepage 437
 CONFIG_NLS_CODEPAGE_437
   The Microsoft fat filesystem family can deal with filenames in
@@ -7851,14 +7952,22 @@ CONFIG_ESPSERIAL
   and read Documentation/modules.txt. The module will be called esp.o.
   If unsure, say N.
 
+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
+  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
+
 Unix98 PTY support
 CONFIG_UNIX98_PTYS
   A pseudo terminal (PTY) is a software device consisting of two
   halves: a master and a slave. The slave device behaves identical to
   a physical terminal; the master device is used by a process to
   read data from and write data to the slave, thereby emulating a
-  terminal. Typical programs for the master side are xterm and telnet
-  servers. 
+  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
@@ -7873,9 +7982,10 @@ CONFIG_UNIX98_PTYS
   filesystem; therefore, if you say Y here you should say Y to
   "/dev/pts filesystem for Unix98 PTYs" as well.
 
-  You should say Y here only if your C library is glibc 2.1 or later
-  (equal to libc-6.1, check with "ls -l /lib/libc.so.*"). Read the
-  instructions in Documentation/Changes.
+  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 save to say N.
 
 Maximum number of Unix98 PTYs in use (0-2048)
 CONFIG_UNIX98_PTY_COUNT
@@ -8183,7 +8293,7 @@ CONFIG_FT_NORMAL_DEBUG
 
   Ftape can print lots of debugging messages to the system console
   resp. kernel log files. Reducing the amount of possible debugging
-  output reduces the size of the kernel module by some kb, so it might
+  output reduces the size of the kernel module by some KB, so it might
   be a good idea to use "None" for emergency boot floppies.
 
   If you want to save memory then the following strategy is
@@ -8498,36 +8608,28 @@ Ignore multiple suspend/resume cycles
 CONFIG_APM_IGNORE_SUSPEND_BOUNCE
   This option is necessary on the Dell Inspiron 3200 and others, but
   should be safe for all other laptops. When enabled, a system suspend
-  event that occurs within three seconds of a resume is ignored. Without
-  this the Inspiron will shut itself off a few seconds after you open
-  the lid, requiring you to press the power button to resume it a
-  second time.
-  Say Y.
+  event that occurs within three seconds of a resume is ignored.
+  Without this the Inspiron will shut itself off a few seconds after
+  you open the lid, requiring you to press the power button to resume
+  it a second time. Say Y.
 
 RTC stores time in GMT
 CONFIG_APM_RTC_IS_GMT
-  This option can be used when your RTC (Real Time Clock aka. Hardware
-  Clock) stores the time in GMT (Greenwich Mean Time) rather than
-  localtime. When suspending/resuming, the kernel needs to know what
-  is stored in the RTC so it can update the system clock (which is
-  always GMT). Without this option the kernel attempts to measure
-  the offset between the RTC and the system clock. This means you
-  can loose one second on each suspend/resume cycle.
-  Also, on the Dell Inspiron 3200, the hardware slows down the system
-  even before the kernel can measure the RTC/system clock offset. It
-  can then take 15 seconds to do this measurement and it can be
-  incorrect by several seconds.
-  Say Y if GMT is stored in your RTC.
-  GMT is usually the best anyway, because you don't have to worry about
-  daylight savings time changes. The only reason to not use GMT in
-  your RTC is if you also run a broken OS that doesn't understand GMT.
+  Say Y here if your RTC (Real Time Clock a.k.a. hardware clock)
+  stores the time in GMT (Greenwich Mean Time). Say N if your RTC
+  stores localtime.
+
+  It is in fact recommended to store GMT in your RTC, because then you
+  don't have to worry about daylight savings time changes. The only
+  reason not to use GMT in your RTC is if you also run a broken OS
+  that doesn't understand GMT.
 
 Allow interrupts during APM BIOS calls
 CONFIG_APM_ALLOW_INTS
   Normally we disable external interrupts while we are making calls to
   the APM BIOS as a measure to lessen the effects of a badly behaving
-  BIOS implementation.  The BIOS should reeanble interrupts if it
-  needs to.  Unfortunately, some BIOS's do not - especially those in
+  BIOS implementation.  The BIOS should reenable interrupts if it
+  needs to.  Unfortunately, some BIOSes do not - especially those in
   many of the newer IBM Thinkpads.  If you experience hangs when you
   suspend, try setting this to Y.  Otherwise, say N.
 
@@ -8640,8 +8742,9 @@ CONFIG_RTC
   24 hour alarm. It reports status information via the file /proc/rtc
   and its behaviour is set by various ioctls on /dev/rtc.
 
-  If you enabled CONFIG_SMP, you should say Y here to read and set the
-  RTC clock in an SMP compatible fashion.
+  If you run Linux on a multiprocessor machine and said Y to
+  "Symmetric Multi Processing" above, you should say Y here to read
+  and set the RTC clock 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
@@ -8661,14 +8764,16 @@ CONFIG_NVRAM
   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. This memory is conventionally called "CMOS RAM" on PCs
-  and "NVRAM" on Ataris. /dev/nvram may be used to view settings
-  there, or to change them (with some utility). It could also be used
-  to frequently save a few bits of very important data that may not be
-  lost over power-off and for which writing to disk is too insecure. Note
-  however that most NVRAM space in a PC belongs to the BIOS and you should
-  NEVER idly tamper with it. See Ralf Browns interrupt list for a guide to 
-  the use of CMOS bytes by your BIOS.
+  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
+  change them (with some utility). It could also be used to frequently
+  save a few bits of very important data that may not be lost over
+  power-off and for which writing to disk is too insecure. Note
+  however that most NVRAM space in a PC belongs to the BIOS and you
+  should NEVER idly tamper with it. See Ralf Brown's interrupt list
+  for a guide to the use of CMOS bytes by your BIOS.
 
   On Atari machines, /dev/nvram is always configured and does not need
   to be selected.
@@ -8761,7 +8866,7 @@ CONFIG_JOY_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-parport.txt and
+  please read Documentation/joystick.txt and
   Documentation/joystick-parport.txt
 
 Amiga joysticks
@@ -8786,12 +8891,14 @@ 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
   about your sound card and its configuration down (I/O port,
-  interrupt and DMA channel), because you will be asked for it. You
-  want to read the Sound-HOWTO, available via FTP (user: anonymous)
-  from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. There is also some
-  information in various README files in drivers/sound, esp. in
-  Readme.cards which you should read first to find out whether your
-  card is supported by Linux, and, if yes, which driver to use.
+  interrupt and DMA channel), because you will be asked for it. 
+
+  You want to read the Sound-HOWTO, available via FTP (user:
+  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/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.
 
   If you have a PnP sound card and you want to configure it at boot
   time using the ISA PnP tools (read
@@ -8802,7 +8909,8 @@ CONFIG_SOUND
   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
-  drivers/sound/Readme.modules; the module will be called sound.o.
+  Documentation/sound/README.modules; the module will be called
+  sound.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.
@@ -8825,7 +8933,7 @@ CONFIG_SOUND_SGALAXY
 
 Support for AD1816(A) based cards (EXPERIMENTAL)
 CONFIG_SOUND_AD1816
-  Say M here if you have a soundcard based on the Analog Devices 
+  Say M here if you have a sound card based on the Analog Devices 
   AD1816(A) chip.
 
   NOTE: This driver is still EXPERIMENTAL. 
@@ -8846,25 +8954,23 @@ CONFIG_SOUND_PAS
 
 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 Labs or a 100% hardware compatible clone (like the
-  Thunderboard or SM Games). If your card was in the list of supported
-  cards look at the card specific instructions in the
-  drivers/sound/Readme.cards file before answering this question. For
-  an unknown card you may answer Y if the card claims to be
-  Sound Blaster-compatible. 
+  Answer Y if you have an original Sound Blaster card made by Creative
+  Labs or a 100% hardware compatible clone (like the Thunderboard or
+  SM Games). For an unknown card you may answer Y if the card claims
+  to be Sound Blaster-compatible.
 
-  You can say M here to compile this driver as a module; the module is
-  called sb.o.
+  Please read the file Documentation/sound/Soundblaster.
 
   You should also say Y here for cards based on the Avance Logic
-  ALS-007 chip (read Documentation/sound/ALS007) and for ESS1688 and
-  ESS1868 cards (read Documentation/sound/ESS1868). If you have an SB
-  AWE 32 or SB AWE 64, say Y here and also to "Additional lowlevel
-  drivers" and to "SB32/AWE support" below. If you have an IBM Mwave
-  card, say Y here and read Documentation/sound/mwave.
+  ALS-007 chip (read Documentation/sound/ALS007) 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 "Additional lowlevel drivers" and to "SB32/AWE
+  support" below and read Documentation/sound/INSTALL.awe. If you have
+  an IBM Mwave card, say Y here and read Documentation/sound/mwave.
   
-  Please read Documentation/sound/Soundblaster.
+  You can say M here to compile this driver as a module; the module is
+  called sb.o.
 
 Generic OPL2/OPL3 FM synthesizer support
 CONFIG_SOUND_ADLIB
@@ -9165,19 +9271,20 @@ CONFIG_LOWLEVEL_SOUND
 
 ACI mixer (miroPCM12/PCM20)
 CONFIG_ACI_MIXER
-  Audio Command Interface (ACI) driver. ACI is a protocol used to
-  communicate with the microcontroller on some sound cards produced by
-  miro, e.g. the miroSOUND PCM12 and PCM20. The main function of the
-  ACI is to control the mixer and to get a product identification.
+  ACI (Audio Command Interface) is a protocol used to communicate with
+  the microcontroller on some sound cards produced by miro, e.g. the
+  miroSOUND PCM12 and PCM20. The main function of the ACI is to
+  control the mixer and to get a product identification. 
+
   This Voxware ACI driver currently only supports the ACI functions on
   the miroSOUND PCM12 and PCM20 cards. On the PCM20, ACI also controls
-  the radio tuner. This is supported in the video4linux radio-miropcm20
-  driver.
+  the radio tuner. This is supported in the video4linux
+  radio-miropcm20 driver.
 
 SB32/AWE support
 CONFIG_AWE32_SYNTH
   Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or
-  similar sound card. See drivers/sound/lowlevel/README.awe,
+  similar sound card. See Documentation/sound/README.awe,
   Documentation/sound/AWE32 and the Soundblaster-AWE mini-HOWTO,
   available via FTP (user: anonymous) from
   ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini for more info.
@@ -9240,9 +9347,9 @@ CONFIG_AEDSP16_MSS_IRQ
 
 Audio Excel DSP 16 DMA
 CONFIG_AEDSP16_MSS_DMA
-  This is the IRQ of the Audio Excel DSP 16 card. It must be 0, 1 or 3.
-  If you compiled aedsp16.o as a module you can specify this parameter
-  as 'dma=NN'.
+  This is the IRQ of the Audio Excel DSP 16 card. It must be 0, 1 
+  or 3. If you compiled aedsp16.o as a module you can specify this
+  parameter as 'dma=NN'.
 
 SC-6600 based audio cards (new Audio Excel DSP 16)
 CONFIG_SC6600
@@ -9252,28 +9359,30 @@ CONFIG_SC6600
 
 SC-6600 Joystick Interface
 CONFIG_SC6600_JOY
-  This option activate the Joystick interface of Audio Excel DSP 16 card.
+  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 option activate the CDROM interface of Audio Excel DSP 16 card.
-  Required parameter can be: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for
-  no CDROM present.
+  This is used to activate the the CDROM interface of the Audio Excel
+  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
+  CDROM present.
 
 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 say Y to "MPU-401 support".
-  You have to 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 the parameter 'mpu_base=0xNNN'.
+  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
+  the parameter 'mpu_base=0xNNN'.
 
 MPU401 IRQ for Audio Excel DSP 16
 CONFIG_AEDSP16_MPU_IRQ
-  This is the IRQ of the MPU-401 emulation of Audio Excel DSP 16 card.
-  It must be 5, 7, 9, 10 or 0 (to disable MPU-401 interface). If you
-  compiled aedsp16.o as a module you can specify this parameter as
+  This is the IRQ of the MPU-401 emulation of your Audio Excel DSP 16
+  card. It must be 5, 7, 9, 10 or 0 (to disable MPU-401 interface). If
+  you compiled aedsp16.o as a module you can specify this parameter as
   'mpu_irq=NN'.
 
 Ensoniq ES1370 based PCI sound cards
@@ -9301,14 +9410,18 @@ CONFIG_SOUND_ES1371
   models are either ES1370 or ES1371 based. This driver differs
   slightly from OSS/Free, so PLEASE READ Documentation/sound/es1371.
 
+Joystick support at boot time
+CONFIG_SOUND_ES1371_JOYPORT_BOOT
+  Say Y here to use the joystick port of your sound card.
+
 Gameport I/O-range selection
 CONFIG_SOUND_ES1371_GAMEPORT
-  Select the I/O-range of the gameport on a ES1371 based soundcard.
+  Select the I/O-range of the gameport on a ES1371 based sound card.
   The card uses 8 ioports and the gameport is available at all eight
   ioports. Legal hexadecimal values are 200, 208, 210 and 218.
   The joystick driver will by default use 0x201. 
   Leave the default 200 unless you have a joystick not attached
-  to your soundcard.
+  to your sound card.
 
 S3 SonicVibes based PCI sound cards
 CONFIG_SOUND_SONICVIBES
@@ -9744,12 +9857,10 @@ CONFIG_MAC
 
 HP9000/300 support
 CONFIG_HP300
-  This option enables support for the HP9000/300 series of workstations.
-  Support for these machines is still very experimental.  If you plan to
-  try to use the kernel on such a machine say Y here.  Everybody else
-  says N.
-
-# CONFIG_APOLLO, etc. coming soon (?)
+  This option enables support for the HP9000/300 series of
+  workstations. Support for these machines is still very experimental.
+  If you plan to try to use the kernel on such a machine say Y here.
+  Everybody else says N.
 
 68020 support
 CONFIG_M68020
@@ -10199,13 +10310,14 @@ CONFIG_HPDCA
 
 HP on-board LANCE support
 CONFIG_HPLANCE
-  If you want to use the builtin "LANCE" Ethernet controller on an HP300
-  machine, say Y here.
+  If you want to use the builtin "LANCE" Ethernet controller on an
+  HP300 machine, say Y here.
 
 DIO bus support
 CONFIG_DIO
-  Say Y here to enable support for the "DIO" expansion bus used in HP300
-  machines. If you are using such a system you almost certainly want this.
+  Say Y here to enable support for the "DIO" expansion bus used in
+  HP300 machines. If you are using such a system you almost certainly
+  want this.
 
 MSDOS partition support
 CONFIG_MSDOS_PARTITION
@@ -10516,16 +10628,17 @@ CONFIG_ARCH_ARC
 
 Include support for CATS boards
 CONFIG_CATS
-  Say Y here if you wish to include support for the extra hardware found
-  in Chalice CATS machines. The resulting kernel will still run on an 
-  EBSA-285 but will be slightly larger. If in doubt say N.
+  Say Y here if you wish to include support for the extra hardware
+  found in Chalice CATS machines. The resulting kernel will still run
+  on an EBSA-285 but will be slightly larger. If in doubt say N.
 
 Debug kernel errors
 CONFIG_DEBUG_ERRORS
-  This option controls verbose debugging information which can be printed
-  when the kernel detects an internal error.  Verbose debugging information
-  is useful when tracking down kernel problems, but it will be meaning less
-  for non-kernel hackers.  It's safe for everyone to say Y.
+  This option controls verbose debugging information which can be
+  printed when the kernel detects an internal error. Verbose debugging
+  information is useful when tracking down kernel problems, but it
+  will be meaning less for non-kernel hackers. It's safe for everyone
+  to say Y.
 
 Build Tools Selection
 CONFIG_BINUTILS_NEW
@@ -10541,30 +10654,35 @@ CONFIG_FRAME_POINTER
 
 Initial kernel command line
 CONFIG_CMDLINE
-  On some architectures (EBSA285, EBSA110 and Corel NetWinder), there is
-  currently no way 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 (eg, mem=64M root=/dev/nfs)
+  On some architectures (EBSA285, EBSA110 and Corel NetWinder), there
+  is currently no way 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)
 
 IrDA Protocols
 CONFIG_IRDA
-  Say Y here if you want to build support for the IrDA (TM)
-  protocols. The Infrared Data Associations (tm) specifies standards
-  for wireless infrared communication and is supported by most laptops
-  and PDA's If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  Say Y here if you want to build support for the IrDA (TM) protocols.
+  The Infrared Data Associations (tm) specifies standards for wireless
+  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 the irmanager and probably irattach
-  as well. For more information, visit
-  http://www.cs.uit.no/~dagb/irda/
+  as well. For more information, see the file
+  Documentation/networking/irda.txt. You also want to read the
+  IR-HOWTO, available from
+  ftp://metalab.unc.edu:/pub/Linux/docs/HOWTO.
+
+  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 
 
 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.
+  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.
 
@@ -10572,8 +10690,8 @@ IrDA Fast RR's
 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
-  frame immediately when receiving a frame if its own transmit queue is
-  currently empty. This will give a lot of speed improvement when
+  frame immediately when receiving a frame if its own transmit queue
+  is currently empty. This will give a lot of speed improvement when
   receiving much data since the secondary station will not have to
   wait the max. turn around time before it is allowed to transmit the
   next time. If the transmit queue of the secondary is also empty the
@@ -10597,8 +10715,8 @@ CONFIG_IRDA_RECYCLE_RR
 
 IrDA Debug
 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
+  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
 
   If unsure, say Y (since it makes it easier to find the bugs).
@@ -10608,22 +10726,27 @@ 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
+  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
 CONFIG_IRDA_DEFLATE
   Say Y here if you want to build support for the Deflate compression
-  protocol. If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The deflate compression (GZIP) is exactly
-  the same as used by the PPP protocol. Enabling this option will
-  build a module called irda_deflate.o
+  protocol. The deflate compression (GZIP) is exactly
+  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.
 
 IrLAN Protocol 
 CONFIG_IRLAN
   Say Y here if you want to build support for the IrLAN protocol. If
   you want to compile it as a module, say M here and read
   Documentation/modules.txt. IrLAN emulates an Ethernet and makes it
-  possible to put up an wireless LAN using infrared beams.
+  possible to put up a wireless LAN using infrared beams.
 
 IrLAN Client Protocol 
 CONFIG_IRLAN_CLIENT
@@ -10632,7 +10755,7 @@ CONFIG_IRLAN_CLIENT
   Documentation/modules.txt. The IrLAN client 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 server protocol for ac-hoc networking!
+  the IrLAN server protocol for ad-hoc networking!
 
 IrLAN Server Protocol 
 CONFIG_IRLAN_SERVER
@@ -10642,15 +10765,14 @@ CONFIG_IRLAN_SERVER
   possible to set up a wireless LAN with a machine running the IrLAN
   client protocol. Notice that the IrLAN server protocol currently
   only emulates an access point and does not implement the ad-hoc
-  specification of IrLAN, but this will not be noticeable for the
-  user.
+  specification of IrLAN, but this will not be noticeable by the user.
 
 IrOBEX Protocol
 CONFIG_IROBEX
   Say Y here if you want to build support for the IrOBEX protocol. If
   you want to compile it as a module, say M here and read
   Documentation/modules.txt. The module does not actually implement
-  the IrOBEX protocol since that protocol lives in userspace, but it 
+  the IrOBEX protocol since that protocol lives in user space, but it 
   contains the necessary functions to interface the user-space stuff
   with the kernel. So you will need to have the user-space library and
   programs that can use this library installed as well to be able to
@@ -10707,11 +10829,11 @@ CONFIG_IRTTY_SIR
 
 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. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. This driver should be used for
-  the IrDA chipset in the Corel NetWinder. The driver supports SIR,
-  MIR and FIR (4Mbps) speeds.
+  Say Y here if you want to build IrDA support for the Winbond
+  W83977AF super-io chipset. If you want to compile it as a module,
+  say M here and read Documentation/modules.txt. This driver should be
+  used for the IrDA chipset in the Corel NetWinder. The driver
+  supports SIR, MIR and FIR (4Mbps) speeds.
 
 NSC PC87108 IrDA Device Driver
 CONFIG_NSC_FIR
@@ -10836,11 +10958,13 @@ CONFIG_BVME6000_SCC
 
 #
 # A couple of things I keep forgetting:
-#   capitalize: AppleTalk, Ethernet, DMA, FTP, Internet, Intel, IRQ, 
-#               Linux, NetWare, NFS, PCI, SCSI, SPARC
+#   capitalize: AppleTalk, Ethernet, DOS, DMA, FAT, FTP, Internet, 
+#               Intel, IRQ, Linux, MSDOS, NetWare, NetWinder, NFS, 
+#               PCI, SCSI, SPARC
 #   two words:  hard drive, hard disk, sound card, home page
 #   other:      it's safe to save; daemon; use --, not - or ---
 #
+#
 # This is used by Emacs' spell checker ispell.el:
 #
 # LocalWords:  CONFIG coprocessor DX Pentium SX lilo loadlin HOWTO ftp metalab
@@ -10863,7 +10987,7 @@ CONFIG_BVME6000_SCC
 # LocalWords:  COM ELPLUS Com EtherLinkIII VLB Arcnet Cabletron DEPCA DE carlos
 # LocalWords:  depca EtherWorks EWRK ewrk SEEQ EtherExpress EEXPRESS NI xxx dia
 # LocalWords:  EtherExpress WaveLAN wavelan PCLAN HPLAN VG SK Ansel Xen de ZNET
-# LocalWords:  PCMCIA cb stanford pcmcia LAN TEC RealTek ATP atp DLINK NetTools
+# LocalWords:  PCMCIA cb stanford LAN TEC RealTek ATP atp DLINK NetTools VISWS
 # LocalWords:  TR Sony CDU caddyless cdu Mitsumi MCD cd mcd XA MultiSession CDA
 # LocalWords:  Matsushita Panasonic SBPCD Soundblaster Longshine sbpcd Aztech
 # LocalWords:  Okano Wearnes AZTCD CDD SE aztcd sonycd Goldstar GSCD Philips fs
@@ -10893,7 +11017,7 @@ CONFIG_BVME6000_SCC
 # LocalWords:  PMAX MILO Alphas Multia Tseng linuxelf endian mipsel mips drv HT
 # LocalWords:  kerneld callouts AdvanSys advansys Admin WDT DataStor EP verden
 # LocalWords:  wdt hdb hdc bugfix SiS vlb Acculogic CSA DTC dtc Holtek ht QDI
-# LocalWords:  QD qd UMC umc ALI ali lena fnet fr azstarnet axplinux cdr fb MDA
+# LocalWords:  QD qd UMC umc ALI ali lena fnet fr azstarnet cdr fb MDA ps esdi
 # LocalWords:  Avanti XL AlphaStations Jensen DECpc AXPpci UDB Cabriolet MCA RC
 # LocalWords:  AlphaPC mca AOUT OUTput PPro sipx gwdg lo nwe FourPort Boca unm
 # LocalWords:  Keepalive linefill RELCOM keepalive analogue CDR conf CDI INIT
@@ -11042,4 +11166,20 @@ CONFIG_BVME6000_SCC
 # LocalWords:  PowerMacs Winbond Algorithmics ALGOR algor ECOFF IRIX SGI SGI's
 # LocalWords:  gfx virtualized Xpmac mklinux XFree FBDev Woodhouse mvhi Seeq fp
 # LocalWords:  SGISEEQ HIgh ADB ADBMOUSE crosscompiler CROSSCOMPILE FPE GDB gdb
-# LocalWords:  JOYPORT rp spoofing DawiControl NOGENSUPP EEPROM HSSI
+# LocalWords:  JOYPORT rp spoofing DawiControl NOGENSUPP EEPROM HSSI Alessandro
+# LocalWords:  singleprocessor tex MATHEMU FRIQ Maxell friq Alcor XLT AlphaBook
+# LocalWords:  AlphaPCI DP LX Miata Mikasa Noritake RPX UX BX Takara EV PRIMO
+# LocalWords:  TSC Matrox Productiva matroxfb matrox multihead ia linuxhq MFW
+# LocalWords:  mfw AAA MCS Initio XXU initio imm AutoDetect IZIP CTR usec HDLC
+# LocalWords:  COSA SRP muni cz kas cosa Alteon AceNIC acenic VTOC OSes GMT SAx
+# LocalWords:  Inspiron localtime INTS Thinkpads Ralf Brown's Flightstick NNN
+# LocalWords:  Xterminator Blackhawk NN mpu ioports DCA HPDCA HPLANCE DIO Corel
+# LocalWords:  GemTek gemtek CMDLINE IrDA PDA's irmanager irattach RR AVA DN
+# 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:  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
+# LocalWords:  IrLPT UIRCC Tecra
index 200716f59720b2e8a21e8bbffb19036848ae6ca6..2dd06948175d52a42fc3965b2695e629f3c6de3a 100644 (file)
@@ -241,7 +241,7 @@ CONFIG_EEXPRESS_PRO100=y
 # CONFIG_ISDN is not set
 
 #
-# CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
+# Old CD-ROM drivers (not SCSI, not IDE)
 #
 # CONFIG_CD_NO_IDESCSI is not set
 
index cd90747961c84d5e160ecd243210e852f125ce3b..3f92afcfe4ab2c1d8fcbc66cc7cfaf6c300422b4 100644 (file)
@@ -43,6 +43,7 @@ EXPORT_SYMBOL(kernel_thread);
 
 EXPORT_SYMBOL_NOVERS(__down_failed);
 EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
+EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
 EXPORT_SYMBOL_NOVERS(__up_wakeup);
 /* Networking helper routines. */
 EXPORT_SYMBOL(csum_partial_copy);
index b57259afc1d8a5289b47f38126b855348f36de1c..e5de575f6da3338b2a680bd71ca7073398081754 100644 (file)
@@ -569,6 +569,9 @@ static int __init assign_irq_vector(int irq)
                printk("WARNING: ASSIGN_IRQ_VECTOR wrapped back to %02X\n",
                       current_vector);
        }
+       if (current_vector == SYSCALL_VECTOR)
+               panic("ran out of interrupt sources!");
+
        IO_APIC_VECTOR(irq) = current_vector;
        return current_vector;
 }
@@ -693,9 +696,11 @@ void __init print_IO_APIC(void)
 
        printk(".... register #01: %08X\n", *(int *)&reg_01);
        printk(".......     : max redirection entries: %04X\n", reg_01.entries);
-       if (    (reg_01.entries != 0x0f) && /* ISA-only Neptune boards */
-               (reg_01.entries != 0x17) && /* ISA+PCI boards */
-               (reg_01.entries != 0x3F)    /* Xeon boards */
+       if (    (reg_01.entries != 0x0f) && /* older (Neptune) boards */
+               (reg_01.entries != 0x17) && /* typical ISA+PCI boards */
+               (reg_01.entries != 0x1b) && /* Compaq Proliant boards */
+               (reg_01.entries != 0x1f) && /* dual Xeon boards */
+               (reg_01.entries != 0x3F)    /* bigger Xeon boards */
        )
                UNEXPECTED_IO_APIC();
        if (reg_01.entries == 0x0f)
@@ -1163,7 +1168,7 @@ static inline void init_IO_APIC_traps(void)
         * 0x80, because int 0x80 is hm, kind of importantish. ;)
         */
        for (i = 0; i < NR_IRQS ; i++) {
-               if (IO_APIC_IRQ(i)) {
+               if (IO_APIC_VECTOR(i) > 0) {
                        if (IO_APIC_irq_trigger(i))
                                irq_desc[i].handler = &ioapic_level_irq_type;
                        else
@@ -1173,8 +1178,15 @@ static inline void init_IO_APIC_traps(void)
                         */
                        if (i < 16)
                                disable_8259A_irq(i);
-               }
+               } else
+                       /*
+                        * we have no business changing low ISA
+                        * IRQs.
+                        */
+                       if (IO_APIC_IRQ(i))
+                               irq_desc[i].handler = &no_irq_type;
        }
+       init_IRQ_SMP();
 }
 
 /*
@@ -1278,14 +1290,12 @@ void __init setup_IO_APIC(void)
                construct_default_ISA_mptable();
        }
 
-       init_IO_APIC_traps();
-
        /*
         * Set up the IO-APIC IRQ routing table by parsing the MP-BIOS
         * mptable:
         */
        setup_IO_APIC_irqs();
-       init_IRQ_SMP();
+       init_IO_APIC_traps();
        check_timer();
 
        print_IO_APIC();
index 37878f59f058bf9d9fc5a3a49404dca0476d08a0..03c4c790a0254c1547af49ba338f75f4deb9ef67 100644 (file)
@@ -70,11 +70,34 @@ atomic_t nmi_counter;
  */
 spinlock_t irq_controller_lock;
 
-
 /*
  * Dummy controller type for unused interrupts
  */
-static void do_none(unsigned int irq, struct pt_regs * regs) { }
+static void do_none(unsigned int irq, struct pt_regs * regs)
+{
+       /*
+        * we are careful. While for ISA irqs it's common to happen
+        * outside of any driver (think autodetection), this is not
+        * at all nice for PCI interrupts. So we are stricter and
+        * print a warning when such spurious interrupts happen.
+        * Spurious interrupts can confuse other drivers if the PCI
+        * IRQ line is shared.
+        *
+        * Such spurious interrupts are either driver bugs, or
+        * sometimes hw (chipset) bugs.
+        */
+       printk("unexpected IRQ vector %d on CPU#%d!\n",irq, smp_processor_id());
+
+#ifdef __SMP__
+       /*
+        * [currently unexpected vectors happen only on SMP and APIC.
+        *  if we want to have non-APIC and non-8259A controllers
+        *  in the future with unexpected vectors, this ack should
+        *  probably be made controller-specific.]
+        */
+       ack_APIC_irq();
+#endif
+}
 static void enable_none(unsigned int irq) { }
 static void disable_none(unsigned int irq) { }
 
@@ -82,7 +105,7 @@ static void disable_none(unsigned int irq) { }
 #define startup_none   enable_none
 #define shutdown_none  disable_none
 
-static struct hw_interrupt_type no_irq_type = {
+struct hw_interrupt_type no_irq_type = {
        "none",
        startup_none,
        shutdown_none,
@@ -141,10 +164,10 @@ static unsigned int cached_irq_mask = 0xffff;
  * fed to the CPU IRQ line directly.
  *
  * Any '1' bit in this mask means the IRQ is routed through the IO-APIC.
- * this 'mixed mode' IRQ handling costs us one more branch in do_IRQ,
- * but we have _much_ higher compatibility and robustness this way.
+ * this 'mixed mode' IRQ handling costs nothing because it's only used
+ * at IRQ setup time.
  */
-unsigned long long io_apic_irqs = 0;
+unsigned long io_apic_irqs = 0;
 
 /*
  * These have to be protected by the irq controller spinlock
@@ -254,32 +277,43 @@ static void do_8259A_IRQ(unsigned int irq, struct pt_regs * regs)
 
 
 BUILD_COMMON_IRQ()
+
+#define BI(x,y) \
+       BUILD_IRQ(##x##y)
+
+#define BUILD_16_IRQS(x) \
+       BI(x,0) BI(x,1) BI(x,2) BI(x,3) \
+       BI(x,4) BI(x,5) BI(x,6) BI(x,7) \
+       BI(x,8) BI(x,9) BI(x,a) BI(x,b) \
+       BI(x,c) BI(x,d) BI(x,e) BI(x,f)
+
 /*
  * ISA PIC or low IO-APIC triggered (INTA-cycle or APIC) interrupts:
+ * (these are usually mapped to vectors 0x20-0x30)
  */
-BUILD_IRQ(0)  BUILD_IRQ(1)  BUILD_IRQ(2)  BUILD_IRQ(3)
-BUILD_IRQ(4)  BUILD_IRQ(5)  BUILD_IRQ(6)  BUILD_IRQ(7)
-BUILD_IRQ(8)  BUILD_IRQ(9)  BUILD_IRQ(10) BUILD_IRQ(11)
-BUILD_IRQ(12) BUILD_IRQ(13) BUILD_IRQ(14) BUILD_IRQ(15)
+BUILD_16_IRQS(0x0)
 
 #ifdef CONFIG_X86_IO_APIC
 /*
- * The IO-APIC gives us many more interrupt sources..
+ * The IO-APIC gives us many more interrupt sources. Most of these 
+ * are unused but an SMP system is supposed to have enough memory ...
+ * sometimes (mostly wrt. hw bugs) we get corrupted vectors all
+ * across the spectrum, so we really want to be prepared to get all
+ * of these. Plus, more powerful systems might have more than 64
+ * IO-APIC registers.
+ *
+ * (these are usually mapped into the 0x30-0xff vector range)
  */
-BUILD_IRQ(16) BUILD_IRQ(17) BUILD_IRQ(18) BUILD_IRQ(19)
-BUILD_IRQ(20) BUILD_IRQ(21) BUILD_IRQ(22) BUILD_IRQ(23)
-BUILD_IRQ(24) BUILD_IRQ(25) BUILD_IRQ(26) BUILD_IRQ(27)
-BUILD_IRQ(28) BUILD_IRQ(29) BUILD_IRQ(30) BUILD_IRQ(31)
-BUILD_IRQ(32) BUILD_IRQ(33) BUILD_IRQ(34) BUILD_IRQ(35)
-BUILD_IRQ(36) BUILD_IRQ(37) BUILD_IRQ(38) BUILD_IRQ(39)
-BUILD_IRQ(40) BUILD_IRQ(41) BUILD_IRQ(42) BUILD_IRQ(43)
-BUILD_IRQ(44) BUILD_IRQ(45) BUILD_IRQ(46) BUILD_IRQ(47)
-BUILD_IRQ(48) BUILD_IRQ(49) BUILD_IRQ(50) BUILD_IRQ(51)
-BUILD_IRQ(52) BUILD_IRQ(53) BUILD_IRQ(54) BUILD_IRQ(55)
-BUILD_IRQ(56) BUILD_IRQ(57) BUILD_IRQ(58) BUILD_IRQ(59)
-BUILD_IRQ(60) BUILD_IRQ(61) BUILD_IRQ(62) BUILD_IRQ(63)
+                   BUILD_16_IRQS(0x1) BUILD_16_IRQS(0x2) BUILD_16_IRQS(0x3)
+BUILD_16_IRQS(0x4) BUILD_16_IRQS(0x5) BUILD_16_IRQS(0x6) BUILD_16_IRQS(0x7)
+BUILD_16_IRQS(0x8) BUILD_16_IRQS(0x9) BUILD_16_IRQS(0xa) BUILD_16_IRQS(0xb)
+BUILD_16_IRQS(0xc) BUILD_16_IRQS(0xd)
 #endif
 
+#undef BUILD_16_IRQS
+#undef BI
+
+
 #ifdef __SMP__
 /*
  * The following vectors are part of the Linux architecture, there
@@ -303,37 +337,35 @@ BUILD_SMP_TIMER_INTERRUPT(apic_timer_interrupt)
 
 #endif
 
+#define IRQ(x,y) \
+       IRQ##x##y##_interrupt
+
+#define IRQLIST_16(x) \
+       IRQ(x,0), IRQ(x,1), IRQ(x,2), IRQ(x,3), \
+       IRQ(x,4), IRQ(x,5), IRQ(x,6), IRQ(x,7), \
+       IRQ(x,8), IRQ(x,9), IRQ(x,a), IRQ(x,b), \
+       IRQ(x,c), IRQ(x,d), IRQ(x,e), IRQ(x,f)
+
 static void (*interrupt[NR_IRQS])(void) = {
-       IRQ0_interrupt, IRQ1_interrupt, IRQ2_interrupt, IRQ3_interrupt,
-       IRQ4_interrupt, IRQ5_interrupt, IRQ6_interrupt, IRQ7_interrupt,
-       IRQ8_interrupt, IRQ9_interrupt, IRQ10_interrupt, IRQ11_interrupt,
-       IRQ12_interrupt, IRQ13_interrupt, IRQ14_interrupt, IRQ15_interrupt
+       IRQLIST_16(0x0),
+
 #ifdef CONFIG_X86_IO_APIC
-       ,IRQ16_interrupt, IRQ17_interrupt, IRQ18_interrupt, IRQ19_interrupt,
-       IRQ20_interrupt, IRQ21_interrupt, IRQ22_interrupt, IRQ23_interrupt,
-       IRQ24_interrupt, IRQ25_interrupt, IRQ26_interrupt, IRQ27_interrupt,
-       IRQ28_interrupt, IRQ29_interrupt,
-       IRQ30_interrupt, IRQ31_interrupt, IRQ32_interrupt, IRQ33_interrupt,
-       IRQ34_interrupt, IRQ35_interrupt, IRQ36_interrupt, IRQ37_interrupt,
-       IRQ38_interrupt, IRQ39_interrupt,
-       IRQ40_interrupt, IRQ41_interrupt, IRQ42_interrupt, IRQ43_interrupt,
-       IRQ44_interrupt, IRQ45_interrupt, IRQ46_interrupt, IRQ47_interrupt,
-       IRQ48_interrupt, IRQ49_interrupt,
-       IRQ50_interrupt, IRQ51_interrupt, IRQ52_interrupt, IRQ53_interrupt,
-       IRQ54_interrupt, IRQ55_interrupt, IRQ56_interrupt, IRQ57_interrupt,
-       IRQ58_interrupt, IRQ59_interrupt,
-       IRQ60_interrupt, IRQ61_interrupt, IRQ62_interrupt, IRQ63_interrupt
+                        IRQLIST_16(0x1), IRQLIST_16(0x2), IRQLIST_16(0x3),
+       IRQLIST_16(0x4), IRQLIST_16(0x5), IRQLIST_16(0x6), IRQLIST_16(0x7),
+       IRQLIST_16(0x8), IRQLIST_16(0x9), IRQLIST_16(0xa), IRQLIST_16(0xb),
+       IRQLIST_16(0xc), IRQLIST_16(0xd)
 #endif
 };
 
+#undef IRQ
+#undef IRQLIST_16
+
 
 /*
- * Initial irq handlers.
+ * Special irq handlers.
  */
 
-void no_action(int cpl, void *dev_id, struct pt_regs *regs)
-{
-}
+void no_action(int cpl, void *dev_id, struct pt_regs *regs) { }
 
 #ifndef CONFIG_VISWS
 /*
@@ -770,7 +802,7 @@ asmlinkage void do_IRQ(struct pt_regs regs)
         * 0 return value means that this irq is already being
         * handled by some other CPU. (or is disabled)
         */
-       unsigned int irq = regs.orig_eax & 0xff;
+       int irq = regs.orig_eax & 0xff; /* subtle, see irq.h */
        int cpu = smp_processor_id();
 
        kstat.irqs[cpu][irq]++;
@@ -986,42 +1018,6 @@ int probe_irq_off(unsigned long unused)
        return irq_found;
 }
 
-/*
- * Silly, horrible hack
- */
-static char uglybuffer[10*256];
-
-__asm__("\n" __ALIGN_STR"\n"
-       "common_unexpected:\n\t"
-       SAVE_ALL
-       "pushl $ret_from_intr\n\t"
-       "jmp strange_interrupt");
-
-void strange_interrupt(int irqnum)
-{
-       printk("Unexpected interrupt %d\n", irqnum & 255);
-       for (;;);
-}
-
-extern int common_unexpected;
-__initfunc(void init_unexpected_irq(void))
-{
-       int i;
-       for (i = 0; i < 256; i++) {
-               char *code = uglybuffer + 10*i;
-               unsigned long jumpto = (unsigned long) &common_unexpected;
-
-               jumpto -= (unsigned long)(code+10);
-               code[0] = 0x68;         /* pushl */
-               *(int *)(code+1) = i - 512;
-               code[5] = 0xe9;         /* jmp */
-               *(int *)(code+6) = jumpto;
-
-               set_intr_gate(i,code);
-       }
-}
-
-
 void init_ISA_irqs (void)
 {
        int i;
@@ -1033,7 +1029,7 @@ void init_ISA_irqs (void)
 
                if (i < 16) {
                        /*
-                        * 16 old-style INTA-cycle interrupt gates:
+                        * 16 old-style INTA-cycle interrupts:
                         */
                        irq_desc[i].handler = &i8259A_irq_type;
                } else {
@@ -1054,9 +1050,16 @@ __initfunc(void init_IRQ(void))
 #else
        init_VISWS_APIC_irqs();
 #endif
-
-       for (i = 0; i < 16; i++)
-               set_intr_gate(0x20+i,interrupt[i]);
+       /*
+        * Cover the whole vector space, no vector can escape
+        * us. (some of these will be overridden and become
+        * 'special' SMP interrupts)
+        */
+       for (i = 0; i < NR_IRQS; i++) {
+               int vector = FIRST_EXTERNAL_VECTOR + i;
+               if (vector != SYSCALL_VECTOR) 
+                       set_intr_gate(vector, interrupt[i]);
+       }
 
 #ifdef __SMP__ 
 
@@ -1067,13 +1070,9 @@ __initfunc(void init_IRQ(void))
        set_intr_gate(IRQ0_TRAP_VECTOR, interrupt[0]);
 
        /*
-        * The reschedule interrupt slowly changes it's functionality,
-        * while so far it was a kind of broadcasted timer interrupt,
-        * in the future it should become a CPU-to-CPU rescheduling IPI,
-        * driven by schedule() ?
+        * The reschedule interrupt is a CPU-to-CPU reschedule-helper
+        * IPI, driven by wakeup.
         */
-
-       /* IPI for rescheduling */
        set_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
 
        /* IPI for invalidation */
index 982ab101e2795d830f087e094f5d205b083b671c..68d719959d6345e9ade8dcc355e0be6c1c6b0243 100644 (file)
@@ -16,6 +16,7 @@ struct hw_interrupt_type {
        void (*disable)(unsigned int irq);
 };
 
+extern struct hw_interrupt_type no_irq_type;
 
 /*
  * IRQ line status.
@@ -40,6 +41,18 @@ typedef struct {
        unsigned int depth;                     /* Disable depth for nested irq disables */
 } irq_desc_t;
 
+/*
+ * IDT vectors usable for external interrupt sources start
+ * at 0x20:
+ */
+#define FIRST_EXTERNAL_VECTOR  0x20
+
+#define SYSCALL_VECTOR         0x80
+
+/*
+ * Vectors 0x20-0x2f are used for ISA interrupts.
+ */
+
 /*
  * Special IRQ vectors used by the SMP architecture:
  *
@@ -54,7 +67,7 @@ typedef struct {
 #define MTRR_CHANGE_VECTOR     0x50
 
 /*
- * First vector available to drivers: (vectors 0x51-0xfe)
+ * First APIC vector available to drivers: (vectors 0x51-0xfe)
  */
 #define IRQ0_TRAP_VECTOR       0x51
 
@@ -94,7 +107,9 @@ extern void send_IPI(int dest, int vector);
 extern void init_pic_mode(void);
 extern void print_IO_APIC(void);
 
-extern unsigned long long io_apic_irqs;
+extern unsigned long io_apic_irqs;
+
+extern char _stext, _etext;
 
 #define MAX_IRQ_SOURCES 128
 #define MAX_MP_BUSSES 32
@@ -126,7 +141,7 @@ static inline void irq_exit(int cpu, unsigned int irq)
        hardirq_exit(cpu);
 }
 
-#define IO_APIC_IRQ(x) ((1<<x) & io_apic_irqs)
+#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
 
 #else
 
@@ -201,6 +216,13 @@ __asm__( \
        "pushl $ret_from_intr\n\t" \
        "jmp "SYMBOL_NAME_STR(do_IRQ));
 
+/*
+ * subtle. orig_eax is used by the signal code to distinct between
+ * system calls and interrupted 'random user-space'. Thus we have
+ * to put a negative value into orig_eax here. (the problem is that
+ * both system calls and IRQs want to have small integer numbers in
+ * orig_eax, and the syscall code has won the optimization conflict ;)
+ */
 #define BUILD_IRQ(nr) \
 asmlinkage void IRQ_NAME(nr); \
 __asm__( \
@@ -216,7 +238,6 @@ SYMBOL_NAME_STR(IRQ) #nr "_interrupt:\n\t" \
 static inline void x86_do_profile (unsigned long eip)
 {
        if (prof_buffer && current->pid) {
-               extern int _stext;
                eip -= (unsigned long) &_stext;
                eip >>= prof_shift;
                /*
index c3f34270a1bd85a567f114590ac04b4876e3fb71..f13dc954065c57e504a295c941eaf26fd373059d 100644 (file)
@@ -807,7 +807,7 @@ int get_cpuinfo(char * buffer)
                               c->x86_model,
                               c->x86_model_id[0] ? c->x86_model_id : "unknown");
                
-               if (c->x86_mask)
+               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");
index 421c56891d2e1312251145e9c4eece7e5251e2ac..aa8feb3c6e215c34b8c77f806d29cdc77aa5a295 100644 (file)
@@ -42,7 +42,7 @@
 
 #include "irq.h"
 
-extern unsigned long start_kernel, _etext;
+extern unsigned long start_kernel;
 extern void update_one_process( struct task_struct *p,
                                unsigned long ticks, unsigned long user,
                                unsigned long system, int cpu);
@@ -319,8 +319,17 @@ static int __init smp_read_mpc(struct mp_config_table *mpc)
                                                printk("Processor #%d unused. (Max %d processors).\n",m->mpc_apicid, NR_CPUS);
                                        else
                                        {
+                                               int ver = m->mpc_apicver;
+
                                                cpu_present_map|=(1<<m->mpc_apicid);
-                                               apic_version[m->mpc_apicid]=m->mpc_apicver;
+                                               /*
+                                                * Validate version
+                                                */
+                                               if (ver == 0x0) {
+                                                       printk("BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)\n", m->mpc_apicid);
+                                                       ver = 0x10;
+                                               }
+                                               apic_version[m->mpc_apicid] = ver;
                                        }
                                }
                                mpt+=sizeof(*m);
@@ -1806,8 +1815,10 @@ asmlinkage void smp_mtrr_interrupt(void)
  */
 asmlinkage void smp_spurious_interrupt(void)
 {
-       /* ack_APIC_irq();   see sw-dev-man vol 3, chapter 7.4.13.5 */
-       printk("spurious APIC interrupt, ayiee, should never happen.\n");
+       ack_APIC_irq();
+       /* see sw-dev-man vol 3, chapter 7.4.13.5 */
+       printk("spurious APIC interrupt on CPU#%d, should never happen.\n",
+                       smp_processor_id());
 }
 
 /*
@@ -2058,3 +2069,4 @@ int setup_profiling_timer(unsigned int multiplier)
 }
 
 #undef APIC_DIVISOR
+
index f0dc0609223f7c7c541c10d51f2159494358e695..cce35ac80ee86383335d42150be99c348cfd83c1 100644 (file)
@@ -42,6 +42,8 @@
 #include <asm/lithium.h>
 #endif
 
+#include "irq.h"
+
 asmlinkage int system_call(void);
 asmlinkage void lcall7(void);
 
@@ -125,7 +127,6 @@ static void show_registers(struct pt_regs *regs)
        unsigned long esp;
        unsigned short ss;
        unsigned long *stack, addr, module_start, module_end;
-       extern char _stext, _etext;
 
        esp = (unsigned long) (1+regs);
        ss = __KERNEL_DS;
@@ -669,9 +670,6 @@ cobalt_init(void)
 #endif
 void __init trap_init(void)
 {
-       /* Initially up all of the IDT to jump to unexpected */
-       init_unexpected_irq();
-
        if (readl(0x0FFFD9) == 'E' + ('I'<<8) + ('S'<<16) + ('A'<<24))
                EISA_bus = 1;
        set_call_gate(&default_ldt,lcall7);
@@ -693,7 +691,7 @@ void __init trap_init(void)
        set_trap_gate(15,&spurious_interrupt_bug);
        set_trap_gate(16,&coprocessor_error);
        set_trap_gate(17,&alignment_check);
-       set_system_gate(0x80,&system_call);
+       set_system_gate(SYSCALL_VECTOR,&system_call);
 
        /* set up GDT task & ldt entries */
        set_tss_desc(0, &init_task.tss);
index faddbf4ec07936b58c2e51efbca3b5d9e2c63ae7..3f6e27fccf30fe1c19ca4b39c6a313573cce5223 100644 (file)
@@ -31,6 +31,15 @@ ENTRY(__down_failed_interruptible)
        popl %edx       /* restore %edx */
        ret
 
+/* Don't save/restore %eax, because that will be our return value */
+ENTRY(__down_failed_trylock)
+       pushl %edx      /* save %edx */
+       pushl %ecx      /* save %ecx (and argument) */
+       call SYMBOL_NAME(__down_trylock)
+       popl %ecx       /* restore %ecx (count on __down_trylock not changing it) */
+       popl %edx       /* restore %edx */
+       ret
+
 ENTRY(__up_wakeup)
        pushl %eax      /* save %eax */
        pushl %edx      /* save %edx */
index c9ce18f018f842e58d797afc002e5d3e7c852437..8cce3026db915576c176a5265112dfcff97ccbe6 100644 (file)
@@ -120,6 +120,7 @@ static struct bttv bttvs[BTTV_MAX];
 
 #define I2C_TIMING (0x7<<4)
 #define I2C_DELAY   10
+
 #define I2C_SET(CTRL,DATA) \
     { btwrite((CTRL<<1)|(DATA), BT848_I2C); udelay(I2C_DELAY); }
 #define I2C_GET()   (btread(BT848_I2C)&1)
@@ -244,6 +245,7 @@ static void i2c_setlines(struct i2c_bus *bus,int ctrl,int data)
 {
         struct bttv *btv = (struct bttv*)bus->data;
        btwrite((ctrl<<1)|data, BT848_I2C);
+       btread(BT848_I2C); /* flush buffers */
        udelay(I2C_DELAY);
 }
 
index abf08764d9d823dc9ea16ff737f10f54ab558993..4ccdb8f15f0f09b79c96e639f996868e3f4b9538 100644 (file)
@@ -774,7 +774,6 @@ static int msp3410d_thread(void *data)
                        goto done;
                dprintk("msp3410: thread: sleep\n");
                down_interruptible(&sem);
-               sem.owner = 0;
                dprintk("msp3410: thread: wakeup\n");
                if (msp->rmmod)
                        goto done;
index 83ff0fd850fc986c076d263d3719cfc0235ed57a..bcaceccb4ea5e7259db1fe408a13ff0fef184d7a 100644 (file)
@@ -731,9 +731,6 @@ int idescsi_queue (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
                printk (KERN_ERR "ide-scsi: drive id %d not present\n", cmd->target);
                goto abort;
        }
-       if (cmd->lun != 0) {            /* Only respond to LUN 0. Drop others */
-               goto abort;
-       }
        scsi = drive->driver_data;
        pc = kmalloc (sizeof (idescsi_pc_t), GFP_ATOMIC);
        rq = kmalloc (sizeof (struct request), GFP_ATOMIC);
index 4becc4c36a308629bccbd78bc8544f608e0fb558..a3d7c3538a589b3f672c86e79c80170b77020c25 100644 (file)
@@ -1972,7 +1972,6 @@ scsi_error_handler(void * data)
             */
             SCSI_LOG_ERROR_RECOVERY(1,printk("Error handler sleeping\n"));
            down_interruptible (&sem);
-           sem.owner = 0;
 
            if (signal_pending(current) )
              break;
index a3c1936f45667b5cbc1d3ae33a7dbb0bd4237680..1e5cc43c635c4b108765b620dd543e30a7021507 100644 (file)
@@ -385,7 +385,9 @@ asmlinkage int sys_fdatasync(unsigned int fd)
                goto out_putf;
 
        /* this needs further work, at the moment it is identical to fsync() */
+       down(&inode->i_sem);
        err = file->f_op->fsync(file, dentry);
+       up(&inode->i_sem);
 
 out_putf:
        fput(file);
@@ -812,8 +814,8 @@ void refile_buffer(struct buffer_head * buf)
                         * If too high a percentage of the buffers are dirty...
                         */
                        if (nr_buffers_type[BUF_DIRTY] > too_many ||
-                           (size_buffers_type[BUF_DIRTY] + size_buffers_type[BUF_LOCKED])/PAGE_SIZE > too_large) {
-                               if (nr_buffers_type[BUF_LOCKED] > 2 * bdf_prm.b_un.ndirty)
+                           size_buffers_type[BUF_DIRTY]/PAGE_SIZE > too_large) {
+                               if (nr_buffers_type[BUF_LOCKED] > 3 * bdf_prm.b_un.ndirty)
                                        wakeup_bdflush(1);
                                else
                                        wakeup_bdflush(0);
@@ -1767,7 +1769,7 @@ int bdflush(void * unused)
 #ifdef DEBUG
                for(nlist = 0; nlist < NR_LIST; nlist++)
 #else
-               for(nlist = BUF_DIRTY; nlist <= BUF_DIRTY; nlist++)
+               for(nlist = BUF_LOCKED; nlist <= BUF_DIRTY; nlist++)
 #endif
                 {
                         ndirty = 0;
@@ -1786,11 +1788,16 @@ int bdflush(void * unused)
                                          }
                                          
                                          /* Clean buffer on dirty list?  Refile it */
-                                         if (nlist == BUF_DIRTY && !buffer_dirty(bh) && !buffer_locked(bh))
-                                          {
-                                                  refile_buffer(bh);
-                                                  continue;
-                                          }
+                                         if (nlist == BUF_DIRTY && !buffer_dirty(bh)) {
+                                                 refile_buffer(bh);
+                                                 continue;
+                                         }
+                                         
+                                         /* Unlocked buffer on locked list?  Refile it */
+                                         if (nlist == BUF_LOCKED && !buffer_locked(bh)) {
+                                                 refile_buffer(bh);
+                                                 continue;
+                                         }
                                          
                                          if (buffer_locked(bh) || !buffer_dirty(bh))
                                                   continue;
index c0b077f474cdc3a74a2e62329f1b6b5b7aca6230..f97bd00868bb150959e5419ea460923c3ad65869 100644 (file)
@@ -1,3 +1,13 @@
+1999-01-30  a sun  <asun@hecate.darksunrising.blah>
+
+       * catalog.c (hfs_cat_move): fixed corruption problem with
+       renames.
+
+1999-01-27  a sun  <asun@hecate.darksunrising.blah>
+
+       * file_hdr.c (get/set_dates): got rid of broken afpd times. NOTE:
+       you must use netatalk-1.4b2+asun2.1.2 or newer for this.
+
 1998-12-20  a sun  <asun@hecate.darksunrising.blah>
 
        * bdelete.c (del_root): assign bthLNode and bthFNode only if the
index 306c018e7c533c7c8c073ce4302ec395d70df8ac..48577a9e6cd89631ba7c295681737f03543e8aae 100644 (file)
@@ -1348,7 +1348,7 @@ int hfs_cat_move(struct hfs_cat_entry *old_dir, struct hfs_cat_entry *new_dir,
                hfs_sleep_on(&mdb->rename_wait);
        }
        spin_lock(&entry_lock);
-       mdb->rename_lock = 1;
+       mdb->rename_lock = 1; /* XXX: should be atomic_inc */
        spin_unlock(&entry_lock);
 
        /* keep readers from getting confused by changing dir size */
@@ -1385,7 +1385,6 @@ int hfs_cat_move(struct hfs_cat_entry *old_dir, struct hfs_cat_entry *new_dir,
 restart:
        /* see if the destination exists, getting it if it does */
        dest = hfs_cat_get(mdb, new_key);
-
        if (!dest) {
                /* destination doesn't exist, so create it */
                struct hfs_cat_rec new_record;
@@ -1408,14 +1407,16 @@ restart:
                        goto bail3;
                }
 
-               /* build the new record */
+               /* build the new record. make sure to zero out the
+                   record. */
+               memset(&new_record, 0, sizeof(new_record));
                new_record.cdrType = entry->type;
                __write_entry(entry, &new_record);
 
                /* insert the new record */
                error = hfs_binsert(mdb->cat_tree, HFS_BKEY(new_key),
                                    &new_record, is_dir ? 2 + sizeof(DIR_REC) :
-                                                         2 + sizeof(FIL_REC));
+                                   2 + sizeof(FIL_REC));
                if (error == -EEXIST) {
                        delete_entry(dest);
                        unlock_entry(dest);
@@ -1565,7 +1566,7 @@ done:
        }
        end_write(new_dir);
        spin_lock(&entry_lock);
-       mdb->rename_lock = 0;
+       mdb->rename_lock = 0; /* XXX: should use atomic_dec */
        hfs_wake_up(&mdb->rename_wait);
        spin_unlock(&entry_lock);
 
index 3ae2d5b5d0f01e0cf06f694b320c71873abd6300..9479fab08c90d2cd7a0541e39c02d765c22e3709 100644 (file)
@@ -303,16 +303,9 @@ static inline void adjust_forks(struct hfs_cat_entry *entry,
 static void get_dates(const struct hfs_cat_entry *entry,
                      const struct inode *inode,  hfs_u32 dates[3])
 {
-       if (HFS_SB(inode->i_sb)->s_afpd) {
-               /* AFPD compatible: use un*x times */
-               dates[0] = htonl(hfs_m_to_utime(entry->create_date));
-               dates[1] = htonl(hfs_m_to_utime(entry->modify_date));
-               dates[2] = htonl(hfs_m_to_utime(entry->backup_date));
-       } else {
-               dates[0] = hfs_m_to_htime(entry->create_date);
-               dates[1] = hfs_m_to_htime(entry->modify_date);
-               dates[2] = hfs_m_to_htime(entry->backup_date);
-       }
+       dates[0] = hfs_m_to_htime(entry->create_date);
+       dates[1] = hfs_m_to_htime(entry->modify_date);
+       dates[2] = hfs_m_to_htime(entry->backup_date);
 }
 
 /*
@@ -322,43 +315,23 @@ static void set_dates(struct hfs_cat_entry *entry, struct inode *inode,
                      const hfs_u32 *dates)
 {
        hfs_u32 tmp;
-       if (HFS_SB(inode->i_sb)->s_afpd) {
-               /* AFPD compatible: use un*x times */
-               tmp = hfs_u_to_mtime(ntohl(dates[0]));
-               if (entry->create_date != tmp) {
-                       entry->create_date = tmp;
-                       hfs_cat_mark_dirty(entry);
-               }
-               tmp = hfs_u_to_mtime(ntohl(dates[1]));
-               if (entry->modify_date != tmp) {
-                       entry->modify_date = tmp;
-                       inode->i_ctime = inode->i_atime = inode->i_mtime =
-                               ntohl(dates[1]);
-                       hfs_cat_mark_dirty(entry);
-               }
-               tmp = hfs_u_to_mtime(ntohl(dates[2]));
-               if (entry->backup_date != tmp) {
-                       entry->backup_date = tmp;
-                       hfs_cat_mark_dirty(entry);
-               }
-       } else {
-               tmp = hfs_h_to_mtime(dates[0]);
-               if (entry->create_date != tmp) {
-                       entry->create_date = tmp;
-                       hfs_cat_mark_dirty(entry);
-               }
-               tmp = hfs_h_to_mtime(dates[1]);
-               if (entry->modify_date != tmp) {
-                       entry->modify_date = tmp;
-                       inode->i_ctime = inode->i_atime = inode->i_mtime = 
-                               hfs_h_to_utime(dates[1]);
-                       hfs_cat_mark_dirty(entry);
-               }
-               tmp = hfs_h_to_mtime(dates[2]);
-               if (entry->backup_date != tmp) {
-                       entry->backup_date = tmp;
-                       hfs_cat_mark_dirty(entry);
-               }
+
+       tmp = hfs_h_to_mtime(dates[0]);
+       if (entry->create_date != tmp) {
+               entry->create_date = tmp;
+               hfs_cat_mark_dirty(entry);
+       }
+       tmp = hfs_h_to_mtime(dates[1]);
+       if (entry->modify_date != tmp) {
+               entry->modify_date = tmp;
+               inode->i_ctime = inode->i_atime = inode->i_mtime = 
+                       hfs_h_to_utime(dates[1]);
+               hfs_cat_mark_dirty(entry);
+       }
+       tmp = hfs_h_to_mtime(dates[2]);
+       if (entry->backup_date != tmp) {
+               entry->backup_date = tmp;
+               hfs_cat_mark_dirty(entry);
        }
 }
 
index c34f37aa95e649d18e6abbc4b368d82ba6989ecc..8df091923eb9d7d3655d61a0e68d53a1951e3a96 100644 (file)
@@ -478,7 +478,7 @@ nlmclnt_unlock_callback(struct rpc_task *task)
        int             status = req->a_res.status;
 
        if (RPC_ASSASSINATED(task))
-               return;
+               goto die;
 
        if (task->tk_status < 0) {
                dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status);
@@ -490,6 +490,9 @@ nlmclnt_unlock_callback(struct rpc_task *task)
         && status != NLM_LCK_DENIED_GRACE_PERIOD) {
                printk("lockd: unexpected unlock status: %d\n", status);
        }
+
+die:
+       rpc_release_task(task);
 }
 
 /*
@@ -565,6 +568,7 @@ nlmclnt_cancel_callback(struct rpc_task *task)
        }
 
 die:
+       rpc_release_task(task);
        nlm_release_host(req->a_host);
        kfree(req);
        return;
index 49f3244d2b4f44d973f27dec6139e48a9e454159..10c66ed4d7ae0a639c89514166a0048f3809aa17 100644 (file)
@@ -561,6 +561,7 @@ nlmsvc_grant_callback(struct rpc_task *task)
        block->b_incall = 0;
 
        nlm_release_host(call->a_host);
+       rpc_release_task(task);
 }
 
 /*
index bab2915f1dccd4125e90c0d9a30cc1f20a1a6b46..0e59754f351d6eca49ac7064bc4703c3845bdd33 100644 (file)
@@ -492,6 +492,7 @@ nlmsvc_callback_exit(struct rpc_task *task)
                                        task->tk_pid, -task->tk_status);
        }
        nlm_release_host(call->a_host);
+       rpc_release_task(task);
        kfree(call);
 }
 
index 109ed75ec56835e3f9372347db4e2d7e9749158e..57ecb8ebf9d8feff9484e564dd3bdbeb1f91c6ce 100644 (file)
@@ -734,7 +734,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
         * directories via NFS.
         */
        err = 0;
-       if ((iap->ia_valid &= (ATTR_UID|ATTR_GID|ATTR_MODE)) != 0)
+       if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID|ATTR_MODE)) != 0)
                err = nfsd_setattr(rqstp, resfhp, iap);
 out:
        return err;
index a6cf24ce1714cd040a02f66ad81e7cbd661ccba3..aff45ef9b713dc581ec290c49655028595d81e28 100644 (file)
@@ -144,7 +144,7 @@ dentry->d_parent->d_name.name, dentry->d_name.name, count, offset, wsize);
 
                result = smb_proc_write(dentry, offset, wsize, buffer);
                if (result < 0)
-                       goto io_error;
+                       break;
                /* N.B. what if result < wsize?? */
 #ifdef SMBFS_PARANOIA
 if (result < wsize)
@@ -162,15 +162,7 @@ printk("smb_writepage_sync: short write, wsize=%d, result=%d\n", wsize, result);
                        inode->i_size = offset;
                inode->u.smbfs_i.cache_valid |= SMB_F_LOCALWRITE;
        } while (count);
-
-out:
-       smb_unlock_page(page);
        return written ? written : result;
-
-io_error:
-       /* Must mark the page invalid after I/O error */
-       clear_bit(PG_uptodate, &page->flags);
-       goto out;
 }
 
 /*
@@ -190,6 +182,7 @@ smb_writepage(struct file *file, struct page *page)
        set_bit(PG_locked, &page->flags);
        atomic_inc(&page->count);
        result = smb_writepage_sync(dentry, page, 0, PAGE_SIZE);
+       smb_unlock_page(page);
        free_page(page_address(page));
        return result;
 }
index 3d9a7c46c4de4815e41631c44b0cf35c0b605903..04c8213a99c50e7e2ade911a02cdc959845132b9 100644 (file)
 #define TIMER_IRQ 0
 
 /*
- * 16 XT IRQ's, 8 potential APIC interrupt sources.
- * Right now the APIC is only used for SMP, but this
- * may change.
+ * 16 8259A IRQ's, 240 potential APIC interrupt sources.
+ * Right now the APIC is mostly only used for SMP.
+ * 256 vectors is an architectural limit. (we can have
+ * more than 256 devices theoretically, but they will
+ * have to use shared interrupts)
+ * Since vectors 0x00-0x1f are used/reserved for the CPU,
+ * the usable vector space is 0x20-0xff (224 vectors)
  */
-#define NR_IRQS 64
+#define NR_IRQS 224
 
 static __inline__ int irq_cannonicalize(int irq)
 {
diff --git a/include/asm-i386/semaphore-helper.h b/include/asm-i386/semaphore-helper.h
new file mode 100644 (file)
index 0000000..c8636da
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef _I386_SEMAPHORE_HELPER_H
+#define _I386_SEMAPHORE_HELPER_H
+
+/*
+ * SMP- and interrupt-safe semaphores helper functions.
+ *
+ * (C) Copyright 1996 Linus Torvalds
+ * (C) Copyright 1999 Andrea Arcangeli
+ */
+
+/*
+ * These two _must_ execute atomically wrt each other.
+ *
+ * This is trivially done with load_locked/store_cond,
+ * but on the x86 we need an external synchronizer.
+ */
+static inline void wake_one_more(struct semaphore * sem)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&semaphore_wake_lock, flags);
+       if (atomic_read(&sem->count) <= 0)
+               sem->waking++;
+       spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+}
+
+static inline int waking_non_zero(struct semaphore *sem)
+{
+       unsigned long flags;
+       int ret = 0;
+
+       spin_lock_irqsave(&semaphore_wake_lock, flags);
+       if (sem->waking > 0) {
+               sem->waking--;
+               ret = 1;
+       }
+       spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+       return ret;
+}
+
+/*
+ * waking_non_zero_interruptible:
+ *     1       got the lock
+ *     0       go to sleep
+ *     -EINTR  interrupted
+ *
+ * We must undo the sem->count down_interruptible() increment while we are
+ * protected by the spinlock in order to make atomic this atomic_inc() with the
+ * atomic_read() in wake_one_more(), otherwise we can race. -arca
+ */
+static inline int waking_non_zero_interruptible(struct semaphore *sem,
+                                               struct task_struct *tsk)
+{
+       unsigned long flags;
+       int ret = 0;
+
+       spin_lock_irqsave(&semaphore_wake_lock, flags);
+       if (sem->waking > 0) {
+               sem->waking--;
+               ret = 1;
+       } else if (signal_pending(tsk)) {
+               atomic_inc(&sem->count);
+               ret = -EINTR;
+       }
+       spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+       return ret;
+}
+
+/*
+ * waking_non_zero_trylock:
+ *     1       failed to lock
+ *     0       got the lock
+ *
+ * We must undo the sem->count down_trylock() increment while we are
+ * protected by the spinlock in order to make atomic this atomic_inc() with the
+ * atomic_read() in wake_one_more(), otherwise we can race. -arca
+ */
+static inline int waking_non_zero_trylock(struct semaphore *sem)
+{
+       unsigned long flags;
+       int ret = 1;
+
+       spin_lock_irqsave(&semaphore_wake_lock, flags);
+       if (sem->waking <= 0)
+               atomic_inc(&sem->count);
+       else {
+               sem->waking--;
+               ret = 0;
+       }
+       spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+       return ret;
+}
+
+#endif
index d78970da0f3d3b159b3ad4b1d3a9c3d8a015aa0a..ccf69385cb68247ca3856e23200faf863d8063b3 100644 (file)
  *                     the original code and to make semaphore waits
  *                     interruptible so that processes waiting on
  *                     semaphores can be killed.
+ * Modified 1999-02-14 by Andrea Arcangeli, split the sched.c helper
+ *                    functions in asm/sempahore-helper.h while fixing a
+ *                    potential and subtle race discovered by Ulrich Schmid
+ *                    in down_interruptible(). Since I started to play here I
+ *                    also implemented the `trylock' semaphore operation.
  *
  * If you would like to see an analysis of this implementation, please
  * ftp to gcom.com and download the file
 #include <asm/atomic.h>
 #include <asm/spinlock.h>
 
-/*
- * Semaphores are recursive: we allow the holder process
- * to recursively do down() operations on a semaphore that
- * the process already owns. In order to do that, we need
- * to keep a semaphore-local copy of the owner and the
- * "depth of ownership".
- *
- * NOTE! Nasty memory ordering rules:
- *  - "owner" and "owner_count" may only be modified once you hold the
- *    lock. 
- *  - "owner_count" must be written _after_ modifying owner, and
- *    must be read _before_ reading owner. There must be appropriate
- *    write and read barriers to enforce this.
- *
- * On an x86, writes are always ordered, so the only enformcement
- * necessary is to make sure that the owner_depth is written after
- * the owner value in program order.
- *
- * For read ordering guarantees, the semaphore wake_lock spinlock
- * is already giving us ordering guarantees.
- *
- * Other (saner) architectures would use "wmb()" and "rmb()" to
- * do this in a more obvious manner.
- */
 struct semaphore {
        atomic_t count;
-       unsigned long owner, owner_depth;
        int waking;
        struct wait_queue * wait;
 };
 
-/*
- * Because we want the non-contention case to be
- * fast, we save the stack pointer into the "owner"
- * field, and to get the true task pointer we have
- * to do the bit masking. That moves the masking
- * operation into the slow path.
- */
-#define semaphore_owner(sem) \
-       ((struct task_struct *)((2*PAGE_MASK) & (sem)->owner))
-
-#define MUTEX ((struct semaphore) { ATOMIC_INIT(1), 0, 0, 0, NULL })
-#define MUTEX_LOCKED ((struct semaphore) { ATOMIC_INIT(0), 0, 1, 0, NULL })
+#define MUTEX ((struct semaphore) { ATOMIC_INIT(1), 0, NULL })
+#define MUTEX_LOCKED ((struct semaphore) { ATOMIC_INIT(0), 0, NULL })
 
 asmlinkage void __down_failed(void /* special register calling convention */);
 asmlinkage int  __down_failed_interruptible(void  /* params in registers */);
+asmlinkage int  __down_failed_trylock(void  /* params in registers */);
 asmlinkage void __up_wakeup(void /* special register calling convention */);
 
 asmlinkage void __down(struct semaphore * sem);
 asmlinkage int  __down_interruptible(struct semaphore * sem);
+asmlinkage int  __down_trylock(struct semaphore * sem);
 asmlinkage void __up(struct semaphore * sem);
 
 extern spinlock_t semaphore_wake_lock;
 
 #define sema_init(sem, val)    atomic_set(&((sem)->count), (val))
 
-/*
- * These two _must_ execute atomically wrt each other.
- *
- * This is trivially done with load_locked/store_cond,
- * but on the x86 we need an external synchronizer.
- */
-static inline void wake_one_more(struct semaphore * sem)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&semaphore_wake_lock, flags);
-       sem->waking++;
-       spin_unlock_irqrestore(&semaphore_wake_lock, flags);
-}
-
-/*
- * NOTE NOTE NOTE!
- *
- * We read owner-count _before_ getting the semaphore. This
- * is important, because the semaphore also acts as a memory
- * ordering point between reading owner_depth and reading
- * the owner.
- *
- * Why is this necessary? The "owner_depth" essentially protects
- * us from using stale owner information - in the case that this
- * process was the previous owner but somebody else is racing to
- * aquire the semaphore, the only way we can see ourselves as an
- * owner is with "owner_depth" of zero (so that we know to avoid
- * the stale value).
- *
- * In the non-race case (where we really _are_ the owner), there
- * is not going to be any question about what owner_depth is.
- *
- * In the race case, the race winner will not even get here, because
- * it will have successfully gotten the semaphore with the locked
- * decrement operation.
- *
- * Basically, we have two values, and we cannot guarantee that either
- * is really up-to-date until we have aquired the semaphore. But we
- * _can_ depend on a ordering between the two values, so we can use
- * one of them to determine whether we can trust the other:
- *
- * Cases:
- *  - owner_depth == zero: ignore the semaphore owner, because it
- *    cannot possibly be us. Somebody else may be in the process
- *    of modifying it and the zero may be "stale", but it sure isn't
- *    going to say that "we" are the owner anyway, so who cares?
- *  - owner_depth is non-zero. That means that even if somebody
- *    else wrote the non-zero count value, the write ordering requriement
- *    means that they will have written themselves as the owner, so
- *    if we now see ourselves as an owner we can trust it to be true.
- */
-static inline int waking_non_zero(struct semaphore *sem, struct task_struct *tsk)
-{
-       unsigned long flags;
-       unsigned long owner_depth = sem->owner_depth;
-       int ret = 0;
-
-       spin_lock_irqsave(&semaphore_wake_lock, flags);
-       if (sem->waking > 0 || (owner_depth && semaphore_owner(sem) == tsk)) {
-               sem->owner = (unsigned long) tsk;
-               sem->owner_depth++;     /* Don't use the possibly stale value */
-               sem->waking--;
-               ret = 1;
-       }
-       spin_unlock_irqrestore(&semaphore_wake_lock, flags);
-       return ret;
-}
-
 /*
  * This is ugly, but we want the default case to fall through.
  * "down_failed" is a special asm handler that calls the C
@@ -161,9 +64,7 @@ extern inline void down(struct semaphore * sem)
                "lock ; "
 #endif
                "decl 0(%0)\n\t"
-               "js 2f\n\t"
-               "movl %%esp,4(%0)\n"
-               "movl $1,8(%0)\n\t"
+               "js 2f\n"
                "1:\n"
                ".section .text.lock,\"ax\"\n"
                "2:\tpushl $1b\n\t"
@@ -185,8 +86,6 @@ extern inline int down_interruptible(struct semaphore * sem)
 #endif
                "decl 0(%1)\n\t"
                "js 2f\n\t"
-               "movl %%esp,4(%1)\n\t"
-               "movl $1,8(%1)\n\t"
                "xorl %0,%0\n"
                "1:\n"
                ".section .text.lock,\"ax\"\n"
@@ -199,6 +98,28 @@ extern inline int down_interruptible(struct semaphore * sem)
        return result;
 }
 
+extern inline int down_trylock(struct semaphore * sem)
+{
+       int result;
+
+       __asm__ __volatile__(
+               "# atomic interruptible down operation\n\t"
+#ifdef __SMP__
+               "lock ; "
+#endif
+               "decl 0(%1)\n\t"
+               "js 2f\n\t"
+               "xorl %0,%0\n"
+               "1:\n"
+               ".section .text.lock,\"ax\"\n"
+               "2:\tpushl $1b\n\t"
+               "jmp __down_failed_trylock\n"
+               ".previous"
+               :"=a" (result)
+               :"c" (sem)
+               :"memory");
+       return result;
+}
 
 /*
  * Note! This is subtle. We jump to wake people up only if
@@ -210,7 +131,6 @@ extern inline void up(struct semaphore * sem)
 {
        __asm__ __volatile__(
                "# atomic up operation\n\t"
-               "decl 8(%0)\n\t"
 #ifdef __SMP__
                "lock ; "
 #endif
index c03168f4b61da1593b788fa9508746fa9b3e46de..837abf2b0369a4e5257d9b7f946f6317dfa6647e 100644 (file)
@@ -453,8 +453,7 @@ struct sock {
 
 #ifdef CONFIG_FILTER
        /* Socket Filtering Instructions */
-       int                     filter;
-       struct sock_filter      *filter_data;
+       struct sk_filter        *filter;
 #endif /* CONFIG_FILTER */
 
        /* This is where all the private (optional) areas that don't
@@ -790,11 +789,11 @@ extern void sklist_destroy_socket(struct sock **list, struct sock *sk);
  * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller
  * than pkt_len we keep whole skb->data.
  */
-extern __inline__ int sk_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
+extern __inline__ int sk_filter(struct sk_buff *skb, struct sk_filter *filter)
 {
        int pkt_len;
 
-        pkt_len = sk_run_filter(skb->data, skb->len, filter, flen);
+        pkt_len = sk_run_filter(skb, filter->insns, filter->len);
         if(!pkt_len)
                 return 1;      /* Toss Packet */
         else
@@ -802,6 +801,23 @@ extern __inline__ int sk_filter(struct sk_buff *skb, struct sock_filter *filter,
 
        return 0;
 }
+
+extern __inline__ void sk_filter_release(struct sock *sk, struct sk_filter *fp)
+{
+       unsigned int size = sk_filter_len(fp);
+
+       atomic_sub(size, &sk->omem_alloc);
+
+       if (atomic_dec_and_test(&fp->refcnt))
+               kfree_s(fp, size);
+}
+
+extern __inline__ void sk_filter_charge(struct sock *sk, struct sk_filter *fp)
+{
+       atomic_inc(&fp->refcnt);
+       atomic_add(sk_filter_len(fp), &sk->omem_alloc);
+}
+
 #endif /* CONFIG_FILTER */
 
 /*
@@ -837,11 +853,8 @@ extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                 return -ENOMEM;
 
 #ifdef CONFIG_FILTER
-       if (sk->filter)
-       {
-               if (sk_filter(skb, sk->filter_data, sk->filter))
-                       return -EPERM;  /* Toss packet */
-       }
+       if (sk->filter && sk_filter(skb, sk->filter))
+               return -EPERM;  /* Toss packet */
 #endif /* CONFIG_FILTER */
 
        skb_set_owner_r(skb, sk);
index 5da07ba9d8ad2be504c23f35c51ee5d403afce59..b8a5e042005553e86a5b41e7c08ab1e7e23e8a9e 100644 (file)
@@ -912,7 +912,7 @@ static __inline__ void tcp_build_and_update_options(__u32 *ptr, struct tcp_opt *
  * can generate.
  */
 extern __inline__ void tcp_syn_build_options(__u32 *ptr, int mss, int ts, int sack,
-                                            int offer_wscale, int wscale, __u32 tstamp)
+                                            int offer_wscale, int wscale, __u32 tstamp, __u32 ts_recent)
 {
        /* We always get an MSS option.
         * The option bytes which will be seen in normal data
@@ -936,7 +936,7 @@ extern __inline__ void tcp_syn_build_options(__u32 *ptr, int mss, int ts, int sa
                        *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
                                                  (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
                *ptr++ = htonl(tstamp);         /* TSVAL */
-               *ptr++ = __constant_htonl(0);   /* TSECR */
+               *ptr++ = htonl(ts_recent);      /* TSECR */
        } else if(sack)
                *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
                                          (TCPOPT_SACK_PERM << 8) | TCPOLEN_SACK_PERM);
index 492433cde76c76e5259a5e57d3d9296eaa7a4d8b..3cb7d5b32a1369e8aedc6532e03dd1354a9379e5 100644 (file)
@@ -61,7 +61,7 @@ extern int request_dma(unsigned int dmanr, char * deviceID);
 extern void free_dma(unsigned int dmanr);
 extern spinlock_t dma_spin_lock;
 
-#ifdef MODVERSIONS
+#ifdef CONFIG_MODVERSIONS
 const struct module_symbol __export_Using_Versions
 __attribute__((section("__ksymtab"))) = {
        1 /* Version version */, "Using_Versions"
@@ -322,6 +322,8 @@ EXPORT_SYMBOL(printk);
 EXPORT_SYMBOL(sprintf);
 EXPORT_SYMBOL(vsprintf);
 EXPORT_SYMBOL(kdevname);
+EXPORT_SYMBOL(bdevname);
+EXPORT_SYMBOL(cdevname);
 EXPORT_SYMBOL(simple_strtoul);
 EXPORT_SYMBOL(system_utsname); /* UTS data */
 EXPORT_SYMBOL(uts_sem);                /* UTS semaphore */
@@ -370,6 +372,7 @@ EXPORT_SYMBOL(is_bad_inode);
 EXPORT_SYMBOL(event);
 EXPORT_SYMBOL(__down);
 EXPORT_SYMBOL(__down_interruptible);
+EXPORT_SYMBOL(__down_trylock);
 EXPORT_SYMBOL(__up);
 EXPORT_SYMBOL(brw_page);
 
index 8752473683c947b383bdb6b089703b2bcd15e67f..4510def86b5db2d3d05009ce4d9d407e3b7d24aa 100644 (file)
@@ -36,6 +36,7 @@
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/mmu_context.h>
+#include <asm/semaphore-helper.h>
 
 #include <linux/timex.h>
 
@@ -863,30 +864,28 @@ void __up(struct semaphore *sem)
        struct task_struct *tsk = current;      \
        struct wait_queue wait = { tsk, NULL };
 
-#define DOWN_HEAD(task_state)                                           \
-                                                                        \
-                                                                        \
-       tsk->state = (task_state);                                       \
-       add_wait_queue(&sem->wait, &wait);                               \
-                                                                        \
-       /*                                                               \
-        * Ok, we're set up.  sem->count is known to be less than zero   \
-        * so we must wait.                                              \
-        *                                                               \
-        * We can let go the lock for purposes of waiting.               \
-        * We re-acquire it after awaking so as to protect               \
-        * all semaphore operations.                                     \
-        *                                                               \
-        * If "up()" is called before we call waking_non_zero() then     \
-        * we will catch it right away.  If it is called later then      \
-        * we will have to go through a wakeup cycle to catch it.        \
-        *                                                               \
-        * Multiple waiters contend for the semaphore lock to see        \
-        * who gets to gate through and who has to wait some more.       \
-        */                                                              \
-       for (;;) {                                                       \
-               if (waking_non_zero(sem, tsk))  /* are we waking up?  */ \
-                       break;                  /* yes, exit loop */
+#define DOWN_HEAD(task_state)                                          \
+                                                                       \
+                                                                       \
+       tsk->state = (task_state);                                      \
+       add_wait_queue(&sem->wait, &wait);                              \
+                                                                       \
+       /*                                                              \
+        * Ok, we're set up.  sem->count is known to be less than zero  \
+        * so we must wait.                                             \
+        *                                                              \
+        * We can let go the lock for purposes of waiting.              \
+        * We re-acquire it after awaking so as to protect              \
+        * all semaphore operations.                                    \
+        *                                                              \
+        * If "up()" is called before we call waking_non_zero() then    \
+        * we will catch it right away.  If it is called later then     \
+        * we will have to go through a wakeup cycle to catch it.       \
+        *                                                              \
+        * Multiple waiters contend for the semaphore lock to see       \
+        * who gets to gate through and who has to wait some more.      \
+        */                                                             \
+       for (;;) {
 
 #define DOWN_TAIL(task_state)                  \
                tsk->state = (task_state);      \
@@ -898,6 +897,8 @@ void __down(struct semaphore * sem)
 {
        DOWN_VAR
        DOWN_HEAD(TASK_UNINTERRUPTIBLE)
+       if (waking_non_zero(sem))
+               break;
        schedule();
        DOWN_TAIL(TASK_UNINTERRUPTIBLE)
 }
@@ -907,10 +908,13 @@ int __down_interruptible(struct semaphore * sem)
        DOWN_VAR
        int ret = 0;
        DOWN_HEAD(TASK_INTERRUPTIBLE)
-       if (signal_pending(tsk))
+
+       ret = waking_non_zero_interruptible(sem, tsk);
+       if (ret)
        {
-               ret = -EINTR;                   /* interrupted */
-               atomic_inc(&sem->count);        /* give up on down operation */
+               if (ret == 1)
+                       /* ret != 0 only if we get interrupted -arca */
+                       ret = 0;
                break;
        }
        schedule();
@@ -918,6 +922,11 @@ int __down_interruptible(struct semaphore * sem)
        return ret;
 }
 
+int __down_trylock(struct semaphore * sem)
+{
+       return waking_non_zero_trylock(sem);
+}
+
 #define        SLEEP_ON_VAR                            \
        unsigned long flags;                    \
        struct wait_queue wait;
index a60d8f1e518fdff9fe00be8d181c01bc76b94885..7636a1e33917e11173e93d9195802e61fdf257fa 100644 (file)
@@ -11,6 +11,8 @@
  * 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.
+ *
+ * Andi Kleen - Fix a few bad bugs and races.
  */
 
 #include <linux/config.h>
 #include <asm/uaccess.h>
 #include <linux/filter.h>
 
+/* No hurry in this branch */
+
+static u8 *load_pointer(struct sk_buff *skb, int k)
+{
+       u8 *ptr = NULL;
+
+       if (k>=SKF_NET_OFF)
+               ptr = skb->nh.raw + k - SKF_NET_OFF;
+       else if (k>=SKF_LL_OFF)
+               ptr = skb->mac.raw + k - SKF_LL_OFF;
+
+       if (ptr<skb->head && ptr < skb->tail)
+               return ptr;
+       return NULL;
+}
+
 /*
  * Decode and apply filter instructions to the skb->data.
  * Return length to keep, 0 for none. skb is the data we are
  * len is the number of filter blocks in the array.
  */
  
-int sk_run_filter(unsigned char *data, int len, struct sock_filter *filter, int flen)
+int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
 {
+       unsigned char *data = skb->data;
+       /* len is UNSIGNED. Byte wide insns relies only on implicit
+          type casts to prevent reading arbitrary memory locations.
+        */
+       unsigned int len = skb->len;
        struct sock_filter *fentry;     /* We walk down these */
        u32 A = 0;                      /* Accumulator */
        u32 X = 0;                      /* Index Register */
        u32 mem[BPF_MEMWORDS];          /* Scratch Memory Store */
        int k;
        int pc;
-       int *t;
 
        /*
         * Process array of filter instructions.
@@ -60,53 +82,75 @@ int sk_run_filter(unsigned char *data, int len, struct sock_filter *filter, int
        for(pc = 0; pc < flen; pc++)
        {
                fentry = &filter[pc];
-               if(fentry->code & BPF_X)
-                       t=&X;
-               else
-                       t=&fentry->k;
                        
                switch(fentry->code)
                {
                        case BPF_ALU|BPF_ADD|BPF_X:
+                               A += X;
+                               continue;
+
                        case BPF_ALU|BPF_ADD|BPF_K:
-                               A += *t;
+                               A += fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_SUB|BPF_X:
+                               A -= X;
+                               continue;
+
                        case BPF_ALU|BPF_SUB|BPF_K:
-                               A -= *t;
+                               A -= fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_MUL|BPF_X:
+                               A *= X;
+                               continue;
+
                        case BPF_ALU|BPF_MUL|BPF_K:
-                               A *= *t;
+                               A *= X;
                                continue;
 
                        case BPF_ALU|BPF_DIV|BPF_X:
+                               if(X == 0)
+                                       return (0);
+                               A /= X;
+                               continue;
+
                        case BPF_ALU|BPF_DIV|BPF_K:
-                               if(*t == 0)
+                               if(fentry->k == 0)
                                        return (0);
-                               A /= *t;
+                               A /= fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_AND|BPF_X:
+                               A &= X;
+                               continue;
+
                        case BPF_ALU|BPF_AND|BPF_K:
-                               A &= *t;
+                               A &= fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_OR|BPF_X:
+                               A |= X;
+                               continue;
+
                        case BPF_ALU|BPF_OR|BPF_K:
-                               A |= *t;
+                               A |= fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_LSH|BPF_X:
+                               A <<= X;
+                               continue;
+
                        case BPF_ALU|BPF_LSH|BPF_K:
-                               A <<= *t;
+                               A <<= fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_RSH|BPF_X:
+                               A >>= X;
+                               continue;
+
                        case BPF_ALU|BPF_RSH|BPF_K:
-                               A >>= *t;
+                               A >>= fentry->k;
                                continue;
 
                        case BPF_ALU|BPF_NEG:
@@ -148,26 +192,62 @@ int sk_run_filter(unsigned char *data, int len, struct sock_filter *filter, int
                        case BPF_JMP|BPF_JSET|BPF_X:
                                pc += (A & X) ? fentry->jt : fentry->jf;
                                continue;
+
                        case BPF_LD|BPF_W|BPF_ABS:
                                k = fentry->k;
-                               if(k + sizeof(long) > len)
-                                       return (0);
-                               A = ntohl(*(long*)&data[k]);
-                               continue;
+load_w:
+                               if(k+sizeof(u32) <= len) {
+                                       A = ntohl(*(u32*)&data[k]);
+                                       continue;
+                               }
+                               if (k<0) {
+                                       u8 *ptr;
+
+                                       if (k>=SKF_AD_OFF)
+                                               break;
+                                       if ((ptr = load_pointer(skb, k)) != NULL) {
+                                               A = ntohl(*(u32*)ptr);
+                                               continue;
+                                       }
+                               }
+                               return 0;
 
                        case BPF_LD|BPF_H|BPF_ABS:
                                k = fentry->k;
-                               if(k + sizeof(short) > len)
-                                       return (0);
-                               A = ntohs(*(short*)&data[k]);
-                               continue;
+load_h:
+                               if(k + sizeof(u16) <= len) {
+                                       A = ntohs(*(u16*)&data[k]);
+                                       continue;
+                               }
+                               if (k<0) {
+                                       u8 *ptr;
+
+                                       if (k>=SKF_AD_OFF)
+                                               break;
+                                       if ((ptr = load_pointer(skb, k)) != NULL) {
+                                               A = ntohs(*(u16*)ptr);
+                                               continue;
+                                       }
+                               }
+                               return 0;
 
                        case BPF_LD|BPF_B|BPF_ABS:
                                k = fentry->k;
-                               if(k >= len)
-                                       return (0);
-                               A = data[k];
-                               continue;
+load_b:
+                               if(k < len) {
+                                       A = data[k];
+                                       continue;
+                               }
+                               if (k<0) {
+                                       u8 *ptr;
+
+                                       if (k>=SKF_AD_OFF)
+                                               break;
+                                       if ((ptr = load_pointer(skb, k)) != NULL) {
+                                               A = *ptr;
+                                               continue;
+                                       }
+                               }
 
                        case BPF_LD|BPF_W|BPF_LEN:
                                A = len;
@@ -177,35 +257,23 @@ int sk_run_filter(unsigned char *data, int len, struct sock_filter *filter, int
                                X = len;
                                continue;
 
-                      case BPF_LD|BPF_W|BPF_IND:
+                       case BPF_LD|BPF_W|BPF_IND:
                                k = X + fentry->k;
-                               if(k + sizeof(u32) > len)
-                                       return (0);
-                                A = ntohl(*(u32 *)&data[k]);
-                               continue;
+                               goto load_w;
 
                        case BPF_LD|BPF_H|BPF_IND:
                                k = X + fentry->k;
-                               if(k + sizeof(u16) > len)
-                                       return (0);
-                               A = ntohs(*(u16*)&data[k]);
-                               continue;
+                               goto load_h;
 
                        case BPF_LD|BPF_B|BPF_IND:
                                k = X + fentry->k;
-                               if(k >= len)
-                                       return (0);
-                               A = data[k];
-                               continue;
+                               goto load_b;
 
                        case BPF_LDX|BPF_B|BPF_MSH:
-                               /*
-                                *      Hack for BPF to handle TOS etc
-                                */
                                k = fentry->k;
                                if(k >= len)
                                        return (0);
-                               X = (data[fentry->k] & 0xf) << 2;
+                               X = (data[k] & 0xf) << 2;
                                continue;
 
                        case BPF_LD|BPF_IMM:
@@ -216,7 +284,7 @@ int sk_run_filter(unsigned char *data, int len, struct sock_filter *filter, int
                                X = fentry->k;
                                continue;
 
-                       case BPF_LD|BPF_MEM:
+                       case BPF_LD|BPF_MEM:
                                A = mem[fentry->k];
                                continue;
 
@@ -246,15 +314,29 @@ int sk_run_filter(unsigned char *data, int len, struct sock_filter *filter, int
                                mem[fentry->k] = X;
                                continue;
 
-
-
                        default:
                                /* Invalid instruction counts as RET */
                                return (0);
                }
+
+               /* Handle ancillary data, which are impossible
+                  (or very difficult) to get parsing packet contents.
+                */
+               switch (k-SKF_AD_OFF) {
+               case SKF_AD_PROTOCOL:
+                       A = htons(skb->protocol);
+                       continue;
+               case SKF_AD_PKTTYPE:
+                       A = skb->pkt_type;
+                       continue;
+               case SKF_AD_IFINDEX:
+                       A = skb->dev->ifindex;
+                       continue;
+               default:
+                       return 0;
+               }
        }
 
-       printk(KERN_ERR "Filter ruleset ran off the end.\n");
        return (0);
 }
 
@@ -279,13 +361,17 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
                  
                 ftest = &filter[pc];
                if(BPF_CLASS(ftest->code) == BPF_JMP)
-               {       
+               {
                        /*
                         *      But they mustn't jump off the end.
                         */
                        if(BPF_OP(ftest->code) == BPF_JA)
                        {
-                               if(pc + ftest->k + 1>= (unsigned)flen)
+                               /* Note, the large ftest->k might cause
+                                  loops. Compare this with conditional
+                                  jumps below, where offsets are limited. --ANK (981016)
+                                */
+                               if (ftest->k >= (unsigned)(flen-pc-1))
                                        return (-EINVAL);
                        }
                         else
@@ -302,17 +388,18 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
                  *     Check that memory operations use valid addresses.
                  */
                  
-                if(ftest->k <0 || ftest->k >= BPF_MEMWORDS)
+                if (ftest->k >= BPF_MEMWORDS)
                 {
                        /*
                         *      But it might not be a memory operation...
                         */
-                        
-                       if (BPF_CLASS(ftest->code) == BPF_ST)
+                       switch (ftest->code) {
+                       case BPF_ST:    
+                       case BPF_STX:   
+                       case BPF_LD|BPF_MEM:    
+                       case BPF_LDX|BPF_MEM:   
                                return -EINVAL;
-                       if((BPF_CLASS(ftest->code) == BPF_LD) && 
-                               (BPF_MODE(ftest->code) == BPF_MEM))
-                                       return (-EINVAL);
+                       }
                }
         }
 
@@ -332,35 +419,36 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
 
 int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
 {
-       struct sock_filter *fp, *old_filter
-       int fsize = sizeof(struct sock_filter) * fprog->len;
+       struct sk_filter *fp
+       unsigned int fsize = sizeof(struct sock_filter) * fprog->len;
        int err;
 
        /* Make sure new filter is there and in the right amounts. */
-        if(fprog->filter == NULL || fprog->len == 0 || fsize > BPF_MAXINSNS)
+        if (fprog->filter == NULL || fprog->len > BPF_MAXINSNS)
                 return (-EINVAL);
 
-       if((err = sk_chk_filter(fprog->filter, fprog->len))==0)
-       {
-               /* If existing filter, remove it first */
-               if(sk->filter)
-               {
-                       old_filter = sk->filter_data;
-                       kfree_s(old_filter, (sizeof(old_filter) * sk->filter));
-                       sk->filter_data = NULL;
-               }
+       fp = (struct sk_filter *)sock_kmalloc(sk, fsize+sizeof(*fp), GFP_KERNEL);
+       if(fp == NULL)
+               return (-ENOMEM);
 
-               fp = (struct sock_filter *)kmalloc(fsize, GFP_KERNEL);
-               if(fp == NULL)
-                       return (-ENOMEM);
+       if (copy_from_user(fp->insns, fprog->filter, fsize)) {
+               sock_kfree_s(sk, fp, fsize+sizeof(*fp)); 
+               return -EFAULT;
+       }
 
-               memset(fp,0,sizeof(*fp));
-               memcpy(fp, fprog->filter, fsize);       /* Copy instructions */
+       atomic_set(&fp->refcnt, 1);
+       fp->len = fprog->len;
 
-               sk->filter = fprog->len;        /* Number of filter blocks */
-               sk->filter_data = fp;           /* Filter instructions */
+       if ((err = sk_chk_filter(fp->insns, fp->len))==0) {
+               struct sk_filter *old_fp = sk->filter;
+               sk->filter = fp;
+               wmb();
+               fp = old_fp;
        }
 
+       if (fp)
+               sk_filter_release(sk, fp);
+
        return (err);
 }
 #endif /* CONFIG_FILTER */
index caaaa21e62d1ff8e300ec875c3e4c435a53661f7..381ee8be416e7379086e59e4d9a3892791e6a4fb 100644 (file)
@@ -155,10 +155,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
        int err;
        struct linger ling;
        int ret = 0;
-
-#ifdef CONFIG_FILTER
-       struct sock_fprog fprog;
-#endif
        
        /*
         *      Options without arguments
@@ -256,12 +252,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 
                case SO_PRIORITY:
                        if (val >= 0 && val <= 7) 
+                       {
+                               if(val==7 && !capable(CAP_NET_ADMIN))
+                                       return -EPERM;
                                sk->priority = val;
-                       else
-                               return(-EINVAL);
+                       }                       
                        break;
 
-
                case SO_LINGER:
                        if(optlen<sizeof(ling))
                                return -EINVAL; /* 1003.1g */
@@ -310,10 +307,12 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                                if (optlen > IFNAMSIZ) 
                                        optlen = IFNAMSIZ; 
                                if (copy_from_user(devname, optval, optlen))
-                                   return -EFAULT;
-                                   
+                                       return -EFAULT;
+
                                /* Remove any cached route for this socket. */
+                               lock_sock(sk);
                                dst_release(xchg(&sk->dst_cache, NULL));
+                               release_sock(sk);
 
                                if (devname[0] == '\0') {
                                        sk->bound_dev_if = 0;
@@ -331,30 +330,32 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 
 #ifdef CONFIG_FILTER
                case SO_ATTACH_FILTER:
-                       if(optlen < sizeof(struct sock_fprog))
-                               return -EINVAL;
+                       ret = -EINVAL;
+                       if (optlen == sizeof(struct sock_fprog)) {
+                               struct sock_fprog fprog;
 
-                       if(copy_from_user(&fprog, optval, sizeof(fprog)))
-                       {
                                ret = -EFAULT;
-                               break;
-                       }
+                               if (copy_from_user(&fprog, optval, sizeof(fprog)))
+                                       break;
 
-                       ret = sk_attach_filter(&fprog, sk);
+                               ret = sk_attach_filter(&fprog, sk);
+                       }
                        break;
 
                case SO_DETACH_FILTER:
-                        if(sk->filter)
-                       {
-                               fprog.filter = sk->filter_data;
-                               kfree_s(fprog.filter, (sizeof(fprog.filter) * sk->filter));
-                               sk->filter_data = NULL;
-                               sk->filter = 0;
+                        if(sk->filter) {
+                               struct sk_filter *filter;
+
+                               filter = sk->filter;
+
+                               sk->filter = NULL;
+                               wmb();
+                               
+                               if (filter)
+                                       sk_filter_release(sk, filter);
                                return 0;
                        }
-                       else
-                               return -EINVAL;
-                       break;
+                       return -ENOENT;
 #endif
                /* We implement the SO_SNDLOWAT etc to
                   not be settable (1003.1g 5.3) */
@@ -504,6 +505,16 @@ void sk_free(struct sock *sk)
        if (sk->destruct)
                sk->destruct(sk);
 
+#ifdef CONFIG_FILTER
+       if (sk->filter) {
+               sk_filter_release(sk, sk->filter);
+               sk->filter = NULL;
+       }
+#endif
+
+       if (atomic_read(&sk->omem_alloc))
+               printk(KERN_DEBUG "sk_free: optmem leakage (%d bytes) detected.\n", atomic_read(&sk->omem_alloc));
+
        kmem_cache_free(sk_cachep, sk);
 }
 
index 914c515d71c1743a416ff878c46f99a9262f20fa..b8b23eb384397acdb5cfe8ea5a613ffa49566e84 100644 (file)
@@ -1323,6 +1323,10 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                newsk->pair = NULL;
                skb_queue_head_init(&newsk->back_log);
                skb_queue_head_init(&newsk->error_queue);
+#ifdef CONFIG_FILTER
+               if (newsk->filter)
+                       sk_filter_charge(newsk, newsk->filter);
+#endif
 
                /* Now setup tcp_opt */
                newtp = &(newsk->tp_pinfo.af_tcp);
@@ -1553,12 +1557,10 @@ static inline struct sock *tcp_v4_hnd_req(struct sock *sk,struct sk_buff *skb)
 
 int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
 {
+
 #ifdef CONFIG_FILTER
-       if (sk->filter)
-       {
-               if (sk_filter(skb, sk->filter_data, sk->filter))
-                       goto discard;
-       }
+       if (sk->filter && sk_filter(skb, sk->filter))
+               goto discard;
 #endif /* CONFIG_FILTER */
 
        /* 
index 3e99d80dbf33cf5f4bda1cdcd65b16dcda9d43b7..eb21856896378cbc4a257c5d2bcdfa5a8d3eb54b 100644 (file)
@@ -30,6 +30,7 @@
  *             David S. Miller :       Charge memory using the right skb
  *                                     during syn/ack processing.
  *             David S. Miller :       Output engine completely rewritten.
+ *             Andrea Arcangeli:       SYNACK carry ts_recent in tsecr.
  *
  */
 
@@ -135,7 +136,8 @@ void tcp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                                              (sysctl_flags & SYSCTL_FLAG_SACK),
                                              (sysctl_flags & SYSCTL_FLAG_WSCALE),
                                              tp->rcv_wscale,
-                                             TCP_SKB_CB(skb)->when);
+                                             TCP_SKB_CB(skb)->when,
+                                             tp->ts_recent);
                } else {
                        tcp_build_and_update_options((__u32 *)(th + 1),
                                                     tp, TCP_SKB_CB(skb)->when);
@@ -862,7 +864,8 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
        TCP_SKB_CB(skb)->when = jiffies;
        tcp_syn_build_options((__u32 *)(th + 1), req->mss, req->tstamp_ok,
                              req->sack_ok, req->wscale_ok, req->rcv_wscale,
-                             TCP_SKB_CB(skb)->when);
+                             TCP_SKB_CB(skb)->when,
+                             req->ts_recent);
 
        skb->csum = 0;
        th->doff = (tcp_header_size >> 2);
index df3c9cce5801c8b4c8e604c2f26c4fe5fb98fec7..f6e86d92ddc5807d93036bdbd4fd814074c4e980 100644 (file)
@@ -75,8 +75,7 @@ void net_timer (unsigned long data)
        /* Only process if socket is not in use. */
        if (atomic_read(&sk->sock_readers)) {
                /* Try again later. */ 
-               sk->timer.expires = jiffies+HZ/20;
-               add_timer(&sk->timer);
+               mod_timer(&sk->timer, jiffies+HZ/20);
                return;
        }