]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.20 2.3.20
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:27:33 +0000 (15:27 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:27:33 +0000 (15:27 -0500)
33 files changed:
Documentation/Configure.help
arch/i386/config.in
arch/i386/kernel/Makefile
arch/i386/kernel/bios32.c [deleted file]
arch/i386/kernel/mtrr.c
arch/i386/kernel/pci-i386.c [new file with mode: 0644]
arch/i386/kernel/pci-i386.h [new file with mode: 0644]
arch/i386/kernel/pci-pc.c [new file with mode: 0644]
arch/i386/kernel/pci-visws.c [new file with mode: 0644]
drivers/block/ide-pci.c
drivers/char/pms.c
drivers/misc/acpi.c
drivers/parport/ieee1284.c
drivers/parport/parport_pc.c
drivers/pci/devlist.h
drivers/scsi/scsi_ioctl.c
drivers/scsi/sg.c
drivers/usb/Config.in
drivers/usb/inits.h
drivers/usb/mouse.c
drivers/usb/proc_usb.c
drivers/usb/serial.c
drivers/usb/usb-core.c
drivers/usb/usb.c
drivers/usb/usb.h
drivers/usb/usb_scsi_debug.c
fs/buffer.c
fs/fat/file.c
fs/ncpfs/dir.c
fs/ncpfs/inode.c
include/linux/acpi.h
include/linux/pci_ids.h
ipc/shm.c

index 6be67e5b4508ad0d676757744c65e33065619f76..8c00e9998b3fecf6fd4c75fed43cb02b584b4883 100644 (file)
@@ -5,29 +5,35 @@
 #
 # Translations of this file available on the WWW:
 #
-#   - Japanese, by Tetsuyasu YAMADA (tetsu@cauchy.nslab.ntt.co.jp), at
-#     http://jf.gee.kyoto-u.ac.jp/JF/JF-ftp/euc/Configure.help.euc
+#   - Japanese, maintained by the JF Project (JF@linux.or.jp), at
+#     http://www.linux.or.jp/JF/JFdocs/Configure.help/
 #   - Russian, by kaf@linux.nevod.perm.su, at
 #     http://nevod.perm.su/service/linux/doc/kernel/Configure.help
-#   - French, by David Bourgin (dbourgin@wsc.com), at
-#     http://www.linux-kheops.com/traduc/kernels/
+#   - French, by Tane Pierre (tanep@bigfoot.com), at
+#     http://www.kernelfr.org
 #   - Spanish, by Carlos Perelló Marín (fperllo@ehome.encis.es), at
 #     http://visar.csustan.edu/~carlos/
 #   - Italian, by Alessandro Rubini (rubini@linux.it), at
 #     ftp://ftp-pavia1.linux.it/pub/linux/Configure.help
 #   - Polish, by Cezar Cichocki (cezar@cs.net.pl), at
 #     http://www.cs.net.pl/~cezar/Kernel
-#   - German, by Jörg Strebel (jstrebel@suse.de) and Karl Eichwalder
-#     (ke@suse.de), at http://www.suse.de/~ke/kernel/Configure.de.help.gz
+#   - German, by SuSE, at http://www.suse.de/~ke/kernel . This patch
+#     includes infrastructure to support different languages as well.
+#
+# To access a document on the WWW, you need to have a direct Internet
+# connection and a browser program such as netscape or lynx. If you
+# only have email access, you can still use FTP and WWW servers: send
+# an email to mail-server@rtfm.mit.edu with the text 
+#   send usenet/news.answers/internet-services/access-via-email 
+# in the body of the message.
 #
 # Information about what a kernel is, what it does, how to patch and
 # compile it and much more is contained in the Kernel-HOWTO, available
-# via FTP (user: anonymous) from metalab.unc.edu in the directory
-# /pub/Linux/docs/HOWTO. Before you start compiling, make sure that
-# you have the necessary versions of all programs and libraries
-# required to compile and run this kernel; they are listed in the file
-# Documentation/Changes. Make sure to read the toplevel kernel README 
-# file as well.
+# at http://metalab.unc.edu/mdw/linux.html#howto . Before you start
+# compiling, make sure that you have the necessary versions of all
+# programs and libraries required to compile and run this kernel; they
+# are listed in the file Documentation/Changes. Make sure to read the
+# toplevel kernel README file as well.
 #
 # Format of this file: description<nl>variable<nl>help text<nl><nl>. If
 # the question being documented is of type "choice", we list only the
@@ -104,9 +110,7 @@ CONFIG_SMP
 
   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).
+  SMP-FAQ on the WWW at http://www.irisa.fr/prive/mentre/smp-faq/ .
   
   If you don't know what to do here, say N.
   
@@ -126,39 +130,38 @@ CONFIG_MATH_EMULATION
   is broken. Try "man bootparam" or see the documentation of your boot
   loader (lilo or loadlin) about how to pass options to the kernel at
   boot time. The lilo procedure is also explained in the SCSI-HOWTO,
-  available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.) This means that it is a
-  good idea to say Y here if you intend to use this kernel on
-  different machines. 
+  available from http://metalab.unc.edu/mdw/linux.html#howto .) This
+  means that it is a good idea to say Y here if you intend to use this
+  kernel on different machines.
 
   More information about the internals of the Linux math coprocessor
   emulation can be found in arch/i386/math-emu/README.
 
   If you are not sure, say Y; apart from resulting in a 45 KB bigger
   kernel, it won't hurt.
-  
+
 Timer and CPU usage LEDs
 CONFIG_LEDS
-  If you define this option, the LEDs on your machine will be used
+  If you say Y here, the LEDs on your machine will be used
   to provide useful information about your current system status.
 
-  If you are compiling a kernel for a NetWinder or EBSA-285, you
-  will be able to select which LEDs are active using the options
-  below. If you are compiling a kernel for the EBSA-110 however,
-  the red LED will simply flash regularly to indicate that the
-  system is still functional. It is still safe to say yes here if
-  you have a CATS system, but the driver will do nothing.
+  If you are compiling a kernel for a NetWinder or EBSA-285, you will
+  be able to select which LEDs are active using the options below. If
+  you are compiling a kernel for the EBSA-110 however, the red LED
+  will simply flash regularly to indicate that the system is still
+  functional. It is safe to say Y here if you have a CATS system, but
+  the driver will do nothing.
 
 Timer LED
 CONFIG_LEDS_TIMER
-  If you say yes here, one of the system LEDs (the green one on the
+  If you say Y here, one of the system LEDs (the green one on the
   NetWinder or the amber one on the EBSA285) will flash regularly to
   indicate that the system is still operational. This is mainly
   useful to kernel hackers who are debugging unstable kernels.
 
 CPU usage LED
 CONFIG_LEDS_CPU
-  If you say yes here, the red LED will be used to give a good real
+  If you say Y here, the red LED will be used to give a good real
   time indication of CPU usage, by lighting whenever the idle task
   is not currently executing.
 
@@ -170,8 +173,16 @@ CONFIG_MATHEMU
 
 Big memory support
 CONFIG_BIGMEM
-  This option is required if you want to utilize physical memory which
-  is not covered by the kernel virtual address space (> 1GB).
+  Linux can use up to 2 Gigabytes (= 2^31 bytes) of physical memory.
+  If you are compiling a kernel which will never run on a machine with
+  more than 1 Gigabyte, answer N here. Otherwise, say Y.
+
+  The actual amount of physical memory should be specified using a
+  kernel command line option such as "mem=256M". (Try "man bootparam"
+  or see the documentation of your boot loader (lilo or loadlin) about
+  how to pass options to the kernel at boot time. The lilo procedure
+  is also explained in the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
 
 Normal PC floppy disk support
 CONFIG_BLK_DEV_FD
@@ -238,16 +249,16 @@ CONFIG_BLK_DEV_LOOP
   on a remote file server. If you want to do this, you will first have
   to acquire and install a kernel patch from
   ftp://ftp.replay.com/pub/crypto/linux/all or
-  ftp://verden.pvv.org/pub/linux/kerneli/v2.1/, and then you need to
+  ftp://verden.pvv.org/pub/linux/kerneli/v2.1/ , and then you need to
   say Y to this option.
 
   Note that alternative ways to use encrypted filesystems are provided
-  by the cfs package, which can be gotten via FTP (user: anonymous)
-  from ftp://ftp.replay.com/pub/crypto/disk/, and the newer tcfs
-  package, available at http://tcfs.dia.unisa.it/. You do not need to
-  say Y here if you want to use one of these. However, using cfs
-  requires saying Y to "NFS filesystem support" below while using tcfs
-  requires applying a kernel patch.
+  by the cfs package, which can be gotten from
+  ftp://ftp.replay.com/pub/crypto/disk/ , and the newer tcfs package,
+  available at http://tcfs.dia.unisa.it/ . You do not need to say Y
+  here if you want to use one of these. However, using cfs requires
+  saying Y to "NFS filesystem support" below while using tcfs requires
+  applying a kernel patch.
 
   To use the loop device, you need the losetup utility and a recent
   version of the mount program, both contained in the util-linux
@@ -295,8 +306,8 @@ Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
 CONFIG_BLK_DEV_IDE
   If you say Y here, you will use the full-featured IDE driver to
   control up to eight IDE interfaces, each being able to serve a
-  "master" and a "slave" device, for a total of up to sixteen (16)
-  IDE disk/cdrom/tape/floppy drives.  People with SCSI-only systems
+  "master" and a "slave" device, for a total of up to sixteen IDE
+  disk/cdrom/tape/floppy drives. People with SCSI-only systems
   can say N here.
 
   Useful information about large (>540 MB) IDE disks, multiple
@@ -304,12 +315,11 @@ CONFIG_BLK_DEV_IDE
   detected, sound card IDE ports, module support, and other topics, is
   contained in Documentation/ide.txt. For detailed information about
   hard drives, consult the Disk-HOWTO and the Multi-Disk-HOWTO,
-  available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   To fine-tune IDE drive/interface parameters for improved
   performance, look for the hdparm package at
-  ftp://metalab.unc.edu/pub/Linux/kernel/patches/diskdrives/
+  ftp://metalab.unc.edu/pub/Linux/kernel/patches/diskdrives/ .
 
   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),
@@ -337,8 +347,8 @@ CONFIG_BLK_DEV_HD_ONLY
 
   If you are unsure, then just choose the Enhanced IDE/MFM/RLL driver
   instead of this one. For more detailed information, read the
-  Disk-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  Disk-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   People with SCSI-only systems can say N here.
 
@@ -377,7 +387,7 @@ CONFIG_BLK_DEV_IDEDISK
 
 Use multi-mode by default
 CONFIG_IDEDISK_MULTI_MODE
-  If you get this error, try to enable this option.
+  If you get this error, try to say Y here:
 
   hda: set_multmode: status=0x51 { DriveReady SeekComplete Error }
   hda: set_multmode: error=0x04 { DriveStatusError }
@@ -398,12 +408,12 @@ CONFIG_BLK_DEV_IDECD
   CDROM drive, you can say N to all other CDROM options, but be sure
   to say Y or M to "ISO 9660 CDROM filesystem support".
 
-  Read the CDROM-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO and the file
+  Read the CDROM-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto and the file
   Documentation/cdrom/ide-cd. Note that older versions of lilo (the
   Linux boot loader) cannot properly deal with IDE/ATAPI CDROMs, so
   install lilo-16 or higher, available from
-  ftp://metalab.unc.edu/pub/Linux/system/Linux-boot/lilo.
+  ftp://metalab.unc.edu/pub/Linux/system/boot/lilo .
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -413,11 +423,11 @@ CONFIG_BLK_DEV_IDECD
 Include CD-Changer Reporting
 CONFIG_IDECD_SLOTS
   If you have an IDE/ATAPI multi-slot cd-changer and you want
-  to report which slots have disk-present, say Y.  If you say Y
-  and there is not a multi-slot cdrom present, this code is skipped.
+  to report which slots have a disk present, say Y.  If you say Y
+  and there is no multi-slot cdrom present, this code is skipped.
 
-  This could be the bases of multi-disk access based on multi-mounts.
-  This is still pie-in-the-sky.
+  This code could be the basis of multi-disk access based on
+  multi-mounts, but this is still pie-in-the-sky.
 
   If unsure, say N.
 
@@ -497,8 +507,8 @@ CONFIG_BLK_DEV_CMD640
   to enable the CMD640 bugfix/support: "ide0=cmd640_vlb". (Try "man
   bootparam" or see the documentation of your boot loader about how to
   pass options to the kernel. The lilo procedure is also explained in
-  the SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.)
+  the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
 
   The CMD640 chip is also used on add-in cards by Acculogic, and on
   the "CSA-6400E PCI to IDE controller" that some people have. For
@@ -543,14 +553,56 @@ CONFIG_BLK_DEV_IDEDMA_PCI
   enabled automatically. By default, DMA is not enabled automatically
   for these drives, but you can change that by saying Y to the
   following question "Use DMA by default when available". You can get
-  the latest version of the hdparm utility via anonymous FTP from
-  ftp://metalab.unc.edu/pub/Linux/system/hardware/.
+  the latest version of the hdparm utility from
+  ftp://metalab.unc.edu/pub/Linux/system/hardware/ .
 
   Read the comments at the beginning of drivers/block/idedma.c and the
   file Documentation/ide.txt for more information. 
 
   It is safe to say Y to this question.
 
+Good-Bad DMA Model-Firmware (EXPERIMENTAL)
+IDEDMA_NEW_DRIVE_LISTINGS
+  If you say Y here, the model and firmware revision of your drive
+  will be compared against a blacklist of buggy drives that claim to
+  be (U)DMA capable but aren't. This is a blanket on/off test with no
+  speed limit options.
+
+  Straight GNU GCC 2.7.3/2.8.X compilers are known to be safe;
+  whereas, many versions of EGCS have a problem and miscompile if you
+  say Y here.
+
+  If in doubt, say N.
+
+Winbond SL82c105 support
+CONFIG_BLK_DEV_SL82C105
+  If you have a Winbond SL82c105 IDE controller, say Y here to enable
+  special configuration for this chip. This is common on various CHRP
+  motherboards, but could be used elsewhere. If in doubt, say Y.
+
+Boot off-board chipsets first support
+CONFIG_BLK_DEV_OFFBOARD
+  Normally, IDE controllers built into the motherboard (on-board
+  controllers) are assigned to ide0 and ide1 while those on add-in PCI
+  cards (off-board controllers) are relegated to ide2 and ide3.
+  Answering Y here will allow you to reverse the situation, with
+  off-board controllers on ide0/1 and on-board controllers on ide2/3.
+  This can improve the usability of some boot managers such as LILO
+  when booting from a drive on an off-board controller.
+
+  If you say Y here, and you actually want to reverse the device scan
+  order as explained above, you also need to issue the kernel command
+  line option "pci=reverse". (Try "man bootparam" or see the
+  documentation of your boot loader (lilo or loadlin) about how to
+  pass options to the kernel at boot time. The lilo procedure is also
+  explained in the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
+
+  Note that, if you do this, the order of the hd* devices will be
+  rearranged which may require modification of fstab and other files.
+
+  If in doubt, say N.
+
 Use DMA by default when available
 CONFIG_IDEDMA_PCI_AUTO
   Prior to kernel version 2.1.112, Linux used to automatically use
@@ -565,42 +617,110 @@ CONFIG_IDEDMA_PCI_AUTO
   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.
 
-Good-Bad DMA Model-Firmware (EXPERIMENTAL)
-IDEDMA_NEW_DRIVE_LISTINGS
-  This test compares both the model and firmware revision for buggy drives
-  that claim to (U)DMA capable.  This is a blanket on/off test with no speed
-  limit options.  Straight GNU GCC 2.7.3/2.8.X compilers are known to be safe;
-  whereas, many versions of EGCS have a problem and miscompile.
+Other IDE chipset support
+CONFIG_IDE_CHIPSETS
+  Say Y here if you want to include enhanced support for various IDE
+  interface chipsets used on motherboards and add-on cards. You can
+  then pick your particular IDE chip from among the following options.
+  This enhanced support may be necessary for Linux to be able to
+  access the 3rd/4th drives in some systems. It may also enable
+  setting of higher speed I/O rates to improve system performance with
+  these chipsets. Most of these also require special kernel boot
+  parameters to actually turn on the support at runtime; you can find
+  a list of these in the file Documentation/ide.txt.
+  
+  People with SCSI-only systems can say N here. 
 
-  If in doubt, say N.
+Generic 4 drives/port support
+CONFIG_BLK_DEV_4DRIVES
+  Certain older chipsets, including the Tekram 690CD, use a single set
+  of I/O ports at 0x1f0 to control up to four drives, instead of the
+  customary two drives per port. Support for this can be enabled at
+  runtime using the "ide0=four" kernel boot parameter if you say Y
+  here.
 
-Boot off-board chipsets first support
-CONFIG_BLK_DEV_OFFBOARD
-  Normally, IDE controllers built into the motherboard (on-board
-  controllers) are assigned to ide0 and ide1 while those on add-in PCI
-  cards (off-board controllers) are relegated to ide2 and ide3.
-  Answering Y here will reverse the situation, with off-board
-  controllers on ide0/1 and on-board controllers on ide2/3. This can
-  improve the usability of some boot managers such as LILO when
-  booting from a drive on an off-board controller.
+DTC-2278 support
+CONFIG_BLK_DEV_DTC2278
+  This driver is enabled at runtime using the "ide0=dtc2278" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the DTC-2278 card, and permits faster I/O speeds to be set as
+  well. See the Documentation/ide.txt and drivers/block/dtc2278.c
+  files for more info.
 
-  Requires that all onboard ide controllers be disabled or calling
-  "pci=reverse" to invert the device scan order.
+Holtek HT6560B support
+CONFIG_BLK_DEV_HT6560B
+  This driver is enabled at runtime using the "ide0=ht6560b" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the Holtek card, and permits faster I/O speeds to be set as well.
+  See the Documentation/ide.txt and drivers/block/ht6560b.c files for
+  more info.
 
-  Note that, if you say Y here, the order of the hd* devices will be
-  rearranged which may require modification of fstab and other files.
+PROMISE DC4030 support (EXPERIMENTAL)
+CONFIG_BLK_DEV_PDC4030
+  This driver provides support for the secondary IDE interface and
+  cache of Promise IDE chipsets, e.g. DC4030 and DC5030. This driver
+  is known to incur timeouts/retries during heavy I/O to drives
+  attached to the secondary interface. CDROM and TAPE devices are not
+  supported yet. This driver is enabled at runtime using the
+  "ide0=dc4030" kernel boot parameter. See the Documentation/ide.txt
+  and drivers/block/pdc4030.c files for more info.
 
-  If in doubt, say N.
+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.
 
-AEC6210 chipset support
-CONFIG_BLK_DEV_AEC6210
-  This driver adds up to 4 more eide devices sharing a single interrupt.
-  This add-on card is a bootable PCI UDMA controller.  In order to get this
-  card to initialize correctly in some cases, you should include this driver.
+Tekram TRM290 chipset support (EXPERIMENTAL)
+CONFIG_BLK_DEV_TRM290
+  This driver adds support for bus master DMA transfers
+  using the Tekram TRM290 PCI IDE chip. Volunteers are
+  needed for further tweaking and development.
+  Please read the comments at the top of drivers/block/trm290.c.
+
+OPTi 82C621 enhanced support (EXPERIMENTAL)
+CONFIG_BLK_DEV_OPTI621
+  This is a driver for the OPTi 82C621 EIDE controller.
+  Please read the comments at the top of drivers/block/opti621.c.
 
-  This prefers CONFIG_IDEDMA_PCI_AUTO to be enabled, regardless.
+NS87415 support (EXPERIMENTAL)
+CONFIG_BLK_DEV_NS87415
+  This driver adds detection and support for the NS87415 chip
+  (used in SPARC64, among others).
 
-  Please read the comments at the top of drivers/block/aec6210.c
+  Please read the comments at the top of drivers/block/ns87415.c.
+
+CY82C693 chipset support (EXPERIMENTAL)
+CONFIG_BLK_DEV_CY82C693
+  This driver adds detection and support for the CY82C693 chipset
+  used on Digital's PC-Alpha 164SX boards.
+
+  If you say Y here, you need to say Y to "Use DMA by default
+  when available" as well.
+
+VIA82C586 chipset support (EXPERIMENTAL)
+CONFIG_BLK_DEV_VIA82C586
+  Saying Y here adds initial timing settings for VIA (U)DMA onboard
+  IDE controllers that are ATA3 compliant. May work with ATA4 systems,
+  but not tested to date. To use some features of this chipset, you
+  will have to issue a kernel command line as described in the file
+  drivers/block/via82c586.c. Furthermore, if you also say Y to "/proc
+  filesystem support" and set DISPLAY_APOLLO_TIMINGS in via82c586.c,
+  you will be able to read information about the IDE controller from
+  the virtual file /proc/ide/via.
+
+  If you say Y here, you also need to say Y to "Use DMA by default
+  when available", above.
+
+  If unsure, say N.
+
+CMD646 chipset support (EXPERIMENTAL)
+CONFIG_BLK_DEV_CMD646
+  Say Y here if you have an IDE controller which uses this chipset.
 
 ALI M15x3 chipset support (EXPERIMENTAL)
 CONFIG_BLK_DEV_ALI15X3
@@ -608,52 +728,78 @@ CONFIG_BLK_DEV_ALI15X3
   onboard chipsets.  It also tests for Simplex mode and enables
   normal dual channel support.
 
-  This requires CONFIG_IDEDMA_PCI_AUTO to be enabled.
+  If you say Y here, you also need to say Y to "Use DMA by default
+  when available", above.
 
   Please read the comments at the top of drivers/block/alim15x3.c
 
   If unsure, say N.
 
-CMD646 chipset support (EXPERIMENTAL)
-CONFIG_BLK_DEV_CMD646
-  Say Y here if you have an IDE controller like this.
+PROMISE PDC20246/PDC20262 support
+CONFIG_BLK_DEV_PDC202XX
+  Promise Ultra33 or PDC20246
 
-CY82C693 chipset support (EXPERIMENTAL)
-CONFIG_BLK_DEV_CY82C693
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. This add-on card is a bootable PCI UDMA controller. Since
+  multiple cards can be installed and there are BIOS ROM problems that
+  happen if the BIOS revisions of all installed cards (three-max) do
+  not match, the driver attempts to do dynamic tuning of the chipset at
+  boot-time for max-speed. Ultra33 BIOS 1.25 or newer is required for
+  more than one card. This card may require that you say Y to "Special
+  UDMA Feature (EXPERIMENTAL)".
 
-  This driver adds detection and support for the CY82C693 chipset
-  used on Digital's PC-Alpha 164SX boards.
+  Promise Ultra66 or PDC20262
 
-  This requires CONFIG_IDEDMA_PCI_AUTO to be enabled.
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. This add-on card is a bootable PCI UDMA ATA-66
+  controller. The driver attempts to dynamic tuning of the chipset at
+  boot-time for max-speed. Note tested limits are UDMA-2. Ultra66 BIOS
+  1.11 or newer required.
 
-  Please read the comments at the top of drivers/block/cy82c693.c
+  If you say Y here, you need to say Y to "Use DMA by default when
+  available" as well.
 
-HPT34X chipset support
-CONFIG_BLK_DEV_HPT34X
-  This driver adds up to 4 more EIDE devices sharing a single
-  interrupt. The HPT343 chipset in its current form is a non-bootable or
-  HPT345/HPT363 chipset is bootable (needs BIOS FIX) PCI UDMA controllers.
-  This driver requires dynamic tuning of the chipset during the ide-probe
-  at boot. It is reported to support DVD II drives, by the manufacturer.
+  Please read the comments at the top of drivers/block/pdc202xx.c
 
-  Please read the comments at the top of drivers/block/hpt34x.c
+  If unsure, say N.
 
-HPT34X DMA support (DANGEROUS)
-CONFIG_BLK_DEV_HPT34X_DMA
-  This requires CONFIG_IDEDMA_PCI_AUTO to be enabled.
+Special UDMA Feature (EXPERIMENTAL)
+PDC202XX_FORCE_BURST_BIT
+  For PDC20246 and PDC20262 Ultra DMA chipsets. Designed originally
+  for PDC20246/Ultra33 that has BIOS setup failures when using 3 or
+  more cards.
 
-  Please read the comments at the top of drivers/block/hpt34x.c
+  Please read the comments at the top of drivers/block/pdc202xx.c
+
+  If unsure, say N.
+
+Special Mode Feature (DANGEROUS)
+PDC202XX_FORCE_MASTER_MODE
+  For PDC20246 and PDC20262 Ultra DMA chipsets. This is reserved for
+  possible Hardware RAID 0,1 for the FastTrak Series.
+
+  Say N. 
+
+AEC6210 chipset support
+CONFIG_BLK_DEV_AEC6210
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. This add-on card is a bootable PCI UDMA controller. In
+  order to get this card to initialize correctly in some cases, you
+  should say Y here, and preferably also to "Use DMA by default when
+  available".
+
+  Please read the comments at the top of drivers/block/aec6210.c
 
 HPT366 chipset support
 CONFIG_BLK_DEV_HPT366
   This is an Ultra DMA chipset for ATA-66.
+  
   This driver adds up to 4 more EIDE devices sharing a single
   interrupt. The HPT366 chipset in its current form is a non-bootable.
-  This driver requires dynamic tuning of the chipset during the ide-probe
-  at boot. It is reported to support DVD II drives, by the manufacturer.
-
-  Please read the comments at the top of drivers/block/hpt366.c
-
+  This driver requires dynamic tuning of the chipset during the
+  ide-probe at boot. It is reported to support DVD II drives, by the
+  manufacturer.
 Intel PIIXn chipsets support
 CONFIG_BLK_DEV_PIIX
   This driver adds PIO mode setting and tuning for all PIIX IDE
@@ -667,107 +813,94 @@ CONFIG_BLK_DEV_PIIX
 
 PIIXn Tuning support (EXPERIMENTAL)
 CONFIG_BLK_DEV_PIIX_TUNING
-  This driver extension adds DMA mode setting and tuning for all PIIX IDE
-  controllers by Intel.  Since the BIOS can sometimes improperly setup
-  the device/adapter combination and speed limits, It has become a necessity
-  to back/forward speed devices as needed.
+  This driver extension adds DMA mode setting and tuning for all PIIX
+  IDE controllers by Intel. Since the BIOS can sometimes improperly
+  set up the device/adapter combination and speed limits, it has
+  become a necessity to back/forward speed devices as needed.
 
-  Case 430HX/440FX PIIX3 need speed limits to reduce UDMA to DMA mode 2
-  if the BIOS can to perform this task at INIT.
+  Case 430HX/440FX PIIX3 need speed limits to reduce UDMA to DMA mode
+  2 if the BIOS can not perform this task at initialization.
 
   If unsure, say N.
 
-NS87415 support (EXPERIMENTAL)
-CONFIG_BLK_DEV_NS87415
-  This driver adds detection and support for the NS87415 chip
-  (used in SPARC64, among others).
-
-  Please read the comments at the top of drivers/block/ns87415.c.
-
-OPTi 82C621 enhanced support (EXPERIMENTAL)
-CONFIG_BLK_DEV_OPTI621
-  This is a driver for the OPTi 82C621 EIDE controller.
-  Please read the comments at the top of drivers/block/opti621.c.
-
-PROMISE PDC20246/PDC20262 support
-CONFIG_BLK_DEV_PDC202XX
-  Promise Ultra33 or PDC20246.
-  This driver adds up to 4 more eide devices sharing a single interrupt.
-  This add-on card is a bootable PCI UDMA controller.
-  Since multiple cards can be installed and there are BIOS ROM problems
-  that happen if the BIOS revisions of all installed cards (three-max)
-  do not match.  Should you be unable to make new BIOS chips with a burner,
-  the driver attempts to dynamic tuning of the chipset at boot-time
-  for max-speed.  Ultra33 BIOS 1.25 or new required for more than one card.
-  This card may require "PDC202XX Special UDMA Feature (EXPERIMENTAL)".
-
-  Promise Ultra66 or PDC20262.
-  This driver adds up to 4 more eide devices sharing a single interrupt.
-  This add-on card is a bootable PCI UDMA ATA-66 controller.
-  The driver attempts to dynamic tuning of the chipset at boot-time
-  for max-speed.  Note tested limits are UDMA-2.
-  Ultra66 BIOS 1.11 or newer required.
-
-  This requires CONFIG_IDEDMA_PCI_AUTO to be enabled.
-
-  Please read the comments at the top of drivers/block/pdc202xx.c
-
-  If unsure, say N.
-
-Special UDMA Feature (EXPERIMENTAL)
-PDC202XX_FORCE_BURST_BIT
-  For PDC20246 and PDC20262 Ultra DMA chipsets.
-  Designed originally for PDC20246/Ultra33 that has BIOS setup failures
-  when using 3 or more cards.
+HPT34X chipset support
+CONFIG_BLK_DEV_HPT34X
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. The HPT343 chipset in its current form is a non-bootable
+  controller; the HPT345/HPT363 chipset is a bootable (needs BIOS FIX)
+  PCI UDMA controllers. This driver requires dynamic tuning of the
+  chipset during the ide-probe at boot time. It is reported to support
+  DVD II drives, by the manufacturer.
 
-  Please read the comments at the top of drivers/block/pdc202xx.c
+HPT34X DMA support (DANGEROUS)
+CONFIG_BLK_DEV_HPT34X_DMA
+  you need to say Y to "Use DMA by default when available" if you say
+  Y here.
 
-  If unsure, say N.
+  Please read the comments at the top of drivers/block/hpt343.c
 
-Special Mode Feature (DANGEROUS)
-PDC202XX_FORCE_MASTER_MODE
-  For PDC20246 and PDC20262 Ultra DMA chipsets.
-  This is reserved for possible Hardware RAID 0,1 for the FastTrak Series.
+QDI QD6580 support
+CONFIG_BLK_DEV_QD6580
+  This driver is enabled at runtime using the "ide0=qd6580" kernel
+  boot parameter. It permits faster I/O speeds to be set. See the
+  files Documentation/ide.txt and drivers/block/qd6580.c for more
+  info.
 
-  Say N. 
+UMC 8672 support
+CONFIG_BLK_DEV_UMC8672
+  This driver is enabled at runtime using the "ide0=umc8672" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the UMC-8672, and permits faster I/O speeds to be set as well.
+  See the files Documentation/ide.txt and drivers/block/umc8672.c for
+  more info.
 
-SiS5513 chipset support
-CONFIG_BLK_DEV_SIS5513
-  This driver ensures (U)DMA support for SIS5513 chipset based mainboards.
-  SiS620/530 UDMA mode 4, SiS5600/5597 UDMA mode 2, all other DMA mode 2
-  limited chipsets are unsupported to date.
+ALI M14xx support
+CONFIG_BLK_DEV_ALI14XX
+  This driver is enabled at runtime using the "ide0=ali14xx" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
+  I/O speeds to be set as well. See the files Documentation/ide.txt
+  and drivers/block/ali14xx.c for more info.
 
-  This requires CONFIG_IDEDMA_PCI_AUTO to be enabled.
+Amiga builtin Gayle IDE interface support
+CONFIG_BLK_DEV_GAYLE
+  This is the IDE driver for the builtin IDE interface on some Amiga
+  models. It supports both the `A1200 style' (used in A600 and A1200)
+  and `A4000 style' (used in A4000 and A4000T) of the Gayle IDE
+  interface. Say Y if you have such an Amiga model and want to use IDE
+  devices (hard disks, CD-ROM drives, etc.) that are connected to the
+  builtin IDE interface.
 
-  Please read the comments at the top of drivers/block/sis5513.c
+Falcon IDE interface support
+CONFIG_BLK_DEV_FALCON_IDE
+  This is the IDE driver for the builtin IDE interface on the Atari
+  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
+  disks, CD-ROM drives, etc.) that are connected to the builtin IDE
+  interface.
 
-Winbond SL82c105 support
-CONFIG_BLK_DEV_SL82C105
-  If you have a Winbond SL82c105 IDE controller, say Y here to enable
-  special configuration for this chip. This is common on various CHRP
-  motherboards, but could be used elsewhere. If in doubt, say Y.
+Amiga Buddha/Catweasel IDE interface support (EXPERIMENTAL)
+CONFIG_BLK_DEV_BUDDHA
+  This is the IDE driver for the IDE interfaces on the Buddha and
+  Catweasel expansion boards.  It supports up to two interfaces on the
+  Buddha and three on the Catweasel.
 
-Tekram TRM290 chipset support (EXPERIMENTAL)
-CONFIG_BLK_DEV_TRM290
-  This driver adds support for bus master DMA transfers
-  using the Tekram TRM290 PCI IDE chip. Volunteers are
-  needed for further tweaking and development.
-  Please read the comments at the top of drivers/block/trm290.c.
+  Say Y if you have a Buddha or Catweasel expansion board and want to
+  use IDE devices (hard disks, CD-ROM drives, etc.) that are connected
+  to one of its IDE interfaces.
 
-VIA82C586 chipset support (EXPERIMENTAL)
-CONFIG_BLK_DEV_VIA82C586
-  This allows you to to configure your chipset for a better use while
-  running (U)DMA: it will allow you to enable efficiently the second
-  channel dma usage, as it is may not be set by BIOS. It allows you to
-  run a kernel command line at boot time in order to set fifo config.
-  If no command line is provided, it will try to set fifo configuration
-  at its best. It will allow you to get a proc/ide/via display
-  (while running a "cat") provided you enabled "proc" support and
-  set DISPLAY_APOLLO_TIMINGS in via82c586.c
+Amiga IDE Doubler support (EXPERIMENTAL)
+CONFIG_BLK_DEV_IDEDOUBLER
+  This driver provides support for the so called `IDE doublers' (made
+  by various manufacturers, e.g. Eyetech) that can be connected to the
+  builtin IDE interface of some Amiga models. Using such an IDE
+  doubler, you can connect up to four instead of two IDE devices on
+  the Amiga's builtin IDE interface.
 
-  This requires CONFIG_IDEDMA_PCI_AUTO to be enabled.
+  Note that the normal Amiga Gayle IDE driver may not work correctly
+  if you have an IDE doubler and don't enable this driver!
 
-  If unsure, say N.
+  Say Y if you have an IDE doubler.  The driver is enabled at kernel
+  runtime using the "ide=doubler" kernel boot parameter.
 
 Support for PowerMac IDE devices (must also enable IDE)
 CONFIG_BLK_DEV_IDE_PMAC
@@ -781,6 +914,17 @@ Use DMA by default
 CONFIG_IDEDMA_PMAC_AUTO
   No help for CONFIG_IDEDMA_PMAC_AUTO
 
+Macintosh Quadra/Powerbook IDE interface support
+CONFIG_BLK_DEV_MAC_IDE
+  This is the IDE driver for the builtin IDE interface on some m68k
+  Macintosh models. It supports both the `Quadra style' (used in
+  Quadra/ Centris 630 and Performa 588 models) and `Powerbook style'
+  (used in the Powerbook 150 and 190 models) IDE interface.
+
+  Say Y if you have such an Macintosh model and want to use IDE
+  devices (hard disks, CD-ROM drives, etc.) that are connected to the
+  builtin IDE interface.
+
 ICS IDE interface support
 CONFIG_BLK_DEV_IDE_ICSIDE
   No help for CONFIG_BLK_DEV_IDE_ICSIDE
@@ -797,133 +941,6 @@ RapIDE interface support
 CONFIG_BLK_DEV_IDE_RAPIDE
   No help for CONFIG_BLK_DEV_IDE_RAPIDE
 
-Other IDE chipset support
-CONFIG_IDE_CHIPSETS
-  Say Y here if you want to include enhanced support for various IDE
-  interface chipsets used on motherboards and add-on cards. You can
-  then pick your particular IDE chip from among the following options.
-  This enhanced support may be necessary for Linux to be able to
-  access the 3rd/4th drives in some systems. It may also enable
-  setting of higher speed I/O rates to improve system performance with
-  these chipsets. Most of these also require special kernel boot
-  parameters to actually turn on the support at runtime; you can find
-  a list of these in the file Documentation/ide.txt.
-  
-  People with SCSI-only systems can say N here. 
-
-Generic 4 drives/port support
-CONFIG_BLK_DEV_4DRIVES
-  Certain older chipsets, including the Tekram 690CD, use a single set
-  of I/O ports at 0x1f0 to control up to four drives, instead of the
-  customary two drives per port. Support for this can be enabled at
-  runtime using the "ide0=four" kernel boot parameter if you say Y
-  here.
-
-ALI M14xx support
-CONFIG_BLK_DEV_ALI14XX
-  This driver is enabled at runtime using the "ide0=ali14xx" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
-  I/O speeds to be set as well. See the files Documentation/ide.txt
-  and drivers/block/ali14xx.c for more info.
-
-DTC-2278 support
-CONFIG_BLK_DEV_DTC2278
-  This driver is enabled at runtime using the "ide0=dtc2278" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the DTC-2278 card, and permits faster I/O speeds to be set as
-  well. See the Documentation/ide.txt and drivers/block/dtc2278.c
-  files for more info.
-
-Holtek HT6560B support
-CONFIG_BLK_DEV_HT6560B
-  This driver is enabled at runtime using the "ide0=ht6560b" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the Holtek card, and permits faster I/O speeds to be set as well.
-  See the Documentation/ide.txt and drivers/block/ht6560b.c files for
-  more info.
-
-PROMISE DC4030 support (EXPERIMENTAL)
-CONFIG_BLK_DEV_PDC4030
-  This driver provides support for the secondary IDE interface and
-  cache of Promise IDE chipsets, e.g. DC4030 and DC5030. This driver
-  is known to incur timeouts/retries during heavy I/O to drives
-  attached to the secondary interface. CDROM and TAPE devices are not
-  supported yet. This driver is enabled at runtime using the
-  "ide0=dc4030" kernel boot parameter. See the Documentation/ide.txt
-  and drivers/block/pdc4030.c files for more info.
-
-QDI QD6580 support
-CONFIG_BLK_DEV_QD6580
-  This driver is enabled at runtime using the "ide0=qd6580" kernel
-  boot parameter. It permits faster I/O speeds to be set. See the
-  files Documentation/ide.txt and drivers/block/qd6580.c for more
-  info.
-
-UMC 8672 support
-CONFIG_BLK_DEV_UMC8672
-  This driver is enabled at runtime using the "ide0=umc8672" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the UMC-8672, and permits faster I/O speeds to be set as well.
-  See the files Documentation/ide.txt and drivers/block/umc8672.c for
-  more info.
-
-Amiga builtin Gayle IDE interface support
-CONFIG_BLK_DEV_GAYLE
-  This is the IDE driver for the builtin IDE interface on some Amiga
-  models.  It supports both the `A1200 style' (used in A600 and A1200)
-  and `A4000 style' (used in A4000 and A4000T) of the Gayle IDE interface.
-  Say Y if you have such an Amiga model and want to use IDE devices
-  (hard disks, CD-ROM drives, etc.) that are connected to the builtin
-  IDE interface.
-
-Amiga IDE Doubler support (EXPERIMENTAL)
-CONFIG_BLK_DEV_IDEDOUBLER
-  This driver provides support for the so called `IDE doublers' (made by
-  various manufacturers, e.g. Eyetech) that can be connected to the
-  builtin IDE interface of some Amiga models. Using such an IDE doubler,
-  you can connect up to four instead of two IDE devices on the Amiga's
-  builtin IDE interface.
-  Note that the normal Amiga Gayle IDE driver may not work correctly if
-  you have an IDE doubler and don't enable this driver!
-  Say Y if you have an IDE doubler.  The driver is enabled at kernel
-  runtime using the "ide=doubler" kernel boot parameter.
-
-Amiga Buddha/Catweasel IDE interface support (EXPERIMENTAL)
-CONFIG_BLK_DEV_BUDDHA
-  This is the IDE driver for the IDE interfaces on the Buddha and
-  Catweasel expansion boards.  It supports up to two interfaces on the
-  Buddha and three on the Catweasel.
-  Say Y if you have a Buddha or Catweasel expansion board and want to
-  use IDE devices (hard disks, CD-ROM drives, etc.) that are connected
-  to one of its IDE interfaces.
-
-Falcon IDE interface support
-CONFIG_BLK_DEV_FALCON_IDE
-  This is the IDE driver for the builtin IDE interface on the Atari Falcon.
-  Say Y if you have a Falcon and want to use IDE devices (hard disks,
-  CD-ROM drives, etc.) that are connected to the builtin IDE interface.
-
-Macintosh Quadra/Powerbook IDE interface support
-CONFIG_BLK_DEV_MAC_IDE
-  This is the IDE driver for the builtin IDE interface on the some m68k
-  Macintosh models. It supports both the `Quadra style' (used in Quadra/
-  Centris 630 and Performa 588 models) and `Powerbook style' (used in the
-  Powerbook 150 and 190 models) IDE interface.
-  Say Y if you have such an Macintosh model and want to use IDE devices
-  (hard disks, CD-ROM drives, etc.) that are connected to the builtin
-  IDE interface.
-
-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.
-
 XT hard disk support
 CONFIG_BLK_DEV_XD
   Very old 8 bit hard disk controllers used in the IBM XT computer
@@ -939,8 +956,9 @@ CONFIG_BLK_DEV_XD
 Mylex DAC960/DAC1100 PCI RAID Controller support
 CONFIG_BLK_DEV_DAC960
   This driver adds support for the Mylex DAC960, AcceleRAID, and
-  eXtremeRAID PCI RAID controllers.  See README.DAC960 for further
-  information about this driver.
+  eXtremeRAID PCI RAID controllers. See the file
+  Documentation/README.DAC960 for further information about this
+  driver.
 
   If you want to compile the driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -1198,8 +1216,8 @@ CONFIG_BLK_DEV_MD
   have such a controller, you do not need to say Y here.
 
   More information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini. There you will also
+  Software-RAID mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If unsure, say N.
@@ -1226,8 +1244,8 @@ CONFIG_MD_STRIPED
   the throughput rate if the partitions reside on distinct disks. 
 
   Information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini. There you will also
+  Software-RAID mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If you want to compile this as a module ( = code which can be
@@ -1248,8 +1266,8 @@ CONFIG_MD_MIRRORING
   drives. 
 
   Information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini. There you will also
+  Software-RAID mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If you want to use such a RAID-1 set, say Y. This code is also
@@ -1271,8 +1289,8 @@ CONFIG_MD_RAID5
   of the available parity distribution methods.
 
   Information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini. There you will also
+  Software-RAID mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . There you will also
   learn where to get the supporting user space utilities raidtools.
 
   If you want to use such a RAID-4/RAID-5 set, say Y. This code is
@@ -1294,32 +1312,29 @@ CONFIG_DESKSTATION_RPC44
   This is a machine with a R4400 100 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux
   on the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://lena.fnet.fr/ (To browse the WWW, you need to
-  have access to a machine on the Internet that has a program like
-  lynx or netscape).
+  http://lena.fnet.fr/ .
 
 Support for Acer PICA 1 chipset
 CONFIG_ACER_PICA_61
   This is a machine with a R4400 133/150 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://lena.fnet.fr/ (To browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or netscape).
+  http://lena.fnet.fr/ .
 
 Support for Algorithmics P4032
 CONFIG_ALGOR_P4032
   This is an evaluation board of the British company Algorithmics. The
   board uses the R4300 and a R5230 CPUs. For more information about
-  this board see http://www.algor.co.uk.
+  this board see http://www.algor.co.uk .
 
 IDE card support
 CONFIG_BLK_DEV_IDE_CARDS
-  On Acorn systems, enable this if you wish to use an IDE interface
+  On Acorn systems, say Y here if you wish to use an IDE interface
   expansion card. If you do not or are unsure, say N to this.
 
 ICS IDE interface
 CONFIG_BLK_DEV_IDE_ICS
-  On Acorn systems, enable this if you wish to use the ICS IDE
+  On Acorn systems, say Y here if you wish to use the ICS IDE
   interface card.  This is not required for ICS partition support.
   If you are unsure, say N to this.
 
@@ -1328,23 +1343,21 @@ CONFIG_BLK_DEV_PART
   This allows Linux on Acorn systems to determine its partitions in
   the 'non-ADFS' partition area of the hard disk - usually located
   after the ADFS partition.  You are probably using this system, so
-  you should enable it.
+  you should say Y here.
 
 Support for Mips Magnum 4000
 CONFIG_MIPS_MAGNUM_4000
   This is a machine with a R4000 100 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://lena.fnet.fr/ (To browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or netscape).
+  http://lena.fnet.fr/ .
 
 Support for Olivetti M700
 CONFIG_OLIVETTI_M700
   This is a machine with a R4000 100 MHz CPU. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  http://lena.fnet.fr/ (To browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or netscape).
+  http://lena.fnet.fr/ .
 
 CPU type
 CONFIG_CPU_R3000
@@ -1382,8 +1395,8 @@ CONFIG_NET
   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.
+  recommended to read the NET-3-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
 Socket filtering
 CONFIG_FILTER
@@ -1397,22 +1410,55 @@ CONFIG_FILTER
 
 Network packet filtering
 CONFIG_NETFILTER
-  Netfilter is a framework for filtering and mangling packets.
+  Netfilter is a framework for filtering and mangling network packets
+  that pass through your Linux box.
+
+  The most common use of packet filtering is to run your Linux box as
+  a firewall protecting a local network from the Internet. The type of
+  firewall provided by this kernel support is called a "packet
+  filter", which means that it can reject individual network packets
+  based on type, source, destination etc. The other kind of firewall,
+  a "proxy-based" one, is more secure but more intrusive and more
+  bothersome to set up; it inspects the network traffic much more
+  closely, modifies it and has knowledge about the higher level
+  protocols, which a packet filter lacks. Moreover, proxy-based
+  firewalls often require changes to the programs running on the local
+  clients. Proxy-based firewalls don't need support by the kernel, but
+  they are often combined with a packet filter, which only works if
+  you say Y here.
+
+  You should also say Y here if you intend to use your Linux box as
+  the gateway to the Internet for a local network of machines without
+  globally valid IP addresses. This is called "masquerading": if one
+  of the computers on your local network wants to send something to
+  the outside, your box can "masquerade" as that computer, i.e. it
+  forwards the traffic to the intended outside destination, but
+  modifies the packets to make it look like they came from the
+  firewall box itself. It works both ways: if the outside host
+  replies, the Linux box will silently forward the traffic to the
+  correct 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 receive replies. It is even possible to
+  run globally visible servers from within a masqueraded local network
+  using a mechanism called portforwarding. Masquerading is also often
+  called NAT (Network Address Translation).
+
+  Another use of Netfilter is in transparent proxying: if a machine on
+  the local network tries to connect to an outside host, your Linux
+  box can transparently forward the traffic to a local server,
+  typically a caching proxy server.
+
   Various modules exist for netfilter which replace the previous
   masquerading (ipmasqadm), packet filtering (ipchains), transparent
-  proxying, and portforwarding mechanisms.  Enabling this option
-  makes minor alterations to allow these modules to hook into the
-  packet stream.  More information is available from 
-  http://netfilter.kernelnotes.org (to browse the WWW, you need
-  to have access to a machine on the Internet that has a program like
-  lynx or netscape).
-
+  proxying, and portforwarding mechanisms. More information is
+  available from http://netfilter.kernelnotes.org .
   Make sure to say N to "Fast switching" below if you intend to say Y
   here, as Fast switching currently bypasses netfilter.
-
-  Chances are that you should say Y here for every machine which is
-  run as a router and N for every regular host. If unsure, say N.
-
+  Chances are that you should say Y here if you compile a kernel which
+  will run as a router and N for regular hosts. If unsure, say N.
 Network packet filtering debugging
 CONFIG_NETFILTER_DEBUG
   Say Y to make sure packets aren't leaking.
@@ -1432,7 +1478,7 @@ CONFIG_SYN_COOKIES
   is no need for the legitimate users to change their TCP/IP software;
   SYN cookies work transparently to them. For technical information
   about SYN cookies, check out
-  ftp://koobera.math.uic.edu/pub/docs/syncookies-archive.
+  ftp://koobera.math.uic.edu/pub/docs/syncookies-archive .
 
   If you are SYN flooded, the source address reported by the kernel is
   likely to have been forged by the attacker; it is only reported as
@@ -1466,9 +1512,7 @@ CONFIG_ALPHA_GENERIC
 
   To find out what type of Alpha system you have, you may want to
   check out the Linux/Alpha FAQ, accessible on the WWW from
-  http://www.alphalinux.org (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:
+  http://www.alphalinux.org . In summary:
 
   Alcor/Alpha-XLT     AS 600
   Alpha-XL            XL-233, XL-266
@@ -1511,9 +1555,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.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).
+  http://www.alphalinux.org .
 
   The usual way to load Linux on an Alpha machine is to use MILO
   (a bootloader that lets you pass command line parameters to the
@@ -1565,8 +1607,7 @@ CONFIG_SERIAL_MANY_PORTS
   Say Y here if you have dumb serial boards other than the four
   standard COM 1/2/3/4 ports. This may happen if you have an AST
   FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available
-  via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini), or other custom
+  from http://metalab.unc.edu/mdw/linux.html#howto ), or other custom
   serial port hardware which acts similar to standard serial port
   hardware. If you only use the standard COM 1/2/3/4 ports, you can
   say N here to save some memory. You can also say Y if you have an
@@ -1619,8 +1660,8 @@ CONFIG_PCI
   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
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, contains valuable
+  The PCI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , contains valuable
   information about which PCI hardware does work under Linux and which
   doesn't.
 
@@ -1660,58 +1701,139 @@ CONFIG_FB_SGIVW
 
 I2O support
 CONFIG_I2O
-  The Intelligent Input/Output (I2O) architecture allows
-  hardware drivers to be split into two parts: an operating system
-  specific module called the OSM and an hardware specific module
-  called the HDM. The OSM can talk to a whole range of HDM's, and
-  ideally the HDM's are not OS dependent. This allows for the same
-  driver to be used under different operating systems if the relevant
-  OSM is in place. If you say Y here, you will get a choice of OSM's
-  with the following questions.
+  The Intelligent Input/Output (I2O) architecture allows hardware
+  drivers to be split into two parts: an operating system specific
+  module called the OSM and an hardware specific module called the
+  HDM. The OSM can talk to a whole range of HDM's, and ideally the
+  HDM's are not OS dependent. This allows for the same HDM driver to
+  be used under different operating systems if the relevant OSM is in
+  place. In order for this to work, you need to have an I2O interface
+  adapter card in your computer. This card contains a special I/O
+  processor (IOP), thus allowing high speeds since the CPU does not
+  have to deal with I/O.
+
+  If you say Y here, you will get a choice of interface adapter
+  drivers and OSM's with the following questions.
 
   This support is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.
+  Documentation/modules.txt. You will get modules called i2o_core.o
+  and i20_config.o. 
 
   If unsure, say N.
 
 I2O PCI support
 CONFIG_I2O_PCI
-  Build in support for PCI bus I2O interface adapters. Currently this
-  is the only variety supported.
+  Say Y for support of PCI bus I2O interface adapters. Currently this
+  is the only variety supported, so you should say Y.
+
+  This support is also available as a module called i2o_pci.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
 
 I2O Block OSM
 CONFIG_I2O_BLOCK
-  Include support for the I2O Block OSM. The Block OSM presents disk and
-  other structured block devices to the operating system.
+  Include support for the I2O Block OSM. The Block OSM presents disk
+  and other structured block devices to the operating system.
+
+  This support is also available as a module called i2o_block.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
 
 I2O LAN OSM
 CONFIG_I2O_LAN
-  Include support for the LAN OSM. You will also need to include support
-  for token ring or fddi if you wish to use token ring or FDDI I2O cards
-  with this driver.
+  Include support for the LAN OSM. You will also need to include
+  support for token ring or FDDI if you wish to use token ring or FDDI
+  I2O cards with this driver.
+
+  This support is also available as a module called i2o_lan.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
 
 I2O SCSI OSM
 CONFIG_I2O_SCSI
-  Allow direct scsi access to scsi devices on a SCSI or FibreChannel I2O 
-  controller. You can use both the SCSI and Block OSM together if you wish.
+  Allows direct SCSI access to SCSI devices on a SCSI or FibreChannel
+  I2O controller. You can use both the SCSI and Block OSM together if
+  you wish.
+
+  This support is also available as a module called i2o_scsi.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
+
+I2O /proc support
+CONFIG_I2O_PROC
+  If you say Y here and to "/proc filesystem support", you will be
+  able to read I2O related information from the virtual directory
+  /proc/i2o.
+
+  This support is also available as a module called i2o_proc.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
+
+Plug and Play support
+CONFIG_PNP
+  Plug and Play (PnP) is a standard for peripherals which allows those
+  peripherals to be configured by software, e.g. assign IRQ's or other
+  parameters. No jumpers on the cards are needed, instead the values
+  are provided to the cards from the BIOS, from the operating system,
+  or using a user-space utility.
+
+  Say Y here if you would like Linux to configure your Plug and Play
+  devices. You should then also say Y to "ISA Plug and Play support",
+  below. Alternatively, you can configure your PnP devices using the
+  user space utilities contained in the isapnptools package.
+  
+  This support is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.
+
+ISA Plug and Play support
+CONFIG_ISAPNP
+  Say Y here if you would like support for ISA Plug and Play devices.
+  
+  This support is also available as a module called isapnp.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
+
+  If unsure, say Y.
+
+PCMCIA/Cardbus support
+CONFIG_PCMCIA
+  Say Y here if you want to attach PCMCIA's (PC-cards) to your Linux
+  computer. These are credit-card size devices such as network cards,
+  modems or hard drives popular with laptops.
+
+  You will also need David Hinds' pcmcia-cs package (see the file
+  Documentation/Changes for location).
+
+CardBus support
+CONFIG_CARDBUS
+  CardBus is a bus mastering architecture for PC-cards (it allows
+  PC-cards to talk to the rest of the stuff inside your computer). If
+  unsure, say Y.
 
 System V IPC
 CONFIG_SYSVIPC
   Inter Process Communication is a suite of library functions and
-  system calls which let processes (running programs) synchronize
-  and exchange information. It is generally considered to be a good
-  thing, and some programs won't run unless you say Y here. In
-  particular, if you want to run the DOS emulator dosemu under Linux
-  (read the DOSEMU-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO), you'll need to say Y
+  system calls which let processes (running programs) synchronize and
+  exchange information. It is generally considered to be a good thing,
+  and some programs won't run unless you say Y here. In particular, if
+  you want to run the DOS emulator dosemu under Linux (read the
+  DOSEMU-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto ), you'll need to say Y
   here.
   
   You can find documentation about IPC with "info ipc" and also in
-  section 6.4 of the Linux Programmer's Guide, available via FTP
-  (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/LDP/programmers-guide.
+  section 6.4 of the Linux Programmer's Guide, available from
+  http://metalab.unc.edu/mdw/linux.html#guide .
 
   Saying Y here enlarges your kernel by about 7 KB. Just say Y.
 
@@ -1732,11 +1854,11 @@ CONFIG_SYSCTL
   The sysctl interface provides a means of dynamically changing
   certain kernel parameters and variables on the fly without requiring
   a recompile of the kernel or reboot of the system. The primary
-  interface consists of a system call, but if the /proc filesystem is
-  enabled, a tree of modifiable sysctl entries will be generated
-  beneath the /proc/sys directory. They are explained in the files in
-  Documentation/sysctl/. Note that enabling this option will enlarge
-  the kernel by at least 8 KB. 
+  interface consists of a system call, but if you say Y to "/proc
+  filesystem support", a tree of modifiable sysctl entries will be
+  generated beneath the /proc/sys directory. They are explained in the
+  files in Documentation/sysctl/. Note that enabling this option will
+  enlarge the kernel by at least 8 KB.
 
   As it is generally a good thing, you should say Y here unless
   building a kernel for install/rescue disks or your system is very
@@ -1755,8 +1877,8 @@ CONFIG_BINFMT_ELF
   executables are distributed solely in ELF format. You definitely
   want to say Y here.
 
-  Information about ELF is contained in the ELF HOWTO available via
-  FTP (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  Information about ELF is contained in the ELF HOWTO available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you find that after upgrading from Linux kernel 1.2 and saying Y
   here, you still can't run any ELF binaries (they just crash), then
@@ -1796,6 +1918,10 @@ CONFIG_BINFMT_EM86
   Say Y here if you want to be able to execute Linux/Intel ELF
   binaries just like native Alpha binaries on your Alpha machine. For
   this to work, you need to have the emulator /usr/bin/em86 in place.
+
+  You can get the same functionality by saying N here and saying Y to
+  "Kernel support for MISC binaries". 
+
   You may answer M to compile the emulation support as a module and
   later load the module when you want to use a Linux/Intel binary. The
   module will be called binfmt_em86.o. If unsure, say Y.
@@ -1806,17 +1932,13 @@ CONFIG_BINFMT_MISC
   formats into the kernel. You will like this especially when you use
   programs that need an interpreter to run like Java, Python or
   Emacs-Lisp. It's also useful if you often run DOS executables under
-  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO). Once you have
+  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto ). Once you have
   registered such a binary class with the kernel, you can start one of
   those programs simply by typing in its name at a shell prompt; Linux
   will automatically feed it to the correct interpreter.
 
-  If you say Y here, you won't need "Kernel support for JAVA binaries"
-  (CONFIG_BINFMT_JAVA) or "Kernel support for Linux/Intel ELF
-  binaries" (CONFIG_BINFMT_EM86), as this is a more general solution.
-
-  You can do other nice things, too. Read
+  You can do other nice things, too. Read the file
   Documentation/binfmt_misc.txt to learn how to use this feature, and
   Documentation/java.txt for information about how to include Java
   support.
@@ -1872,8 +1994,8 @@ CONFIG_VGA_CONSOLE
   everyone wants that. 
 
   The program SVGATextMode can be used to utilize SVGA video cards to
-  their full potential in text mode. Download it via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/utils/console.
+  their full potential in text mode. Download it from
+  ftp://metalab.unc.edu/pub/Linux/utils/console .
 
   Say Y.
 
@@ -1884,13 +2006,14 @@ CONFIG_VIDEO_SELECT
   card's BIOS offers, but the traditional Linux utilities like
   SVGATextMode don't, you can say Y here and set the mode using the
   "vga=" option from your boot loader (lilo or loadlin) or set
-  "vga=ask" which brings up a video mode menu on kernel startup. Try
+  "vga=ask" which brings up a video mode menu on kernel startup. (Try
   "man bootparam" or see the documentation of your boot loader about
   how to pass options to the kernel. The lilo procedure is also
-  explained in the SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Read
-  Documentation/svga.txt for more information about the Video mode
-  selection support. If unsure, say N.
+  explained in the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
+
+  Read the file Documentation/svga.txt for more information about the
+  Video mode selection support. If unsure, say N.
 
 Support for frame buffer devices (EXPERIMENTAL)
 CONFIG_FB
@@ -1984,15 +2107,23 @@ CONFIG_FB_RETINAZ3
   you have a Retina Z3 or plan to get one before you next recompile
   the kernel.
 
-Cirrus Logic generic driver (EXPERIMENTAL)
+Cirrus Logic support (EXPERIMENTAL)
 CONFIG_FB_CLGEN
   This enables support for Cirrus Logic GD542x/543x based boards on
   Amiga: SD64, Piccolo, Picasso II/II+, Picasso IV, or EGS Spectrum.
-  If you have a PCI-based system, this enables support for these chips:
-  GD-543x, GD-544x, GD-5480.
+
+  If you have a PCI-based system, this enables support for these
+  chips: GD-543x, GD-544x, GD-5480.
+
+  Please read the file Documentation/fb/clgenfb.txt.
+
   Say N unless you have such a graphics board or plan to get one
   before you next recompile the kernel.
 
+Permedia2 support (experimental)
+CONFIG_FB_PM2
+  Say Y here if this is your graphics board.
+
 Apollo support
 CONFIG_APOLLO
   Say Y here if you want to run Linux on an MC680x0-based Apollo
@@ -2022,7 +2153,13 @@ CONFIG_FB_S3TRIO
 ATI Mach64 display support
 CONFIG_FB_ATY
   This driver supports graphics boards with the ATI Mach64 chips.
+  Say Y if you have such a graphics board.
 
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called atyfb.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+  
 PowerMac "control" frame buffer device support
 CONFIG_FB_CONTROL
   This driver supports a frame buffer for the graphics adapter in the
@@ -2070,6 +2207,11 @@ CONFIG_FB_VGA16
   This is the frame buffer device driver for VGA 16 color graphic
   cards. Say Y if you have such a card.
 
+  This code is also available as a module. If you want to compile it
+  as a module ( = code which can be inserted in and removed from the
+  running kernel whenever you want), say M here and read
+  Documentation/modules.txt. The module will be called vga16fb.o.
+
 Backward compatibility mode for Xpmac
 CONFIG_FB_COMPAT_XPMAC
   If you use the Xpmac X server (common with mklinux), you'll need to
@@ -2112,7 +2254,7 @@ CONFIG_FB_MATROX_MYSTIQUE
   packed pixel and 32 bpp packed pixel. You can also use font widths
   different from 8.
 
-Matrox G100/G200 support
+Matrox G100/G200/G400 support
 CONFIG_FB_MATROX_G100
   Say Y here if you have a Matrox Productiva G100, Matrox Mystique
   G200, Matrox Marvel G200 or Matrox Millennium G200 video card. If
@@ -2285,10 +2427,17 @@ CONFIG_FBCON_MAC
   bits per pixel packed pixels on Mac. It supports variable font
   widths for low resolution screens.
   
+#VGA 16-color planar support
+#CONFIG_FBCON_VGA_PLANES
+###
+###What is this?
+###
+
 VGA characters/attributes support
 CONFIG_FBCON_VGA
   This is the low level frame buffer console driver for VGA text mode;
-  it is used by frame buffer device drivers that support VGA text mode.
+  it is used by frame buffer device drivers that support VGA text
+  mode.
 
 Parallel-port support
 CONFIG_PARPORT
@@ -2301,8 +2450,7 @@ CONFIG_PARPORT
 
   For extensive information about drivers for many devices attaching
   to the parallel port see http://www.torque.net/linux-pp.html on the
-  WWW (to browse the WWW, you need to have access to a machine on the
-  Internet that has a program like lynx or netscape).
+  WWW.
 
   It is possible to share a single parallel port among several devices
   and it is safe to compile all the corresponding drivers into the
@@ -2340,6 +2488,11 @@ CONFIG_PARPORT_PC_FIFO
   FIFO. See Documentation/parport.txt to find out how to specify
   which IRQ/DMA to use.
 
+Support for PCMCIA management for PC-style ports
+CONFIG_PARPORT_PC_PCMCIA
+  Say Y here if you need PCMCIA support for your PC-style parallel
+  ports. If unsure, say N.
+
 Support foreign hardware
 CONFIG_PARPORT_OTHER
   Say Y here if you want to be able to load driver modules to support
@@ -2359,7 +2512,7 @@ CONFIG_PARPORT_1284
   such as EPP and ECP, say Y here to enable advanced IEEE 1284
   transfer modes. Also say Y if you want device ID information to
   appear in /proc/sys/dev/parport/*/autoprobe*. It is safe to say N.
-
 Enable loadable module support
 CONFIG_MODULES
   Kernel modules are small pieces of compiled code which can be
@@ -2416,10 +2569,10 @@ CONFIG_ARPD
   daemon arpd. Arpd then answers the address resolution request either
   from its own cache or by asking the net.
 
-  This code is experimental. If you do say Y here, you should obtain a
-  copy of arpd from http://www.loran.com/~layes/arpd/index.html, and
-  you should also say Y to "Kernel/User network link driver", below.
-  If unsure, say N.
+  This code is experimental and also obsolete. If you want to use it,
+  you need to find a version of the daemon arpd on the net somewhere,
+  and you should also say Y to "Kernel/User network link driver",
+  below. If unsure, say N.
 
 TCP/IP networking
 CONFIG_INET
@@ -2431,14 +2584,14 @@ CONFIG_INET
   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.
+  NET-3-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This option is also necessary if you want to use the full power of
   term (term is a program which gives you almost full Internet
   connectivity if you have a regular dial up shell account on some
   Internet connected Unix computer; for more information, read
-  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html).
+  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html ).
   
   If you say Y here and also to "/proc filesystem support" and "Sysctl
   support" below, you can change various aspects of the behavior of
@@ -2455,9 +2608,7 @@ CONFIG_IP_MULTICAST
   intend to participate in the MBONE, a high bandwidth network on top
   of the Internet which carries audio and video broadcasts. More
   information about the MBONE is on the WWW at
-  http://www.best.com/~prince/techinfo/mbone.html (to browse the WWW,
-  you need to have access to a machine on the Internet that has a
-  program like lynx or netscape). Information about the multicast
+  http://www-itg.lbl.gov/mbone/ . Information about the multicast
   capabilities of the various network cards is contained in
   Documentation/networking/multicast.txt. For most people, it's safe
   to say N.
@@ -2512,7 +2663,7 @@ CONFIG_IP_MULTIPLE_TABLES
 
   If you are interested in this, please see the preliminary
   documentation at http://www.compendium.com.ar/policy-routing.txt and
-  ftp://post.tepkom.ru/pub/vol2/Linux/docs/advanced-routing.tex. You
+  ftp://post.tepkom.ru/pub/vol2/Linux/docs/advanced-routing.tex . You
   will need supporting software from ftp://ftp.inr.ac.ru/ip-routing/
   
   If unsure, say N.
@@ -2628,7 +2779,7 @@ CONFIG_NET_IPIP
   appear on a different network than it physically is, or to use
   mobile-IP facilities (allowing laptops to seamlessly move between
   networks without changing their IP addresses; check out
-  http://anchor.cs.binghamton.edu/~mobileip/LJ/index.html). 
+  http://anchor.cs.binghamton.edu/~mobileip/LJ/index.html ). 
 
   Saying Y to this option will produce two modules ( = code which can
   be inserted in and removed from the running kernel whenever you
@@ -2657,15 +2808,12 @@ IP: aliasing support
 CONFIG_IP_ALIAS
   Sometimes it is useful to give several IP addresses to a single
   physical network interface (serial port or Ethernet card). The most
-  common case is that you want to serve different WWW or ftp documents
+  common case is that you want to serve different WWW or FTP documents
   to the outside depending on which of your host names was used to
   connect to you. This is called "multihosting" or "virtual domains"
-  or "virtual hosting services" and is explained in detail on the WWW
-  at http://www.thesphere.com/~dlp/TwoServers/ (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 in the Virtual-Services-HOWTO,
-  available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  or "virtual hosting services" and is explained in the
+  Virtual-Services-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Another scenario would be that there are two logical networks living
   on your local Ethernet and you want to access them both with the
@@ -2693,9 +2841,7 @@ CONFIG_IP_PIMSM_V1
   Multicast) version 1. This multicast routing protocol is used widely
   because Cisco supports it. You need special software to use it
   (pimd-v1). Please see http://netweb.usc.edu/pim/ for more
-  information about PIM (to browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or
-  netscape). 
+  information about PIM.
 
   Say Y if you want to use PIM-SM v1. Note that you can say N here if
   you just want to use Dense Mode PIM.
@@ -2717,38 +2863,6 @@ CONFIG_INET_PCTCP
   People having problems with NCSA telnet should see the file
   linux/Documentation/networking/ncsa-telnet.
 
-Reverse ARP server
-CONFIG_INET_RARP
-  If there are (usually diskless or portable) machines on your local
-  network that know their hardware Ethernet addresses but don't know
-  their IP addresses upon startup, they can send out a Reverse Address
-  Resolution Protocol (RARP) request to find out their own IP
-  addresses. Diskless Sun 3 machines use this procedure at boot time,
-  and diskless Linux boxes can be configured to do it as well.
-  
-  If you want your Linux box to be able to *answer* such requests,
-  answer Y here; you'll then have to run the program rarp ("man rarp")
-  on your box.
-
-  If you actually want to use a diskless Sun 3 machine as an X
-  terminal to Linux, say Y here and fetch Linux-Xkernel from
-  ftp://metalab.unc.edu/pub/Linux/system/network/boot.net/.
-
-  Superior solutions to the problem of booting and configuring
-  machines over a net connection are given by the protocol BOOTP and
-  its successor DHCP. See the DHCP FAQ
-  http://web.syr.edu/~jmwobus/comfaqs/dhcp.faq.html 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).
-
-  If you want to compile RARP support as a module ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want), say M here and read Documentation/modules.txt. The module
-  will be called rarp.o. 
-
-  If you don't understand a word of the above, say N and rest in
-  peace.
-
 Assume subnets are local
 CONFIG_INET_SNARL
   Say Y if you are on a subnetted network with all machines connected
@@ -2822,15 +2936,14 @@ CONFIG_UNIX
 The IPv6 protocol
 CONFIG_IPV6
   This is experimental support for the next version of the Internet
-  Protocol: IP version 6 (also called IPng "IP next generation"). 
+  Protocol: IP version 6 (also called IPng "IP next generation").
   Features of this new protocol include: expanded address space,
   authentication and privacy, and seamless interoperability with the
   current version of IP (IP version 4). For general information about
-  IPv6, see http://playground.sun.com/pub/ipng/html/ipng-main.html (to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape); for specific information
-  about IPv6 under Linux read http://www.bieringer.de/linux/IPv6/ and 
-  the file net/ipv6/README in the kernel source. 
+  IPv6, see http://playground.sun.com/pub/ipng/html/ipng-main.html ;
+  for specific information about IPv6 under Linux read the HOWTO at
+  http://www.bieringer.de/linux/IPv6/ and the file net/ipv6/README in
+  the kernel source.
 
   If you want to use IPv6, please upgrade to the newest net-tools as
   given in Documentation/Changes. You will still be able to do regular
@@ -2871,10 +2984,10 @@ CONFIG_IPX
   This is support for the Novell networking protocol, IPX, commonly
   used for local networks of Windows machines. You need it if you want
   to access Novell NetWare file or print servers using the Linux
-  Novell client ncpfs (available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/system/filesystems/) or from within
-  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO). In order to do the
+  Novell client ncpfs (available from
+  ftp://metalab.unc.edu/pub/Linux/system/filesystems/ ) or from within
+  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto ). In order to do the
   former, you'll also have to say Y to "NCP filesystem support",
   below.
 
@@ -2885,13 +2998,12 @@ CONFIG_IPX
   To turn your Linux box into a fully featured NetWare file server and
   IPX router, say Y here and fetch either lwared from
   ftp://metalab.unc.edu/pub/Linux/system/network/daemons/ or mars_nwe
-  from ftp://ftp.gwdg.de/pub/linux/misc/ncpfs. For more information,
-  read the IPX-HOWTO in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  from ftp://ftp.gwdg.de/pub/linux/misc/ncpfs . For more information,
+  read the IPX-HOWTO available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html (to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape). 
+  Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
 
   The IPX driver would enlarge your kernel by about 5 kB. This driver
   is also available as a module ( = code which can be inserted in and
@@ -2909,7 +3021,7 @@ CONFIG_IPX_INTERN
   same address). The way this is done is to create a virtual internal
   "network" inside your box and to assign an IPX address to this
   network. Say Y here if you want to do this; read the IPX-HOWTO at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO for details.
+  http://metalab.unc.edu/mdw/linux.html#howto for details.
 
   The full internal IPX network enables you to allocate sockets on
   different virtual nodes of the internal network. This is done by
@@ -2922,7 +3034,7 @@ CONFIG_IPX_INTERN
   'special' sockets to sockets listening on the primary network is
   disabled. This might break existing applications, especially RIP/SAP
   daemons. A RIP/SAP daemon that works well with the full internal net
-  can be found on ftp://ftp.gwdg.de/pub/linux/misc/ncpfs. 
+  can be found on ftp://ftp.gwdg.de/pub/linux/misc/ncpfs 
 
   If you don't know what you are doing, say N.
 
@@ -2939,7 +3051,7 @@ CONFIG_SPX
   space programs lwared or mars_nwe for the server side).
 
   Say Y here if you have use for SPX; read the IPX-HOWTO at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO for details.
+  http://metalab.unc.edu/mdw/linux.html#howto for details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -2960,9 +3072,13 @@ CONFIG_DECNET
   More detailed documentation is available in the
   Documentation/networking/decnet.txt file.
 
-  Be sure to turn on the CONFIG_PROCFS and CONFIG_SYSCTL options
-  when using DECnet, since you will need sysctl support to aid in
-  configuration at run time.
+  Be sure to say Y to "/proc filesystem support" and "Sysctl support"
+  below when using DECnet, since you will need sysctl support to aid
+  in configuration at run time.
+
+  The DECnet code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called decnet.o.
 
 DECnet SIOCFIGCONF support
 CONFIG_DECNET_SIOCGIFCONF
@@ -2970,19 +3086,23 @@ CONFIG_DECNET_SIOCGIFCONF
    you know what you are doing. It can break other applications which
    use this system call and the proper way to get the information
    provided by this call is to use rtnetlink.
+   
+   If unsure, say N.
 
 DECnet Router Support
 CONFIG_DECNET_ROUTER
    Add support for turning your DECnet Endnode into a level 1 or 2
-   router. This is an unfinished option for developers only. If you
-   do turn it on, then make sure you also have rtnetlink configured
-   in, since thats the only current method of configuration.
+   router. This is an unfinished option for developers only. If you do
+   turn it on, then make sure that you also say Y to "Kernel/User
+   network link driver" and "Routing messages", since rtnetlink is the
+   only current method of configuration.
 
 DECnet Raw Socket Support
 CONFIG_DECNET_RAW
    Add support for the SOCK_RAW type under DECnet. Used by userland
    routing programs to receive routing messages from the kernel and
-   also as a general debugging aid to see whats going on "under the hood".
+   also as a general debugging aid to see what's going on "under the
+   hood".
 
 AppleTalk DDP
 CONFIG_ATALK
@@ -2992,16 +3112,15 @@ CONFIG_ATALK
   netatalk package so that your Linux box can act as a print and file
   server for Macs as well as access AppleTalk printers. Check out
   http://threepio.hitchcock.org/cgi-bin/faq/netatalk/faq.pl on the WWW
-  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
-  serial links. EtherTalk and LocalTalk are fully supported by Linux.
+  for details. EtherTalk is the name used for AppleTalk over Ethernet
+  and the cheaper and slower LocalTalk is AppleTalk over a proprietary
+  Apple network using serial links. EtherTalk and LocalTalk are fully
+  supported by Linux.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html
-  The NET-3-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO contains valuable
+  Macs is on the WWW at http://www.eats.com/linux_mac_win.html The
+  NET-3-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , contains valuable
   information as well.
 
   This driver is also available as a module ( = code which can be
@@ -3088,10 +3207,8 @@ Amateur Radio support
 CONFIG_HAMRADIO
   If you want to connect your Linux box to an amateur radio, answer Y
   here. You want to read http://www.tapr.org/tapr/html/pkthome.html
-  (to browse the WWW, you need to have access to a machine on the
-  Internet that has a program like lynx or netscape) and the HAM-HOWTO
-  and the AX25-HOWTO, both available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  and the HAM-HOWTO and the AX25-HOWTO, both available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that the answer to this question won't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -3114,13 +3231,11 @@ CONFIG_AX25
 
   Information about where to get supporting software for Linux amateur
   radio as well as information about how to configure an AX.25 port is
-  contained in the AX25-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. You might also want to
+  contained in the AX25-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . You might also want to
   check out the file Documentation/networking/ax25.txt in the kernel
   source. More information about digital amateur radio in general is
-  on the WWW at http://www.tapr.org/tapr/html/pkthome.html. (To browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape).
+  on the WWW at http://www.tapr.org/tapr/html/pkthome.html .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3152,13 +3267,11 @@ CONFIG_NETROM
 
   A comprehensive listing of all the software for Linux amateur radio
   users as well as information about how to configure an AX.25 port is
-  contained in the AX25-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. You also might want to
+  contained in the AX25-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . You also might want to
   check out the file Documentation/networking/ax25.txt. More
   information about digital amateur radio in general is on the WWW at
-  http://www.tapr.org/tapr/html/pkthome.html (to browse the WWW, you
-  need to have access to a machine on the Internet that has a program
-  like lynx or netscape).
+  http://www.tapr.org/tapr/html/pkthome.html .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3173,13 +3286,11 @@ CONFIG_ROSE
 
   A comprehensive listing of all the software for Linux amateur radio
   users as well as information about how to configure an AX.25 port is
-  contained in the AX25-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. You also might want to
+  contained in the AX25-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . You also might want to
   check out the file Documentation/networking/ax25.txt. More
   information about digital amateur radio in general is on the WWW at
-  http://www.tapr.org/tapr/html/pkthome.html (to browse the WWW, you
-  need to have access to a machine on the Internet that has a program
-  like lynx or netscape).
+  http://www.tapr.org/tapr/html/pkthome.html .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3238,11 +3349,11 @@ CONFIG_DMASCC
   traffic.
 
   Currently, this driver supports Ottawa PI/PI2
-  (http://hydra.carleton.ca/info/pi2.html) and Gracilis PackeTwin
-  (http://www.paccomm.com/gracilis.html) boards. They are detected
+  (http://hydra.carleton.ca/info/pi2.html ) and Gracilis PackeTwin
+  (http://www.paccomm.com/gracilis.html ) boards. They are detected
   automatically. If you have one of these cards, say Y here and read
-  the AX25-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/.
+  the AX25-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver can operate multiple boards simultaneously. If you
   compile it as a module (by saying M instead of Y), it will be called
@@ -3258,18 +3369,15 @@ CONFIG_DMASCC
   certain parameters, such as channel access timing, clock mode, and
   DMA channel. This is accomplished with a small utility program,
   dmascc_cfg, available at
-  http://www.nt.tuwien.ac.at/~kkudielk/Linux/. (To browse the WWW, you
-  need to have access to a machine on the Internet that has a program
-  like lynx or netscape).
+  http://www.nt.tuwien.ac.at/~kkudielk/Linux/ .
 
 Z8530 SCC driver for AX.25
 CONFIG_SCC
   These cards are used to connect your Linux box to an amateur radio
   in order to communicate with other computers. If you want to use
-  this, read Documentation/networking/z8530drv.txt and the
-  AX25-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Also make sure to say Y
-  to "Amateur Radio AX.25 Level 2" support.
+  this, read Documentation/networking/z8530drv.txt and the AX25-HOWTO,
+  available from http://metalab.unc.edu/mdw/linux.html#howto . Also
+  make sure to say Y to "Amateur Radio AX.25 Level 2" support.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3288,12 +3396,16 @@ CONFIG_SCC_DELAY
 ### Don't know what's going on here.
 ###
 #
+
 YAM driver for AX.25
 CONFIG_YAM
-  Support for the YAM modem on serial port. 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 YAM is a modem for packet radio which connects to the serial
+  port and includes some of the functions of a Terminal Node
+  Controller. If you have one of those, say Y here.
+
+  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.
 
 BAYCOM picpar and par96 driver for AX.25
 CONFIG_BAYCOM_PAR
@@ -3301,9 +3413,8 @@ CONFIG_BAYCOM_PAR
   connect to a parallel interface. The driver supports the picpar and
   par96 designs. To configure the driver, use the sethdlc utility
   available in the standard ax25 utilities package. For information on
-  the modems, see http://www.baycom.de (to browse the WWW, you need to
-  have access to a machine on the Internet that has a program like
-  lynx or netscape) and Documentation/networking/baycom.txt. 
+  the modems, see http://www.baycom.de and the file
+  Documentation/networking/baycom.txt.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3316,9 +3427,8 @@ CONFIG_BAYCOM_EPP
   connect to a parallel interface. The driver supports the EPP
   designs. To configure the driver, use the sethdlc utility available
   in the standard ax25 utilities package. For information on the
-  modems, see http://www.baycom.de (to browse the WWW, you need to
-  have access to a machine on the Internet that has a program like
-  lynx or netscape) and Documentation/networking/baycom.txt.
+  modems, see http://www.baycom.de and the file
+  Documentation/networking/baycom.txt.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3336,10 +3446,8 @@ CONFIG_BAYCOM_SER_FDX
   driver and still provided in case this driver does not work with
   your serial interface chip. To configure the driver, use the sethdlc
   utility available in the standard ax25 utilities package. For
-  information on the modems, see http://www.baycom.de (to browse the
-  WWW, you need to have access to a machine on the Internet that has a
-  program like lynx or netscape) and
-  Documentation/networking/baycom.txt. 
+  information on the modems, see http://www.baycom.de and
+  Documentation/networking/baycom.txt.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3352,12 +3460,10 @@ CONFIG_BAYCOM_SER_HDX
   modems that connect to a serial interface. The driver supports the
   ser12 design in full duplex mode. This is the old driver. It is
   still provided in case your serial interface chip does not work with
-  the full duplex driver. This driver is depreciated. To configure
-  the driver, use the sethdlc utility available in the standard ax25
+  the full duplex driver. This driver is depreciated. To configure the
+  driver, use the sethdlc utility available in the standard ax25
   utilities package. For information on the modems, see
-  http://www.baycom.de (to browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or netscape)
-  and Documentation/networking/baycom.txt. 
+  http://www.baycom.de and Documentation/networking/baycom.txt.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3374,10 +3480,8 @@ CONFIG_SOUNDMODEM
   To configure the driver, use the sethdlc, smdiag and smmixer
   utilities available in the standard ax25 utilities package. For
   information on how to key the transmitter, see
-  http://www.ife.ee.ethz.ch/~sailer/pcf/ptt_circ/ptt.html (to browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape) and
-  Documentation/networking/soundmodem.txt. 
+  http://www.ife.ee.ethz.ch/~sailer/pcf/ptt_circ/ptt.html and
+  Documentation/networking/soundmodem.txt.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3473,13 +3577,11 @@ CONFIG_X25
   if you want that) and the lower level data link layer protocol LAPB
   (say Y to "LAPB Data Link Driver" below if you want that). 
 
-  You can read more about X.25 at http://www.sangoma.com/x25.html and
-  http://www.cisco.com/univercd/data/doc/software/11_0/rpcg/cx25.htm
-  (to browse the WWW, you need to have access to a machine on the
-  Internet that has a program like lynx or netscape). Information
-  about X.25 for Linux is contained in the files
+  You can read more about X.25 at http://www.sangoma.com/x25.htm and
+  http://www.cisco.com/univercd/data/doc/software/11_0/rpcg/cx25.htm .
+  Information about X.25 for Linux is contained in the files
   Documentation/networking/x25.txt and
-  Documentation/networking/x25-iface.txt. 
+  Documentation/networking/x25-iface.txt.
 
   One connects to an X.25 network either with a dedicated network card
   using the X.21 protocol (not yet supported by Linux) or one can do
@@ -3528,39 +3630,59 @@ CONFIG_BRIDGE
   other third party bridge products. 
 
   In order to use this, you'll need the bridge configuration tools
-  available via FTP (user: anonymous) from
-  ftp://shadow.cabi.net/pub/Linux. Please read the Bridge mini-HOWTO
-  for more information. Note that if your box acts as a bridge, it
-  probably contains several Ethernet devices, but the kernel is not
-  able to recognize more than one at boot time without help; for
-  details read the Ethernet-HOWTO, available via FTP (user: anonymous)
-  in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. The Bridging code is
-  still in test. If unsure, say N.
+  available from ftp://shadow.cabi.net/pub/Linux . Please read the
+  Bridge mini-HOWTO for more information. Note that if your box acts
+  as a bridge, it probably contains several Ethernet devices, but the
+  kernel is not able to recognize more than one at boot time without
+  help; for details read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
+
+  The Bridging code is still in test. If unsure, say N.
 
 Packet socket
 CONFIG_PACKET
   The Packet protocol is used by applications which communicate
   directly with network devices without an intermediate network
   protocol implemented in the kernel, e.g. tcpdump. If you want them
-  to work, choose Y. This driver is also available as a module called
-  af_packet.o ( = code which can be inserted in and removed from the
-  running kernel whenever you want). If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If unsure,
-  say Y.
+  to work, choose Y. 
+
+  This driver is also available as a module called af_packet.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt; if you use modprobe or
+  kmod, you may also want to add "alias net-pf-17 af_packet" to 
+  /etc/conf.modules. 
+
+  If unsure, say Y.
+
+Packet socket: mmapped IO
+CONFIG_PACKET_MMAP
+  If you say Y here, the Packet protocol driver will use an IO
+  mechanism that results in faster communication.
+
+  If unsure, say N.
 
 Kernel/User network link driver
 CONFIG_NETLINK
-  This driver allows for two-way communication between certain parts
-  of the kernel or modules and user processes; the user processes are
-  able to read from and write to character special files in the /dev
-  directory having major mode 36. So far, the kernel uses it to
-  publish some network related information if you say Y to "Routing
-  messages", below.  You also need to say Y here if you want to use
-  arpd, a daemon that helps keep the internal ARP cache (a mapping
-  between IP addresses and hardware addresses on the local network)
-  small. The ethertap device, which lets user space programs read and
-  write raw Ethernet frames, also needs the network link driver. If
-  unsure, say Y.
+  This driver allows for two-way communication between the kernel and
+  user processes; the user processes communicate with the kernel by
+  reading from and writing to character special files in the /dev
+  directory having major mode 36.
+
+  So far, the kernel uses this feature to publish some network related
+  information if you say Y to "Routing messages", below. You also need
+  to say Y here if you want to use arpd, a daemon that helps keep the
+  internal ARP cache (a mapping between IP addresses and hardware
+  addresses on the local network) small. The ethertap device, which
+  lets user space programs read and write raw Ethernet frames, also
+  needs the network link driver.
+  
+  This driver is also available as a module called netlink_dev.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 Y.
 
 Routing messages
 CONFIG_RTNETLINK
@@ -3577,30 +3699,38 @@ CONFIG_NETLINK_DEV
 
 Asynchronous Transfer Mode (ATM)
 CONFIG_ATM
-  Kernel support for ATM. Note that you need a set of user-space programs
-  to actually make use of ATM. See Documentation/atm.txt for further
-  details.
+  ATM is a high-speed networking technology for Local Area Networks
+  and Wide Area Networks. It uses a fixed packet size and is
+  connection oriented, allowing for the negotiation of minimum
+  bandwidth requirements.
+  
+  In order to participate in an ATM network, your Linux box needs an
+  ATM networking card. If you have that, say Y here and to the driver
+  of your ATM card below.
+
+  Note that you need a set of user-space programs to actually make use
+  of ATM. See the file Documentation/atm.txt for further details.
 
 Classical IP over ATM
 CONFIG_ATM_CLIP
-  Classical IP over ATM for PVCs and SVCs, supporting InARP and ATMARP.
-  Typically you will either use LAN Emulation (LANE) or Classical IP to
-  communicate with other IP hosts on your ATM network.
+  Classical IP over ATM for PVCs and SVCs, supporting InARP and
+  ATMARP. Typically you will either use LAN Emulation (LANE) or
+  Classical IP to communicate with other IP hosts on your ATM network.
 
 Do NOT send ICMP if no neighbour
 CONFIG_ATM_CLIP_NO_ICMP
-  Normally, an ICMP host unreachable message is sent if a neighbour cannot
-  be reached because there is no VC to it in the kernel's ATMARP table.
-  This may cause problems when ATMARP table entries are briefly removed
-  during revalidation. If this configuration option is set to "yes",
-  packets to such neighbours are silently discarded instead.
+  Normally, an "ICMP host unreachable" message is sent if a neighbour
+  cannot be reached because there is no VC to it in the kernel's
+  ATMARP table. This may cause problems when ATMARP table entries are
+  briefly removed during revalidation. If you say Y here, packets to
+  such neighbours are silently discarded instead.
 
 LAN Emulation (LANE) support
 CONFIG_ATM_LANE
-  LAN Emulation emulates services of existing LANs across an ATM network.
-  Besides operating as a normal ATM end station client, Linux LANE client
-  can also act as an proxy client bridging packets between ELAN and
-  Ethernet segments. You need LANE if you want to try MPOA.
+  LAN Emulation emulates services of existing LANs across an ATM
+  network. Besides operating as a normal ATM end station client, Linux
+  LANE client can also act as an proxy client bridging packets between
+  ELAN and Ethernet segments. You need LANE if you want to try MPOA.
 
 Multi-Protocol Over ATM (MPOA) support
 CONFIG_ATM_MPOA
@@ -3611,50 +3741,52 @@ CONFIG_ATM_MPOA
 
 ATM over TCP
 CONFIG_ATM_TCP
-  ATM over TCP driver. Useful mainly for development and for experiments.
+  ATM over TCP driver. Useful mainly for development and for
+  experiments. If unsure, say N.
 
 Efficient Networks ENI155P
 CONFIG_ATM_ENI
-  Driver for the Efficient Networks ENI155p series and SMC ATM Power155
-  155 Mbps ATM adapters. Both, the versions with 512kB and 2MB on-board
-  RAM (Efficient calls them "C" and "S", respectively), and the FPGA and
-  the ASIC Tonga versions of the board are supported. The driver works
-  with MMF (-MF or ...F) and UTP-5 (-U5 or ...D) adapters.
+  Driver for the Efficient Networks ENI155p series and SMC ATM
+  Power155 155 Mbps ATM adapters. Both, the versions with 512kB and
+  2MB on-board RAM (Efficient calls them "C" and "S", respectively),
+  and the FPGA and the ASIC Tonga versions of the board are supported.
+  The driver works with MMF (-MF or ...F) and UTP-5 (-U5 or ...D)
+  adapters.
 
 Enable extended debugging
 CONFIG_ATM_ENI_DEBUG
-  Extended debugging records various events and displays that list when
-  an inconsistency is detected. This mechanism is faster than generally
-  using printks, but still has some impact on performance. Note that
-  extended debugging may create certain race conditions itself. Enable
-  this ONLY if you suspect problems with the driver.
+  Extended debugging records various events and displays that list
+  when an inconsistency is detected. This mechanism is faster than
+  generally using printks, but still has some impact on performance.
+  Note that extended debugging may create certain race conditions
+  itself. Enable this ONLY if you suspect problems with the driver.
 
 Fine-tune burst settings
 CONFIG_ATM_ENI_TUNE_BURST
-  In order to obtain good throughput, the ENI NIC can transfer multiple
-  words of data per PCI bus access cycle. Such a multi-word transfer is
-  called a burst.
+  In order to obtain good throughput, the ENI NIC can transfer
+  multiple words of data per PCI bus access cycle. Such a multi-word
+  transfer is called a burst.
 
   The default settings for the burst sizes are suitable for most PCI
-  chipsets. However, in some cases, large bursts may overrun buffers in
-  the PCI chipset and cause data corruption. In such cases, large bursts
-  must be disabled and only (slower) small bursts can be used. The burst
-  sizes can be set independently in the send (TX) and receive (RX)
-  direction.
+  chipsets. However, in some cases, large bursts may overrun buffers
+  in the PCI chipset and cause data corruption. In such cases, large
+  bursts must be disabled and only (slower) small bursts can be used.
+  The burst sizes can be set independently in the send (TX) and
+  receive (RX) direction.
 
   Note that enabling many different burst sizes in the same direction
-  may increase the cost of setting up a transfer such that the resulting
-  throughput is lower than when using only the largest available burst
-  size.
+  may increase the cost of setting up a transfer such that the
+  resulting throughput is lower than when using only the largest
+  available burst size.
 
   Also, sometimes larger bursts lead to lower throughput, e.g. on an
-  Intel 440FX board, a drop from 135 Mbps to 103 Mbps was observed when
-  going from 8W to 16W bursts.
+  Intel 440FX board, a drop from 135 Mbps to 103 Mbps was observed
+  when going from 8W to 16W bursts.
 
 Enable 16W TX bursts (discouraged)
 CONFIG_ATM_ENI_BURST_TX_16W
-  Burst sixteed words at once in the send direction. This may work with
-  recent PCI chipsets, but is known to fail with older chipsets.
+  Burst sixteen words at once in the send direction. This may work
+  with recent PCI chipsets, but is known to fail with older chipsets.
 
 Enable 8W TX bursts (recommended)
 CONFIG_ATM_ENI_BURST_TX_8W
@@ -3663,37 +3795,38 @@ CONFIG_ATM_ENI_BURST_TX_8W
 
 Enable 4W TX bursts (optional)
 CONFIG_ATM_ENI_BURST_TX_4W
-  Burst four words at once in the send direction. You may want to try this
-  if you have disabled 8W bursts. Enabling 4W if 8W is also set may or may
-  not improve throughput.
+  Burst four words at once in the send direction. You may want to try
+  this if you have disabled 8W bursts. Enabling 4W if 8W is also set
+  may or may not improve throughput.
   
 Enable 2W TX bursts (optional)
 CONFIG_ATM_ENI_BURST_TX_2W
-  Burst two words at once in the send direction. You may want to try this
-  if you have disabled 4W and 8W bursts. Enabling 2W if 4W or 8W are also
-  set may or may not improve throughput.
+  Burst two words at once in the send direction. You may want to try
+  this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or 8W
+  are also set may or may not improve throughput.
 
 Enable 16W RX bursts (discouraged)
 CONFIG_ATM_ENI_BURST_RX_16W
-  Burst sixteen words at once in the receive direction. This may work with
-  recent PCI chipsets, but is known to fail with older chipsets.
+  Burst sixteen words at once in the receive direction. This may work
+  with recent PCI chipsets, but is known to fail with older chipsets.
 
 Enable 8W RX bursts (discouraged)
 CONFIG_ATM_ENI_BURST_RX_8W
-  Burst eight words at once in the receive direction. This may work with
-  recent PCI chipsets, but is known to fail with older chipsets, such as
-  the Intel Neptune series.
+  Burst eight words at once in the receive direction. This may work
+  with recent PCI chipsets, but is known to fail with older chipsets,
+  such as the Intel Neptune series.
 
 Enable 4W RX bursts (recommended)
 CONFIG_ATM_ENI_BURST_RX_4W
-  Burst four words at once in the receive direction. This is the default
-  setting. Enabling 4W if 8W is also set may or may not improve throughput.
+  Burst four words at once in the receive direction. This is the
+  default setting. Enabling 4W if 8W is also set may or may not
+  improve throughput.
 
 Enable 2W RX bursts (optional)
 CONFIG_ATM_ENI_BURST_RX_2W
-  Burst two words at once in the receive direction. You may want to try
-  this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or 8W are
-  also set may or may not improve throughput.
+  Burst two words at once in the receive direction. You may want to
+  try this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or
+  8W are also set may or may not improve throughput.
 
 ZeitNet ZN1221/ZN1225
 CONFIG_ATM_ZATM
@@ -3702,20 +3835,21 @@ CONFIG_ATM_ZATM
 
 Enable extended debugging
 CONFIG_ATM_ZATM_DEBUG
-  Extended debugging records various events and displays that list when
-  an inconsistency is detected. This mechanism is faster than generally
-  using printks, but still has some impact on performance. Note that
-  extended debugging may create certain race conditions itself. Enable
-  this ONLY if you suspect problems with the driver.
+  Extended debugging records various events and displays that list
+  when an inconsistency is detected. This mechanism is faster than
+  generally using printks, but still has some impact on performance.
+  Note that extended debugging may create certain race conditions
+  itself. Enable this ONLY if you suspect problems with the driver.
 
 Enable usec resolution timestamps
 CONFIG_ATM_ZATM_EXACT_TS
-  The uPD98401 SAR chip supports a high-resolution timer (approx. 30 MHz)
-  that is used for very accurate reception timestamps. Because that timer
-  overflows after 140 seconds, and also to avoid timer drift, time
-  measurements need to be periodically synchronized with the normal
-  system time. Enabling this feature will add some general overhead for
-  timer synchronization and also per-packet overhead for time conversion.
+  The uPD98401 SAR chip supports a high-resolution timer (approx. 30
+  MHz) that is used for very accurate reception timestamps. Because
+  that timer overflows after 140 seconds, and also to avoid timer
+  drift, time measurements need to be periodically synchronized with
+  the normal system time. Enabling this feature will add some general
+  overhead for timer synchronization and also per-packet overhead for
+  time conversion.
 
 IDT 77201 (NICStAR)
 CONFIG_ATM_NICSTAR
@@ -3772,8 +3906,8 @@ CONFIG_SCSI
   You also need to say Y here if you want support for the parallel
   port version of the 100 MB IOMEGA ZIP drive.
 
-  Please read the SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. The
+  Please read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . The
   SCSI-Programming-HOWTO contains information about how to add or
   remove an SCSI device from a running Linux machine without
   rebooting.
@@ -3790,9 +3924,9 @@ SCSI disk support
 CONFIG_BLK_DEV_SD
   If you want to use a SCSI hard disk or the SCSI or parallel port
   version of the IOMEGA ZIP drive under Linux, say Y and read the
-  SCSI-HOWTO, the Disk-HOWTO and the Multi-Disk-HOWTO, available via
-  FTP (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
-  This is NOT for SCSI CDROMs.
+  SCSI-HOWTO, the Disk-HOWTO and the Multi-Disk-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . This is NOT for SCSI
+  CDROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -3806,8 +3940,8 @@ CONFIG_BLK_DEV_SD
 SCSI tape support
 CONFIG_CHR_DEV_ST
   If you want to use a SCSI tape drive under Linux, say Y and read the
-  SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO and
+  SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , and
   drivers/scsi/README.st in the kernel source. This is NOT for SCSI
   CDROMs.
 
@@ -3820,8 +3954,8 @@ CONFIG_CHR_DEV_ST
 SCSI CDROM support
 CONFIG_BLK_DEV_SR
   If you want to use a SCSI CDROM under Linux, say Y and read the
-  SCSI-HOWTO and the CDROM-HOWTO from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Also make sure to say Y
+  SCSI-HOWTO and the CDROM-HOWTO at
+  http://metalab.unc.edu/mdw/linux.html#howto . Also make sure to say Y
   or M to "ISO 9660 CDROM filesystem support" later.
 
   This driver is also available as a module ( = code which can be
@@ -3844,12 +3978,12 @@ CONFIG_CHR_DEV_SG
   CDROMs or tapes, say Y here. These won't be supported by the kernel
   directly, so you need some additional software which knows how to
   talk to these devices using the SCSI protocol. For CD-writers, you
-  would need the program cdwrite, available via FTP (user: anonymous)
-  from ftp://metalab.unc.edu/pub/Linux/utils/disk-management; for
-  other devices, it's possible that you'll have to write the driver
-  software yourself, so have a look at the SCSI-HOWTO and at the
-  SCSI-Programming-HOWTO, both available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Please read the file
+  would need the program cdwrite, available from
+  ftp://metalab.unc.edu/pub/Linux/utils/disk-management ; for other
+  devices, it's possible that you'll have to write the driver software
+  yourself, so have a look at the SCSI-HOWTO and at the
+  SCSI-Programming-HOWTO, both available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Please read the file
   Documentation/scsi-generic.txt for more information.
 
   If you want to compile this as a module ( = code which can be
@@ -3914,10 +4048,9 @@ CONFIG_SCSI_AHA152X
   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.
+  It is explained in section 3.3 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#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
   inserted in and removed from the running kernel whenever you want).
@@ -3927,11 +4060,11 @@ CONFIG_SCSI_AHA152X
 Adaptec AHA1542 support
 CONFIG_SCSI_AHA1542
   This is support for a SCSI host adapter. It is explained in section
-  3.4 of the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that Trantor was
-  recently purchased by Adaptec, and some former Trantor products are
-  being sold under the Adaptec name. If it doesn't work out of the
-  box, you may have to change some settings in drivers/scsi/aha1542.h.
+  3.4 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Note that Trantor was
+  purchased by Adaptec, and some former Trantor products are being
+  sold under the Adaptec name. If it doesn't work out of the box, you
+  may have to change some settings in drivers/scsi/aha1542.h.
   
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -3941,8 +4074,8 @@ CONFIG_SCSI_AHA1542
 Adaptec AHA1740 support
 CONFIG_SCSI_AHA1740
   This is support for a SCSI host adapter. It is explained in section
-  3.5 of the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If it doesn't work out
+  3.5 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If it doesn't work out
   of the box, you may have to change some settings in
   drivers/scsi/aha1740.h.
 
@@ -3975,9 +4108,9 @@ CONFIG_SCSI_AIC7XXX
   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
+  at a minimum before contacting the maintainer with any questions.
+  The SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , can also be of great
   help.
 
   If you want to compile this driver as a module ( = code which can be
@@ -3987,26 +4120,37 @@ CONFIG_SCSI_AIC7XXX
 
 Enable or Disable Tagged Command Queueing by default
 CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT
-  This option causes the aic7xxx driver to attempt to use tagged command
-  queueing on any devices that claim to support it.  If this is set to yes,
-  you can still turn off TCQ on troublesome devices with the use of the
-  tag_info boot parameter.  See /usr/src/linux/drivers/scsi/README.aic7xxx
-  for more information on that and other aic7xxx setup commands.  If this
-  option is turned off, you may still enable TCQ on known good devices by
-  use of the tag_info boot parameter.
-  
-  If you are unsure about your devices then it is safest to say N here.
+  This option causes the aic7xxx driver to attempt to use Tagged
+  Command Queueing (TCQ) on all devices that claim to support it. 
+
+  TCQ is a feature of SCSI-2 which improves performance: the host
+  adapter can send several SCSI commands to a device's queue even if
+  previous commands haven't finished yet. Because the device is
+  intelligent, it can optimize its operations (like head positioning)
+  based on its own request queue. Not all devices implement this
+  correctly. 
+
+  If you say Y here, you can still turn off TCQ on troublesome devices
+  with the use of the tag_info boot parameter. See the file
+  drivers/scsi/README.aic7xxx for more information on that and other
+  aic7xxx setup commands. If this option is turned off, you may still
+  enable TCQ on known good devices by use of the tag_info boot
+  parameter.
+
+  If you are unsure about your devices then it is safest to say N
+  here.
   
   However, TCQ can increase performance on some hard drives by as much
-  as 50% or more, so I would recommend that if you say N here, that you
-  at least read the README.aic7xxx file so you will know how to enable
-  this option manually should your drives prove to be safe in regards
-  to TCQ.
+  as 50% or more, so it is recommended that if you say N here, you
+  should at least read the README.aic7xxx file so you will know how to
+  enable this option manually should your drives prove to be safe in
+  regards to TCQ.
 
-  Conversely, certain drives are known to lock up or cause bus resets when
-  TCQ is enabled on them.  If you have a Western Digital Enterprise SCSI
-  drive for instance, then don't even bother to enable TCQ on it as the
-  drive will become unreliable, and it will actually reduce performance.
+  Conversely, certain drives are known to lock up or cause bus resets
+  when TCQ is enabled on them. If you have a Western Digital
+  Enterprise SCSI drive for instance, then don't even bother to enable
+  TCQ on it as the drive will become unreliable, and it will actually
+  reduce performance.
 
 Default number of TCQ commands per device
 CONFIG_AIC7XXX_CMDS_PER_DEVICE
@@ -4018,14 +4162,14 @@ CONFIG_AIC7XXX_CMDS_PER_DEVICE
   figure. If the number is too high for any particular device, the
   driver will automatically compensate usually after only 10 minutes
   of uptime. It will not hinder performance if some of your devices
-  eventually have their command depth reduced, but is a waste of memory
-  if all of your devices end up reducing this number down to a more
-  reasonable figure.
+  eventually have their command depth reduced, but is a waste of
+  memory if all of your devices end up reducing this number down to a
+  more reasonable figure.
   
-  NOTE: Certain very broken drives are known to lock up when given more
-  commands than they like to deal with.  Quantum Fireball drives are the
-  most common in this category.  For the Quantum Fireball drives I would
-  suggest no more than 8 commands per device.
+  NOTE: Certain very broken drives are known to lock up when given
+  more commands than they like to deal with. Quantum Fireball drives
+  are the most common in this category. For the Quantum Fireball
+  drives it is suggested to use no more than 8 commands per device.
 
   Default: 8
 
@@ -4069,12 +4213,12 @@ CONFIG_SCSI_IPS
 BusLogic SCSI support
 CONFIG_SCSI_BUSLOGIC
   This is support for BusLogic MultiMaster and FlashPoint SCSI Host
-  Adapters. Consult the SCSI-HOWTO, available via anonymous FTP from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, and the files
+  Adapters. Consult the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , and the files
   README.BusLogic and README.FlashPoint in drivers/scsi for more
   information. If this driver does not work correctly without
   modification, please contact the author, Leonard N. Zubkoff, by
-  email to lnz@dandelion.com. 
+  email to lnz@dandelion.com.
 
   You can also build this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -4092,9 +4236,9 @@ CONFIG_SCSI_OMIT_FLASHPOINT
 DTC3180/3280 SCSI support
 CONFIG_SCSI_DTC3280
   This is support for DTC 3180/3280 SCSI Host Adapters. Please read
-  the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO and the file
-  drivers/scsi/README.dtc3x80. 
+  the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , and the file
+  drivers/scsi/README.dtc3x80.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4110,8 +4254,7 @@ CONFIG_SCSI_EATA_DMA
   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.
+  from http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4125,8 +4268,7 @@ CONFIG_SCSI_EATA_PIO
   host adapters could also use this driver but are discouraged from
   doing so, since this driver only supports hard disks and lacks
   numerous features. You might want to have a look at the SCSI-HOWTO,
-  available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  available from http://metalab.unc.edu/mdw/linux.html#howto . 
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -4139,11 +4281,11 @@ CONFIG_SCSI_U14_34F
   The source at drivers/scsi/u14-34f.c contains some information about
   this hardware. If the driver doesn't work out of the box, you may
   have to change some settings in drivers/scsi/u14-34f.c. Read the
-  SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that there is also
+  SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Note that there is also
   another driver for the same hardware: "UltraStor SCSI support",
   below. You should say Y to both only if you want 24F support as
-  well. 
+  well.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4174,8 +4316,8 @@ CONFIG_SCSI_FUTURE_DOMAIN
   (TMC-1660/1680, TMC-1650/1670, TMC-3260, TMC-1610M/MER/MEX) and
   other adapters based on the Future Domain chipsets (Quantum
   ISA-200S, ISA-250MG; Adaptec AHA-2920A; and at least one IBM board).
-  It is explained in section 3.7 of the SCSI-HOWTO, available via FTP
-  (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  It is explained in section 3.7 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip
   and should use the aic7xxx driver ("Adaptec AIC7xxx chipset SCSI
@@ -4189,19 +4331,24 @@ 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/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.
+  This is support for Future Domain MCS 600/700 MCA SCSI adapters.
+  Some 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.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called fd_mcs.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
 
 Generic NCR5380/53c400 SCSI support
 CONFIG_SCSI_GENERIC_NCR5380
   This is the generic NCR family of SCSI controllers, not to be
   confused with the NCR 53c7 or 8xx controllers. It is explained in
-  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
+  section 3.8 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If it doesn't work out
+  of the box, you may have to change some settings in
   drivers/scsi/g_NCR5380.h.
 
   This driver is also available as a module ( = code which can be
@@ -4228,9 +4375,9 @@ NCR53c7,8xx SCSI support
 CONFIG_SCSI_NCR53C7xx
   This is a driver for the 53c7 and 8xx NCR family of SCSI
   controllers, not to be confused with the NCR 5380 controllers. It is
-  explained in section 3.8 of the SCSI-HOWTO, available 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
+  explained in section 3.8 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If it doesn't work out
+  of the box, you may have to change some settings in
   drivers/scsi/53c7,8xx.h. Please read drivers/scsi/README.ncr53c7xx
   for the available boot time command line options.
 
@@ -4279,11 +4426,11 @@ CONFIG_SCSI_NCR53C8XX
   Recent versions of the 53C8XX chips are better supported by the
   option "SYM53C8XX SCSI support", below.
 
-  Note: there is yet another driver for the 53c8xx family of controllers
-  ("NCR53c7,8xx SCSI support" above). If you want to use them both,
-  you need to say M to both and build them as modules, but only one
-  may be active at a time. If you have a 53c8xx board, you probably do
-  not want to use the "NCR53c7,8xx SCSI support".
+  Note: there is yet another driver for the 53c8xx family of
+  controllers ("NCR53c7,8xx SCSI support" above). If you want to use
+  them both, you need to say M to both and build them as modules, but
+  only one may be active at a time. If you have a 53c8xx board, you
+  probably do not want to use the "NCR53c7,8xx SCSI support".
 
   Please read drivers/scsi/README.ncr53c8xx for more information.
 
@@ -4300,14 +4447,14 @@ CONFIG_SCSI_SYM53C8XX
   NCR53C8XX and this SYM53C8XX drivers either as module or linked to
   the kernel image.
 
-  When both drivers are linked to the kernel, the SYM53C8XX driver is 
-  called first at initialization and you can use the 'excl=ioaddr' 
-  driver boot option to exclude attachment of adapters by the SYM53C8XX 
-  driver. For instance, entering 'sym53c8xx=excl:0xb400,excl=0xc000' at 
-  lilo prompt prevents adapters at io address 0xb400 and 0xc000 from 
-  being attached by the SYM53C8XX driver, thus allowing the NCR53C8XX 
-  driver to attach them. The 'excl' option is also supported by the 
-  NCR53C8XX driver.
+  When both drivers are linked into the kernel, the SYM53C8XX driver
+  is called first at initialization and you can use the 'excl=ioaddr'
+  driver boot option to exclude attachment of adapters by the
+  SYM53C8XX driver. For example, entering
+  'sym53c8xx=excl:0xb400,excl=0xc000' at the lilo prompt prevents
+  adapters at io address 0xb400 and 0xc000 from being attached by the
+  SYM53C8XX driver, thus allowing the NCR53C8XX driver to attach them.
+  The 'excl' option is also supported by the NCR53C8XX driver.
   
   Please read drivers/scsi/README.ncr53c8xx for more information.
 
@@ -4365,9 +4512,11 @@ default tagged command queue depth
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
   "Tagged command queuing" is a feature of SCSI-2 which improves
   performance: the host adapter can send several SCSI commands to a
-  device's queue even if previous commands haven't finished yet. Some
-  SCSI devices don't implement this properly; if you want to disable
-  this feature, enter 0 or 1 here (it doesn't matter which).
+  device's queue even if previous commands haven't finished yet.
+  Because the device is intelligent, it can optimize its operations
+  (like head positioning) based on its own request queue. Some SCSI
+  devices don't implement this properly; if you want to disable this
+  feature, enter 0 or 1 here (it doesn't matter which).
 
   The default value is 8 and should be supported by most hard disks.
   This value can be overridden from the boot command line using the 
@@ -4448,8 +4597,8 @@ CONFIG_SCSI_IBMMCA
   'ibmmcascsi=display' as an additional kernel parameter. Try "man
   bootparam" or see the documentation of your boot loader about how to
   pass options to the kernel. The lilo procedure is also explained in
-  the SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -4525,9 +4674,9 @@ CONFIG_SCSI_IN2000
 
 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://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  This is support for the Initio 91XXU(W) SCSI host adapter. Please
+  read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -4537,8 +4686,8 @@ CONFIG_SCSI_INITIO
 PAS16 SCSI support
 CONFIG_SCSI_PAS16
   This is support for a SCSI host adapter. It is explained in section
-  3.10 of the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If it doesn't work out
+  3.10 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If it doesn't work out
   of the box, you may have to change some settings in
   drivers/scsi/pas16.h.
   
@@ -4549,9 +4698,9 @@ CONFIG_SCSI_PAS16
 
 Initio INI-A100U2W SCSI support
 CONFIG_SCSI_INIA100
-  This is support for the Initio INI-A100U2W SCSI host adapter.
-  Please read the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  This is support for the Initio INI-A100U2W SCSI host adapter. Please
+  read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be 
   inserted in and removed from the running kernel whenever you want),
@@ -4561,8 +4710,8 @@ CONFIG_SCSI_INIA100
 PCI2000 support
 CONFIG_SCSI_PCI2000
   This is support for the PCI2000I EIDE interface card which acts as a
-  SCSI host adapter. Please read the SCSI-HOWTO, available via FTP
-  (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  SCSI host adapter. Please read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module called pci2000.o ( = code
   which can be inserted in and removed from the running kernel
@@ -4572,8 +4721,8 @@ CONFIG_SCSI_PCI2000
 PCI2220i support
 CONFIG_SCSI_PCI2220I
   This is support for the PCI2220i EIDE interface card which acts as a
-  SCSI host adapter. Please read the SCSI-HOWTO, available via FTP
-  (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  SCSI host adapter. Please read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module called pci2220i.o ( = code
   which can be inserted in and removed from the running kernel
@@ -4583,8 +4732,8 @@ CONFIG_SCSI_PCI2220I
 PSI240i support
 CONFIG_SCSI_PSI240I
   This is support for the PSI240i EIDE interface card which acts as a
-  SCSI host adapter. Please read the SCSI-HOWTO, available via FTP
-  (user: anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  SCSI host adapter. Please read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module called psi240i.o ( = code
   which can be inserted in and removed from the running kernel
@@ -4603,8 +4752,7 @@ CONFIG_SCSI_QLOGIC_FAS
 
   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.
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4621,8 +4769,8 @@ CONFIG_SCSI_QLOGIC_ISP
   access mode".
 
   Please read the file drivers/scsi/README.qlogicisp. You should also
-  read the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -4642,9 +4790,8 @@ Seagate ST-02 and Future Domain TMC-8xx SCSI support
 CONFIG_SCSI_SEAGATE
   These are 8-bit SCSI controllers; the ST-01 is also supported by
   this driver. It is explained in section 3.9 of the SCSI-HOWTO,
-  available 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
+  available from http://metalab.unc.edu/mdw/linux.html#howto . If it
+  doesn't work out of the box, you may have to change some settings in
   drivers/scsi/seagate.h.
 
   This driver is also available as a module ( = code which can be
@@ -4655,8 +4802,8 @@ CONFIG_SCSI_SEAGATE
 Trantor T128/T128F/T228 SCSI support
 CONFIG_SCSI_T128
   This is support for a SCSI host adapter. It is explained in section
-  3.11 of the SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If it doesn't work out
+  3.11 of the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If it doesn't work out
   of the box, you may have to change some settings in
   drivers/scsi/t128.h. Note that Trantor was purchased by Adaptec, and
   some former Trantor products are being sold under the Adaptec name.
@@ -4670,8 +4817,8 @@ UltraStor SCSI support
 CONFIG_SCSI_ULTRASTOR
   This is support for the UltraStor 14F, 24F and 34F SCSI-2 host
   adapter family. This driver is explained in section 3.12 of the
-  SCSI-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If it doesn't work out
+  SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If it doesn't work out
   of the box, you may have to change some settings in
   drivers/scsi/ultrastor.h.
   
@@ -4711,8 +4858,8 @@ CONFIG_SCSI_EATA
   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.
+  SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that there is also another driver for the same hardware
   available: "EATA-DMA support". You should say Y to only one of them.
@@ -4751,8 +4898,8 @@ NCR53c406a SCSI support
 CONFIG_SCSI_NCR53C406A
   This is support for the NCR53c406a SCSI host adapter. For user
   configurable parameters, check out drivers/scsi/NCR53c406.c in the
-  kernel source. Also read the SCSI-HOWTO, available via FTP (user:
-  anonymous) at ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  kernel source. Also read the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -4815,8 +4962,8 @@ AM53/79C974 PCI SCSI support
 CONFIG_SCSI_AM53C974
   This is support for the AM53/79C974 SCSI host adapters. Please read
   drivers/scsi/README.AM53C974 for details. Also, the SCSI-HOWTO,
-  available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, is for you.
+  available from http://metalab.unc.edu/mdw/linux.html#howto , is for
+  you.
 
   Note that there is another driver for AM53C974 based adapters:
   "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above. You
@@ -4837,12 +4984,6 @@ CONFIG_SCSI_MEGARAID
   say M here and read Documentation/modules.txt. The module will be
   called megaraid.o.
 
-###
-### What is this?
-###
-#Concurrent IO commands on MegaRAID
-#CONFIG_MEGARAID_MULTI_IO
-
 GDT SCSI Disk Array Controller support
 CONFIG_SCSI_GDTH
   This is a driver for all SCSI Disk Array Controllers (EISA/ISA/PCI) 
@@ -4870,8 +5011,8 @@ CONFIG_SCSI_PPA
 
   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,
+  SCSI-HOWTO, which is available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If you use this driver,
   you will still be able to use the parallel port for other tasks,
   such as a printer; it is safe to compile both drivers into the
   kernel.
@@ -4897,8 +5038,8 @@ CONFIG_SCSI_IMM
 
   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,
+  SCSI-HOWTO, which is available from
+  http://metalab.unc.edu/mdw/linux.html#howto . If you use this driver,
   you will still be able to use the parallel port for other tasks,
   such as a printer; it is safe to compile both drivers into the
   kernel.
@@ -5022,31 +5163,28 @@ CONFIG_NETDEVICES
   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
+  the UUCP-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto ) or dialing up a shell
   account or a BBS, even using term (term is a program which gives you
   almost full Internet connectivity if you have a regular dial up
   shell account on some Internet connected Unix computer. Read
-  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html (to browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape)).
+  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html ).
 
   You'll have to say Y if your computer contains a network card that
   you want to use under Linux (make sure you know its name because you
   will be asked for it and read the Ethernet-HOWTO (especially if you
-  plan to use more than one network card under Linux), available from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini) or if you want to
-  use SLIP (Serial Line Internet Protocol is the protocol used to send
-  Internet traffic over telephone lines or null modem cables) or CSLIP
-  (compressed SLIP) or PPP (Point to Point Protocol, a better and
-  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 amateur radio links).
+  plan to use more than one network card under Linux)) or if you want
+  to use SLIP (Serial Line Internet Protocol is the protocol used to
+  send Internet traffic over telephone lines or null modem cables) or
+  CSLIP (compressed SLIP) or PPP (Point to Point Protocol, a better
+  and 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 amateur radio links).
 
   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
+  Guide", to be found in ftp://metalab.unc.edu/pub/Linux/docs/LDP . If
   unsure, say Y.
 
 Dummy net driver support
@@ -5055,11 +5193,11 @@ CONFIG_DUMMY
   this device is consigned into oblivion) with a configurable IP
   address. It is most commonly used in order to make your currently
   inactive SLIP address seem like a real address for local programs.
-  If you use SLIP or PPP, you might want to say Y here. Read about it
-  in the Network Administrator's Guide, available via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/LDP. Since this
+  If you use SLIP or PPP, you might want to say Y here. Since this
   thing often comes in handy, the default is Y. It won't enlarge your
-  kernel either. What a deal.
+  kernel either. What a deal. Read about it in the Network
+  Administrator's Guide, available from
+  http://metalab.unc.edu/mdw/linux.html#guide .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -5085,16 +5223,14 @@ 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-3-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, explains how to
+  NET-3-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , explains how to
   configure SLIP. Note that you don't need this option if you just
   want to run term (term is a program which gives you almost full
   Internet connectivity if you have a regular dial up shell account on
   some Internet connected Unix computer. Read
-  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html (to browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape)). SLIP support will enlarge
-  your kernel by about 4 KB. If unsure, say N.
+  http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html ). SLIP
+  support will enlarge your kernel by about 4 KB. If unsure, say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -5108,13 +5244,12 @@ CONFIG_SLIP_COMPRESSED
   TCP/IP headers (not on the data itself), but it has to be supported
   on both ends. Ask your access provider if you are not sure and
   answer Y, just in case. You will still be able to use plain SLIP. If
-  you plan to use SLiRP, the SLIP emulator (available via FTP (user:
-  anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/system/network/serial/) which allows
+  you plan to use SLiRP, the SLIP emulator (available 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-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.
+  definitely want to say Y here. The NET-3-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , explains how to
+  configure CSLIP. This won't enlarge your kernel.
 
 Keepalive and linefill
 CONFIG_SLIP_SMART
@@ -5136,23 +5271,30 @@ PPP (point-to-point protocol) support
 CONFIG_PPP
   PPP (Point to Point Protocol) is a newer and better SLIP. It serves
   the same purpose: sending Internet traffic over telephone (and other
-  serial) lines.  Most ISPs these days support PPP rather than SLIP.
+  serial) lines. Ask your access provider if they support it, because
+  otherwise you can't use it; most internet access providers these
+  days support PPP rather than SLIP.
 
   To use PPP, you need an additional program called pppd as described
   in Documentation/networking/ppp.txt and in the PPP-HOWTO, available
-  from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If you upgrade
+  at http://metalab.unc.edu/mdw/linux.html#howto . If you upgrade
   from an older kernel, you might need to upgrade pppd as well. The
   PPP option enlarges your kernel by about 16 KB.
 
-  Almost always, if you answer Y or M to this question, you should
-  give the same answer to the next question, about PPP support for
-  async serial ports.
+  There are actually two versions of PPP: the traditional PPP for
+  asynchronous lines, such as regular analog phone lines, and
+  synchronous PPP which can be used over digital ISDN lines for
+  example. If you want to use PPP over phone lines or other
+  asynchronous serial lines, you need to say Y (or M) here and also to
+  the next option, "PPP support for async serial ports". For PPP over
+  synchronous lines, you should say Y (or M) here and to "Support
+  synchronous PPP", below.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you said Y to "Version information on all symbols" above, then
   you cannot compile the PPP driver into the kernel; you can then only
-  compile it as a module. The module will be called ppp_generic.o.  If
+  compile it as a module. The module will be called ppp_generic.o. If
   you want to compile it as a module, say M here and read
   Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt.
@@ -5172,10 +5314,10 @@ PPP Deflate compression
 CONFIG_PPP_DEFLATE
   Support for the Deflate compression method for PPP, which uses the
   Deflate algorithm (the same algorithm that gzip uses) to compress
-  each PPP packet before it is sent over the wire.  The peer (the
-  machine at the other end of the PPP link, usually your ISP) has to
-  support the Deflate compression method as well for this to be
-  useful.
+  each PPP packet before it is sent over the wire. The machine at the
+  other end of the PPP link (usually your ISP) has to support the
+  Deflate compression method as well for this to be useful. Even if
+  they don't support it, it is safe to say Y here.
 
   This code is also available as a module (code which can be inserted
   into and removed from the running kernel).  If you want to compile
@@ -5185,15 +5327,19 @@ PPP BSD-Compress compression
 CONFIG_PPP_BSDCOMP
   Support for the BSD-Compress compression method for PPP, which uses
   the LZW compression method to compress each PPP packet before it is
-  sent over the wire.  The peer (the other end of the PPP link) has to
-  support the BSD-Compress compression method as well for this to be
-  useful.  The PPP Deflate compression method is preferable to
-  BSD-Compress, because it compresses better and is patent-free.
+  sent over the wire. The machine at the other end of the PPP link
+  (usually your ISP) has to support the BSD-Compress compression
+  method as well for this to be useful. Even if they don't support it,
+  it is safe to say Y here.
+
+  The PPP Deflate compression method ("PPP Deflate compression",
+  above) is preferable to BSD-Compress, because it compresses better
+  and is patent-free.
 
   Note that the BSD compression code will always be compiled as a
   module; it is called bsd_comp.o and will show up in the directory
   modules once you have said "make modules". If unsure, say N.
-
 Wireless LAN (non-hamradio)
 CONFIG_NET_RADIO
   Support for wireless LANs and everything having to do with radio,
@@ -5203,22 +5349,20 @@ CONFIG_NET_RADIO
   interfaces. 
 
   Some user-level drivers for scarab devices which don't require
-  special kernel support are available via FTP (user: anonymous) from
-  ftp://shadow.cabi.net/pub/Linux.
+  special kernel support are available from
+  ftp://shadow.cabi.net/pub/Linux .
 
 STRIP (Metricom Starmode radio IP)
 CONFIG_STRIP
   Say Y if you have a Metricom radio and intend to use Starmode Radio
   IP. STRIP is a radio protocol developed for the MosquitoNet project
-  (On the WWW at http://mosquitonet.stanford.edu/; to browse the WWW,
-  you need to have access to a machine on the Internet that has a
-  program like lynx or netscape) to send Internet traffic using
-  Metricom radios. Metricom radios are small, battery powered,
-  100kbit/sec packet radio transceivers, about the size and weight of
-  a cellular telephone. (You may also have heard them called
+  (on the WWW at http://mosquitonet.stanford.edu/ ) to send Internet
+  traffic using Metricom radios. Metricom radios are small, battery
+  powered, 100kbit/sec packet radio transceivers, about the size and
+  weight of a cellular telephone. (You may also have heard them called
   "Metricom modems" but we avoid the term "modem" because it misleads
   many people into thinking that you can plug a Metricom modem into a
-  phone line and use it as a modem.)  
+  phone line and use it as a modem.)
 
   You can use STRIP on any Linux machine with a serial port, although
   it is obviously most useful for people with laptop computers. If you
@@ -5243,14 +5387,14 @@ CONFIG_WAVELAN
   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
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Some more specific
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Some more specific
   information is contained in Documentation/networking/wavelan.txt and
   in the source code drivers/net/wavelan.p.h.
 
   You will also need the wireless tools package available from
-  ftp://ftp.inka.de/pub/comp/Linux/networking/NetTools/contrib/.
-  Please read the man pages contained therein.
+  ftp://hyper.stanford.edu/pub/pcmcia/contrib/ . Please read the man
+  pages contained therein.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5260,14 +5404,16 @@ CONFIG_WAVELAN
 
 Aironet Arlan 655 & IC2200 DS support
 CONFIG_ARLAN
-  Aironet makes Arlan. www.aironet.com. Uses www.Telxon.com chip, which is
-  used on several similar cards. Driver is tested on 655 and IC2200 series. 
-  Look for http://www.ylenurme.ee/~elmer/655/ for latest information. 
-  Driver is build as two modules, arlan and arlan-proc. The later is /proc
-  interface and not needed most of time.
+  Aironet makes Arlan, a class of wireless LAN adapters. These use the
+  www.Telxon.com chip, which is also used on several similar cards.
+  This driver is tested on the 655 and IC2200 series cards. Look at
+  http://www.ylenurme.ee/~elmer/655/ for latest information.
+  
+  The driver is built as two modules, arlan and arlan-proc. The latter
+  is the /proc interface and is not needed most of time.
+  
   On some computers the card ends up in non-valid state after some time.
   Use a ping-reset script to clear it.
-   
 
 LAPB over Ethernet driver
 CONFIG_LAPBETHER
@@ -5295,6 +5441,39 @@ CONFIG_X25_ASY
   say M here and read Documentation/modules.txt. The module will be
   called x25_asy.o. If unsure, say N.
 
+PCMCIA ethernet cards (NE2000 compatibles: DE-650, ...)
+CONFIG_PCMCIA_PCNET
+  Say Y here if you intend to attach an NE2000 compatible PCMCIA
+  (PC-card) Ethernet networking card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pcnet_cs.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt. If unsure,
+  say N.
+
+3Com 3c589 PCMCIA card
+CONFIG_PCMCIA_3C589
+  Say Y here if you intend to attach a 3Com 3c589 PCMCIA
+  (PC-card) Ethernet networking card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c589_cs.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt. If unsure,
+  say N.
+
+Aviator/Raytheon 2.4MHz wireless
+CONFIG_PCMCIA_RAYCS
+  Say Y here if you intend to attach an Aviator/Raytheon PCMCIA
+  (PC-card) wireless Ethernet networking card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ray_cs.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt. If unsure,
+  say N.
+
 PLIP (parallel port) support
 CONFIG_PLIP
   PLIP (Parallel Line Internet Protocol) is used to create a
@@ -5314,17 +5493,15 @@ CONFIG_PLIP
   Documentation/networking/PLIP.txt. The cables can be up to 15m long.
   Mode 0 works also if one of the machines runs DOS/Windows and has
   some PLIP software installed, e.g. the Crynwr PLIP packet driver
-  (http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html; to browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape) and winsock or NCSA's telnet.
-
-  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-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.
+  (http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html ) and
+  winsock or NCSA's telnet.
+
+  If you want to use PLIP, say Y and read the PLIP mini-HOWTO as well
+  as the NET-3-HOWTO, both available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Note that the PLIP
+  protocol has been changed and this PLIP driver won't work together
+  with the PLIP support in Linux versions 1.0.x. This option enlarges
+  your kernel by about 8 KB.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -5344,8 +5521,7 @@ CONFIG_EQUALIZER
 
   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.
+  from http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5372,8 +5548,9 @@ CONFIG_ETHERTAP
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called ethertap.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. If you don't
-  know what to use this for, you don't need it.
+  module, say M here and read Documentation/modules.txt. 
+
+  If you don't know what to use this for, you don't need it.
 
 Sealevel Systems 4021 support
 CONFIG_SEALEVEL_4021
@@ -5393,11 +5570,10 @@ CONFIG_DLCI
   network, usually at the phone company) can carry several logical
   point-to-point connections to other computers connected to the frame
   relay network. For a general explanation of the protocol, check out
-  http://www.frforum.com/ on the WWW. (To browse the WWW, you need to
-  have access to a machine on the Internet that has a program like
-  lynx or netscape.) To use frame relay, you need supporting hardware
-  (called FRAD) and certain programs from the net-tools package as
-  explained in Documentation/networking/framerelay.txt.
+  http://www.frforum.com/ on the WWW. To use frame relay, you need
+  supporting hardware (called FRAD) and certain programs from the
+  net-tools package as explained in
+  Documentation/networking/framerelay.txt.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5473,9 +5649,8 @@ CONFIG_WAN_ROUTER
   the price of an external router. If you have one of those cards and
   wish to use your Linux box as a WAN router, say Y here and also to
   the WAN driver for your card, below. You will then need the
-  wan-tools package which is available via FTP (user: anonymous) from
-  ftp://ftp.sangoma.com. Read Documentation/networking/wan-router.txt
-  for more information.
+  wan-tools package which is available from ftp://ftp.sangoma.com .
+  Read Documentation/networking/wan-router.txt for more information.
 
   The WAN routing support is also available as a module called
   wanrouter.o ( = code which can be inserted in and removed from the
@@ -5487,17 +5662,18 @@ CONFIG_WAN_ROUTER
 Fast switching (read help!)
 CONFIG_NET_FASTROUTE
   Saying Y here enables direct NIC-to-NIC (NIC = Network Interface
-  Card) data transfers, which is fast.
+  Card) data transfers on the local network, which is fast.
+
+  IMPORTANT NOTE: This option is NOT COMPATIBLE with "Network packet
+  filtering" (CONFIG_NETFILTER). Say N here if you say Y there.
 
-    *** This option is NOT COMPATIBLE with several important ***
-    *** networking options: especially CONFIG_NETFILTER.     ***
-    *** Say N here if you intend to use Linux as a firewall. ***
+  However, it will work with all options in the "IP: advanced router"
+  section (except for "IP: use TOS value as routing key" and
+  "IP: use FWMARK value as routing key").
 
-  However, it will work with all options in CONFIG_IP_ADVANCED_ROUTER
-  section (except for CONFIG_IP_ROUTE_TOS and CONFIG_IP_ROUTE_FWMARK).
   At the moment, few devices support fast switching (tulip is one of
-  them, modified 8390 can be found at
-  ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz).
+  them, a modified 8390 driver can be found at
+  ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz ).
 
   If unsure, say N.
 
@@ -5505,40 +5681,41 @@ Forwarding between high speed interfaces
 CONFIG_NET_HW_FLOWCONTROL
   This option enables NIC (Network Interface Card) hardware throttling
   during periods of extremal congestion. At the moment only a couple
-  of device drivers support it (really only one -- tulip, modified
-  8390 can be found at
-  ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz).
-  Really, this option is applicable to any machine attached to a fast enough
-  network, and even a 10 Mb NIC is able to kill a not very slow box,
-  such as a 120MHz Pentium.
+  of device drivers support it (really only one -- tulip, a modified
+  8390 driver can be found at
+  ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz ). 
+
+  Really, this option is applicable to any machine attached to a fast
+  enough network, and even a 10 Mb NIC is able to kill a not very slow
+  box, such as a 120MHz Pentium.
 
   However, do not say Y here if you did not experience any serious
   problems.
 
-CPU is too slow to handle full bandwidth
-CONFIG_CPU_IS_SLOW
-  If you suspect that your CPU is not fast enough to handle the
-  full bandwidth of your network connection, try saying Y here. If
-  unsure, say N.
-
 QoS and/or fair queueing
 CONFIG_NET_SCHED
-  When the kernel has several packets to send out over the network
-  devices, it has to make a decision which one to send first. This is
-  especially important if some of the network devices are real time
-  devices that need a certain minimum data flow rate. There are
-  several different algorithms for how to do this "fairly"; they are
-  called packet schedulers. If you want to stick to the default
-  scheduling algorithm, say N here. If you want to experiment with a
-  couple of different algorithms, say Y. You can then attach different
-  schedulers to different network devices. Currently, this is only
-  recommended for experts.
+  When the kernel has several packets to send out over a network
+  device, it has to decide which ones to send first, which ones to
+  delay, and which ones to drop. This is the job of the packet
+  scheduler, and several different algorithms for how to do this
+  "fairly" have been proposed.
+
+  If you say N here, you will get the standard packet scheduler, which
+  is a FIFO (first come, first served). If you say Y here, you will be
+  able to choose from among several alternative algorithms which can
+  then be attached to different network devices. This is useful for
+  example if some of your network devices are real time devices that
+  need a certain minimum data flow rate, or if you need to limit the
+  maximum data flow rate for traffic which matches specified criteria.
+  This code is considered to be experimental.
 
   To administer these schedulers, you'll need the user-level utilities
-  from the package iproute2+tc at ftp://ftp.inr.ac.ru/ip-routing/
+  from the package iproute2+tc at ftp://ftp.inr.ac.ru/ip-routing/ .
+  That package also contains some documentation; for more, check out
+  http://snafu.freedom.org/linux2.2/iproute-notes.html .
 
   If you say Y here and to "/proc filesystem" below, you will be able
-  to read status information about priority schedulers from the file
+  to read status information about packet schedulers from the file
   /proc/net/psched.
   
   The available schedulers are listed in the following questions; you
@@ -5550,9 +5727,17 @@ CONFIG_NET_SCH_CBQ
   scheduling algorithm for some of your network devices. This
   algorithm classifies the waiting packets into a tree-like hierarchy
   of classes; the leaves of this tree are in turn scheduled by
-  separate algorithms (called "disciplines" in this context) which you
-  can choose below from among the various queueing algorithms. See the
-  top of net/sched/sch_cbq.c for references about the CBQ algorithm.
+  separate algorithms (called "disciplines" in this context).
+
+  See the top of net/sched/sch_cbq.c for references about the CBQ
+  algorithm.
+  
+  CBQ is a commonly used scheduler, so if you're unsure, you should
+  say Y here. Then say Y to all the queueing algorithms below that you
+  want to use as CBQ disciplines. Then say Y to "Packet classifier
+  API" and say Y to all the classifiers you want to use; a classifier
+  is a routine that allows you to sort your outgoing traffic into
+  classes based on a certain criterion.
 
   This code is also available as a module called sch_cbq.o ( = code
   which can be inserted in and removed from the running kernel
@@ -5574,11 +5759,17 @@ CONFIG_NET_SCH_CSZ
   whenever you want). If you want to compile it as a module, say M
   here and read Documentation/modules.txt.
 
+#ATM pseudo-scheduler
+#CONFIG_NET_SCH_ATM
+#
+# ???
+#
+  
 The simplest PRIO pseudo scheduler
 CONFIG_NET_SCH_PRIO
   Say Y here if you want to use an n-band priority queue packet
   "scheduler" for some of your network devices or as a leaf discipline
-  for the CBQ scheduling algorithm. 
+  for the CBQ scheduling algorithm. If unsure, say Y.
 
   This code is also available as a module called sch_prio.o ( = code
   which can be inserted in and removed from the running kernel
@@ -5590,7 +5781,7 @@ CONFIG_NET_SCH_RED
   Say Y here if you want to use the Random Early Detection (RED)
   packet scheduling algorithm for some of your network devices (see
   the top of net/sched/sch_red.c for details and references about the
-  algorithm). 
+  algorithm).
 
   This code is also available as a module called sch_red.o ( = code
   which can be inserted in and removed from the running kernel
@@ -5640,7 +5831,7 @@ QoS support
 CONFIG_NET_QOS
   Say Y here if you want to include Quality Of Service scheduling
   features, which means that you will be able to request certain
-  rate-of-flow limits for your net devices.
+  rate-of-flow limits for your network devices.
 
   Note that the answer to this question won't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -5655,24 +5846,70 @@ CONFIG_NET_ESTIMATOR
 Packet classifier API
 CONFIG_NET_CLS
   The CBQ scheduling algorithm requires that network packets which are
-  scheduled to be sent out over a network device be classified in some
-  way. If you say Y here, you will get a choice of several different
-  packet classifiers with the following questions. 
-#
-# Routing tables based classifier
-# CONFIG_NET_CLS_ROUTE
-#
-# Firewall based classifier
-# CONFIG_NET_CLS_FW
-#
-# U32 classifier
-# CONFIG_NET_CLS_U32
-#
-# Special RSVP classifier
-# CONFIG_NET_CLS_RSVP
-#
-# Special RSVP classifier for IPv6
-# CONFIG_NET_CLS_RSVP6
+  scheduled to be sent out over a network device be classified
+  according to some criterion. If you say Y here, you will get a
+  choice of several different packet classifiers with the following
+  questions.
+
+Routing tables based classifier
+CONFIG_NET_CLS_ROUTE
+  If you say Y here, you will be able to classify outgoing packets
+  according to the route table entry they matched. If unsure, say Y.
+
+  This code is also available as a module called cls_route.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
+
+Firewall based classifier
+CONFIG_NET_CLS_FW
+  If you say Y here, you will be able to classify outgoing packets
+  according to firewall criteria you specified.
+
+  This code is also available as a module called cls_fw.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt.
+
+U32 classifier
+CONFIG_NET_CLS_U32
+  If you say Y here, you will be able to classify outgoing packets
+  according to their destination address. If unsure, say Y.
+
+  This code is also available as a module called cls_u32.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt
+
+Special RSVP classifier
+CONFIG_NET_CLS_RSVP
+  The Resource Reservation Protocol (RSVP) permits end systems to
+  request a minimum and maximum data flow rate for a connection; this
+  is important for real time data such as streaming sound or video.
+
+  Say Y here if you want to be able to classify outgoing packets based
+  on their RSVP requests.
+
+  This code is also available as a module called cls_rsvp.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt
+
+Special RSVP classifier for IPv6
+CONFIG_NET_CLS_RSVP6
+  The Resource Reservation Protocol (RSVP) permits end systems to
+  request a minimum and maximum data flow rate for a connection; this
+  is important for real time data such as streaming sound or video.
+
+  Say Y here if you want to be able to classify outgoing packets based
+  on their RSVP requests and you are using the new Internet Protocol
+  IPv6 as opposed to the older and more common IPv4.
+
+  This code is also available as a module called cls_rsvp6.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read Documentation/modules.txt
+
 #
 # Ingres traffic policing
 # CONFIG_NET_CLS_POLICE
@@ -5716,6 +5953,12 @@ CONFIG_COSA
   The module will be called cosa.o. For general information about
   modules read Documentation/modules.txt.
 
+# Fibre Channel driver support
+# CONFIG_NET_FC
+
+# Interphase 5526 Tachyon chipset based adaptor support
+# CONFIG_IPHASE5526
+
 Red Creek Hardware VPN (EXPERIMENTAL)
 CONFIG_RCPCI
   This is a driver for hardware which provides a Virtual Private
@@ -5742,16 +5985,15 @@ CONFIG_WAN_DRIVERS
 
 Sangoma WANPIPE(tm) multiprotocol cards
 CONFIG_VENDOR_SANGOMA
-  WANPIPE from Sangoma Technologies Inc. (http://www.sangoma.com; to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape) is a family of intelligent
-  multiprotocol WAN adapters with data transfer rates up to T1 (1.544
-  Mbps). They are also known as Synchronous Data Link Adapters (SDLA)
-  and designated S502E(A), S503 or S508. These cards support the X.25,
-  Frame Relay, and PPP protocols. If you have one or more of these
-  cards, say Y to this option; you may then also want to read the file
-  Documentation/networking/wanpipe.txt. The next questions will ask
-  you about the protocols you want the driver to support.
+  WANPIPE from Sangoma Technologies Inc. (http://www.sangoma.com ) is a
+  family of intelligent multiprotocol WAN adapters with data transfer
+  rates up to T1 (1.544 Mbps). They are also known as Synchronous Data
+  Link Adapters (SDLA) and designated S502E(A), S503 or S508. These
+  cards support the X.25, Frame Relay, and PPP protocols. If you have
+  one or more of these cards, say Y to this option; you may then also
+  want to read the file Documentation/networking/wanpipe.txt. The next
+  questions will ask you about the protocols you want the driver to
+  support.
 
   The driver will be compiled as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5793,23 +6035,22 @@ CONFIG_WANPIPE_PPP
 Cyclom 2X(tm) multiprotocol cards
 CONFIG_CYCLADES_SYNC
   Cyclom 2X from Cyclades Corporation (http://www.cyclades.com and
-  http://www.cyclades.com.br; to browse the WWW, you need to have
-  access to a machine on the Internet that has a program like lynx or
-  netscape) is an intelligent multiprotocol WAN adapter with data
-  transfer rates up to 512 Kbps). These cards support the X.25 and SNA
-  related protocols. If you have one or more of these cards, say Y to
-  this option. The next questions will ask you about the protocols you
-  want the driver to support (for now only X.25 is supported).
+  http://www.cyclades.com.br ) is an intelligent multiprotocol WAN
+  adapter with data transfer rates up to 512 Kbps. These cards support
+  the X.25 and SNA related protocols. If you have one or more of these
+  cards, say Y to this option. The next questions will ask you about
+  the protocols you want the driver to support (for now only X.25 is
+  supported).
 
   While no documentation is available at this time please grab the
   wanconfig tarball in http://www.conectiva.com.br/~acme/cycsyn-devel
   (with minor changes to make it compile with the current wanrouter
   include files; efforts are being made to use the original package
-  available at ftp://ftp.sangoma.com).
+  available at ftp://ftp.sangoma.com ).
 
   Feel free to contact me or the cycsyn-devel mailing list at
   acme@conectiva.com.br and cycsyn-devel@bazar.conectiva.com.br for
-  aditional details, I hope to have documentation available as soon
+  additional details, I hope to have documentation available as soon
   as possible.
 
   The driver will be compiled as a module ( = code which can be
@@ -5821,6 +6062,7 @@ Cyclom 2X X.25 support
 CONFIG_CYCLOMX_X25
   Say Y to this option if you are planning to connect a Cyclom 2X card
   to an X.25 network. 
+
   If you say N, the X.25 support will not be included in the driver
   (saves about 11 KB of kernel memory).
 
@@ -5841,9 +6083,9 @@ CONFIG_NET_ETHERNET
 
   If your Linux machine will be connected to an Ethernet and you have
   an Ethernet network interface card (NIC) installed in your computer,
-  say Y here and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. You will
-  then also have to say Y to the driver for your particular NIC.
+  say Y here and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . You will then also have
+  to say Y to the driver for your particular NIC.
 
   Note that the answer to this question won't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -5868,8 +6110,8 @@ CONFIG_SUN_INTEL
 Western Digital/SMC cards
 CONFIG_NET_VENDOR_SMC
   If you have a network (Ethernet) card belonging to this class, say Y
-  and read the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -5879,8 +6121,8 @@ CONFIG_NET_VENDOR_SMC
 WD80*3 support
 CONFIG_WD80x3
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5891,9 +6133,8 @@ CONFIG_WD80x3
 SMC Ultra MCA support
 CONFIG_ULTRAMCA
   If you have a network (Ethernet) card of this type and are running
-  an MCA based system (PS/2), say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  an MCA based system (PS/2), say Y and read the Ethernet-HOWTO,
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5904,8 +6145,8 @@ CONFIG_ULTRAMCA
 SMC Ultra support
 CONFIG_ULTRA
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
   
   Important: There have been many reports that, with some motherboards
   mixing an SMC Ultra and an Adaptec AHA154x SCSI card (or compatible,
@@ -5923,8 +6164,8 @@ CONFIG_ULTRA
 SMC Ultra32 EISA support
 CONFIG_ULTRA32
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5939,8 +6180,7 @@ CONFIG_SMC9194
   another SMC9192/9194 based chipset. Say Y if you want it compiled
   into the kernel, and read the file
   Documentation/networking/smc9.txt and the Ethernet-HOWTO, available
-  via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  from http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
@@ -5953,8 +6193,8 @@ CONFIG_NE2K_PCI
   This driver is for NE2000 compatible PCI cards. It will not work
   with ISA NE2000 cards (they have their own driver, "NE2000/NE1000
   support" below). If you have a PCI NE2000 network (Ethernet) card,
-  say Y and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  say Y and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5966,8 +6206,7 @@ Racal-Interlan (Micom) NI cards
 CONFIG_NET_VENDOR_RACAL
   If you have a network (Ethernet) card belonging to this class, such
   as the NI5010, NI5210 or NI6210, say Y and read the Ethernet-HOWTO,
-  available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -5977,9 +6216,9 @@ CONFIG_NET_VENDOR_RACAL
 NI5010 support
 CONFIG_NI5010
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that this is still
-  experimental code. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Note that this is still
+  experimental code.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5990,8 +6229,8 @@ CONFIG_NI5010
 NI5210 support
 CONFIG_NI52
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6002,8 +6241,8 @@ CONFIG_NI52
 NI6510 support
 CONFIG_NI65
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6015,22 +6254,33 @@ RealTek 8129/8139 (not 8019/8029!) support
 CONFIG_RTL8139
   This is a driver for the Fast Ethernet PCI network cards based on
   the RTL8129 and RTL8139 chips. If you have one of those, say Y and
-  read the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
   say M here and read Documentation/modules.txt. This is recommended.
   The module will be called rtl8139.o.
 
+SiS 900 PCI Fast Ethernet Adapter support
+CONFIG_SIS900
+  This is a driver for the Silicon Integrated System Corporation 900
+  Fast Ethernet PCI network card. If you have one of those, say Y and
+  read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. This is recommended.
+  The module will be called sis900.o.
+
 Packet Engines Yellowfin Gigabit-NIC support
 CONFIG_YELLOWFIN
   Say Y here if you have a Packet Engines G-NIC PCI Gigabit Ethernet
   adapter. This adapter is used by the Beowulf Linux cluster project.
   See http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html for
   more information about this driver in particular and Beowulf in
-  general (to browse the WWW, you need to have access to a machine on
-  the Internet that has a program like lynx or netscape).
+  general.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -6039,16 +6289,19 @@ CONFIG_YELLOWFIN
 
 General Instruments Surfboard 1000
 CONFIG_NET_SB1000
-  This is a driver for the General Instrument SURFboard 1000 internal cable
-  modem.  This is an ISA card which is used by a number of cable TV companies
-  to provide cable modem access.  It's a one-way downstream-only cable modem,
-  meaning that your upstream net link is provided by your regular phone modem.
-
-  At present this driver only compiles as a module, so say M here if you
-  have this card.  Then read Documentation/networking/README.sb1000 for
-  information on how to use this module, as it needs special ppp scripts for
-  establishing a connection.  Further documentation and the necessary scripts
-  can be found at:
+  This is a driver for the General Instrument (also known as
+  NextLevel) SURFboard 1000 internal
+  cable modem. This is an ISA card which is used by a number of cable
+  TV companies to provide cable modem access. It's a one-way
+  downstream-only cable modem, meaning that your upstream net link is
+  provided by your regular phone modem.
+
+  At present this driver only compiles as a module, so say M here if
+  you have this card. The module will be called sb1000.o. Then read
+  Documentation/networking/README.sb1000 for information on how to use
+  this module, as it needs special ppp scripts for establishing a
+  connection. Further documentation and the necessary scripts can be
+  found at:
 
   http://www.jacksonville.net/~fventuri/
   http://home.adelphia.net/~siglercm/sb1000.html
@@ -6084,8 +6337,8 @@ CONFIG_ACENIC_OMIT_TIGON_I
 AMD LANCE and PCnet (AT1500 and NE2100) support
 CONFIG_LANCE
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Some LinkSys cards are
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Some LinkSys cards are
   of this type.
 
   If you want to compile this driver as a module ( = code which can be
@@ -6096,8 +6349,8 @@ CONFIG_LANCE
 3COM cards
 CONFIG_NET_VENDOR_3COM
   If you have a network (Ethernet) card belonging to this class, say Y
-  and read the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -6107,8 +6360,8 @@ CONFIG_NET_VENDOR_3COM
 3c501 support
 CONFIG_EL1
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Also, consider buying a
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Also, consider buying a
   new card, since the 3c501 is slow, broken, and obsolete: you will
   have problems. Some people suggest to ping ("man ping") a nearby
   machine every minute ("man cron") when using this card.
@@ -6122,8 +6375,8 @@ CONFIG_EL1
 3c503 support
 CONFIG_EL2
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6135,8 +6388,8 @@ CONFIG_EL2
 CONFIG_ELPLUS
   Information about this network (Ethernet) card can be found in
   Documentation/networking/3c505.txt. If you have a card of this type,
-  say Y and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  say Y and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -6147,8 +6400,8 @@ CONFIG_ELPLUS
 3c507 support
 CONFIG_EL16
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6159,8 +6412,8 @@ CONFIG_EL16
 3c523 support 
 CONFIG_ELMC
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6171,8 +6424,8 @@ CONFIG_ELMC
 3c527 support
 CONFIG_ELMC_II
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6184,8 +6437,7 @@ CONFIG_ELMC_II
 CONFIG_EL3
   If you have a network (Ethernet) card belonging to the 3Com
   EtherLinkIII series, say Y and read the Ethernet-HOWTO, available
-  via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  from http://metalab.unc.edu/mdw/linux.html#howto .
 
   If your card is not working you may need to use the DOS
   setup disk to disable Plug & Play mode, and to select the default
@@ -6201,10 +6453,10 @@ CONFIG_EL3
 CONFIG_VORTEX
   If you have a 3Com "Vortex" (Fast EtherLink 3c590/3c592/3c595/3c597)
   or "Boomerang" series (EtherLink XL 3c900 or 3c905) network
-  (Ethernet) card, say Y and read the Ethernet-HOWTO, available via
-  FTP (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
-  More specific information is in Documentation/networking/vortex.txt
-  and in the comments at the beginning of drivers/net/3c59x.c.
+  (Ethernet) card, say Y and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . More specific
+  information is in Documentation/networking/vortex.txt and in the
+  comments at the beginning of drivers/net/3c59x.c.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -6217,8 +6469,9 @@ CONFIG_NET_ISA
   bus system (that's the way the cards talks to the other components
   of your computer) is ISA (as opposed to EISA, VLB or PCI), say Y.
   Make sure you know the name of your card. Read the Ethernet-HOWTO,
-  available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. If unsure, say Y.
+  available from http://metalab.unc.edu/mdw/linux.html#howto . 
+
+  If unsure, say Y.
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -6236,9 +6489,8 @@ CONFIG_ARCNET
   support" below.
 
   You might also want to have a look at the Ethernet-HOWTO, available
-  via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO (even though ARCnet is
-  not really Ethernet).
+  from http://metalab.unc.edu/mdw/linux.html#howto (even though ARCnet
+  is not really Ethernet).
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6324,8 +6576,8 @@ CONFIG_ARCNET_COM20020
 Cabletron E21xx support
 CONFIG_E2100
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6337,8 +6589,8 @@ CS89x0 support
 CONFIG_CS89x0
   Support for CS89x0 chipset based Ethernet cards. If you have a
   network (Ethernet) card of this type, say Y and read the
-  Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO as well as
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto as well as
   Documentation/networking/cs89x0.txt.
 
   If you want to compile this as a module ( = code which can be
@@ -6350,8 +6602,8 @@ CONFIG_CS89x0
 DEPCA support
 CONFIG_DEPCA
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO as well as
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto as well as
   drivers/net/depca.c.
 
   If you want to compile this as a module ( = code which can be
@@ -6365,8 +6617,8 @@ CONFIG_EWRK3
   This driver supports the DE203, DE204 and DE205 network (Ethernet)
   cards. If this is for you, say Y and read
   Documentation/networking/ewrk3.txt in the kernel source as well as
-  the Ethernet-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -6377,14 +6629,20 @@ CONFIG_EWRK3
 SEEQ8005 support
 CONFIG_SEEQ8005
   This is a driver for the SEEQ 8005 network (Ethernet) card. If this
-  is for you, read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  is for you, read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt as well as
+  Documentation/networking/net-modules.txt. The module will be called
+  ewrk3.o.
 
 AT1700/1720 support
 CONFIG_AT1700
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6396,8 +6654,8 @@ CONFIG_AT1700
 FMV-181/182/183/184 support
 CONFIG_FMV18X
   If you have a Fujitsu FMV-181/182/183/184 network (Ethernet) card,
-  say Y and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  say Y and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you use an FMV-183 or FMV-184 and it is not working, you may need
   to disable Plug & Play mode of the card.
@@ -6412,8 +6670,8 @@ EtherExpress PRO support
 CONFIG_EEXPRESS_PRO
   If you have a network (Ethernet) card of this type, say Y. Note
   however that the EtherExpress PRO/100 Ethernet card has its own
-  separate driver. Please read the Ethernet-HOWTO, available via FTP
-  (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  separate driver. Please read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6424,8 +6682,8 @@ CONFIG_EEXPRESS_PRO
 EtherExpress support
 CONFIG_EEXPRESS
   If you have an EtherExpress16 network (Ethernet) card, say Y and
-  read the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that the Intel
+  read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Note that the Intel
   EtherExpress16 card used to be regarded as a very poor choice
   because the driver was very unreliable. We now have a new driver
   that should do better.
@@ -6439,8 +6697,8 @@ CONFIG_EEXPRESS
 HP PCLAN+ (27247B and 27252A) support
 CONFIG_HPLAN_PLUS
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6451,8 +6709,8 @@ CONFIG_HPLAN_PLUS
 HP PCLAN (27245 and other 27xxx series) support
 CONFIG_HPLAN
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6463,8 +6721,8 @@ CONFIG_HPLAN
 HP 10/100VG PCLAN (ISA, EISA, PCI) support
 CONFIG_HP100
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -6475,9 +6733,9 @@ CONFIG_HP100
 NE2000/NE1000 support
 CONFIG_NE2000
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Many Ethernet cards
-  without a specific driver are compatible with NE2000. 
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Many Ethernet cards
+  without a specific driver are compatible with NE2000.
 
   If you have a PCI NE2000 card however, say N here and Y to "PCI
   NE2000 support", above. If you have a NE2000 card and are running on
@@ -6494,14 +6752,14 @@ CONFIG_NE2000
 SK_G16 support
 CONFIG_SK_G16
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
 NE/2 (ne2000 MCA version) support
 CONFIG_NE2_MCA
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6511,24 +6769,24 @@ CONFIG_NE2_MCA
 
 SKnet MCA support
 CONFIG_SKMC
-  This are Micro Channel ethernet adapters.  You need to set CONFIG_MCA
-  to use this driver.  It's both available as an in-kernel driver and
-  as a module ( = code which can be inserted in and removed from the
-  running kernel whenever you want). If you want to compile it as a module,
-  say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt. If you plan to use more than
-  one network card under linux, read the Multiple-Ethernet-mini-HOWTO,
-  available from sunsite.unc.edu:/pub/Linux/docs/HOWTO/mini.  Supported
-  cards are the SKnet Junior MC2 and the SKnet MC2(+).  Distinguishing
-  both cards is done automatically.  Note that using multiple boards
-  of different type hasn't been tested with this driver.
+  These are Micro Channel ethernet adapters. You need to say Y to "MCA
+  support" in order to use this driver. Supported cards are the SKnet
+  Junior MC2 and the SKnet MC2(+). The driver automatically
+  distinguishes between the two cards. Note that using multiple boards
+  of different type hasn't been tested with this driver. Say Y if you
+  have one of these ethernet adapters.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called sk_mca.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt as well as
+  Documentation/networking/net-modules.txt.
 
 EISA, VLB, PCI and on board controllers
 CONFIG_NET_EISA
   This is another class of network cards which attach directly to the
   bus. If you have one of those, say Y and read the Ethernet-HOWTO,
-  available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -6539,8 +6797,8 @@ CONFIG_NET_EISA
 AMD PCnet32 (VLB and PCI) support
 CONFIG_PCNET32
   If you have a PCnet32 or PCnetPCI based network (Ethernet) card,
-  answer Y here and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  answer Y here and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6551,8 +6809,8 @@ CONFIG_PCNET32
 Ansel Communications EISA 3200 support
 CONFIG_AC3200
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6563,8 +6821,8 @@ CONFIG_AC3200
 Mylex EISA LNE390A/LNE390B support
 CONFIG_LNE390
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6575,8 +6833,8 @@ CONFIG_LNE390
 Novell/Eagle/Microdyne NE3210 EISA support
 CONFIG_NE3210
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Note that this driver
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Note that this driver
   will NOT WORK for NE3200 cards as they are completely different.
 
   This driver is also available as a module ( = code which can be
@@ -6588,8 +6846,8 @@ CONFIG_NE3210
 Apricot Xen-II on board Ethernet
 CONFIG_APRICOT
   If you have a network (Ethernet) controller of this type, say Y and
-  read the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -6602,8 +6860,8 @@ CONFIG_DE4X5
   This is support for the DIGITAL series of PCI/EISA Ethernet cards.
   These include the DE425, DE434, DE435, DE450 and DE500 models. If
   you have a network card of this type, say Y and read the
-  Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. More specific
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . More specific
   information is contained in Documentation/networking/de4x5.txt.
 
   This driver is also available as a module ( = code which can be
@@ -6620,10 +6878,9 @@ CONFIG_DEC_ELCP
   of this type. (If your card is NOT SMC EtherPower 10/100 PCI
   (smc9332dst), you can also try the driver for "Generic DECchip"
   cards, above. However, most people with a network card of this type
-  will say Y here.) Do read the Ethernet-HOWTO, available via FTP
-  (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
-  More specific information is contained in
-  Documentation/networking/tulip.txt.
+  will say Y here.) Do read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . More specific
+  information is contained in Documentation/networking/tulip.txt.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6636,8 +6893,8 @@ CONFIG_DGRS
   This is support for the Digi International RightSwitch series of
   PCI/EISA Ethernet switch cards. These include the SE-4 and the SE-6
   models. If you have a network card of this type, say Y and read the
-  Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. More specific
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . More specific
   information is contained in Documentation/networking/dgrs.txt.
 
   This driver is also available as a module ( = code which can be
@@ -6649,8 +6906,8 @@ CONFIG_DGRS
 EtherExpress PRO/100 support
 CONFIG_EEXPRESS_PRO100
   If you have an Intel EtherExpress PRO/100 PCI network (Ethernet)
-  card, say Y and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  card, say Y and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6661,8 +6918,8 @@ CONFIG_EEXPRESS_PRO100
 ICL EtherTeam 16i/32 support
 CONFIG_ETH16I
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6674,8 +6931,8 @@ TI ThunderLAN support (EXPERIMENTAL)
 CONFIG_TLAN
   If you have a PCI Ethernet network card based on the ThunderLAN chip
   which is supported by this driver, say Y and read the
-  Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Devices currently supported by this driver are Compaq Netelligent,
   Compaq NetFlex and Olicom cards. Please read the file
@@ -6703,8 +6960,8 @@ CONFIG_VIA_RHINE
 Racal-Interlan EISA ES3210 support
 CONFIG_ES3210
   If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6716,8 +6973,7 @@ SMC EtherPower II (EXPERIMENTAL)
 CONFIG_EPIC100
   If you have an SMC EtherPower II 9432 PCI Ethernet network card
   which is based on the SMC83c170, say Y and read the Ethernet-HOWTO,
-  available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6735,15 +6991,27 @@ CONFIG_ZNET
   The Zenith Z-Note notebook computer has a built-in network
   (Ethernet) card, and this is the Linux driver for it. Note that the
   IBM Thinkpad 300 is compatible with the Z-Note and is also supported
-  by this driver. Read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  by this driver. Read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
+
+Adaptec Starfire support
+CONFIG_ADAPTEC_STARFIRE
+  If you have an Ethernet network card like this, say Y and read the
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called starfire.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt as well as
+  Documentation/networking/net-modules.txt.
 
 Pocket and portable adapters
 CONFIG_NET_POCKET
   Cute little network (Ethernet) devices which attach to the parallel
   port ("pocket adapters"), commonly used with laptops. If you have
-  one of those, say Y and read the Ethernet-HOWTO, available via FTP
-  (user: anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  one of those, say Y and read the Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to plug a network (or some other) card into the PCMCIA
   (or PC-card) slot of your laptop instead (PCMCIA is the standard for
@@ -6752,9 +7020,7 @@ CONFIG_NET_POCKET
   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
-  WWW, you need to have access to a machine on the Internet that has a
-  program like lynx or netscape). 
+  http://www.cs.utexas.edu/users/kharker/linux-laptop/ .
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -6765,20 +7031,20 @@ AT-LAN-TEC/RealTek pocket adapter support
 CONFIG_ATP
   This is a network (Ethernet) device which attaches to your parallel
   port. Read drivers/net/atp.c as well as the Ethernet-HOWTO,
-  available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO if you want to use this.
-  If you intend to use this driver, you should have said N to the
-  Parallel Printer support, because the two drivers don't like each
-  other.
+  available from http://metalab.unc.edu/mdw/linux.html#howto , if you
+  want to use this. If you intend to use this driver, you should have
+  said N to the Parallel Printer support, because the two drivers
+  don't like each other.
 
 D-Link DE600 pocket adapter support
 CONFIG_DE600
   This is a network (Ethernet) device which attaches to your parallel
   port. Read Documentation/networking/DLINK.txt as well as the
-  Ethernet-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO if you want to use this.
-  It is possible to have several devices share a single parallel port
-  and it is safe to compile the corresponding drivers into the kernel.
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , if you want to use
+  this. It is possible to have several devices share a single parallel
+  port and it is safe to compile the corresponding drivers into the
+  kernel.
 
   If you want to compile this driver as a module however ( = code
   which can be inserted in and removed from the running kernel
@@ -6789,10 +7055,11 @@ D-Link DE620 pocket adapter support
 CONFIG_DE620
   This is a network (Ethernet) device which attaches to your parallel
   port. Read Documentation/networking/DLINK.txt as well as the
-  Ethernet-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO if you want to use this.
-  It is possible to have several devices share a single parallel port
-  and it is safe to compile the corresponding drivers into the kernel.
+  Ethernet-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , if you want to use
+  this. It is possible to have several devices share a single parallel
+  port and it is safe to compile the corresponding drivers into the
+  kernel.
 
   If you want to compile this driver as a module however ( = code
   which can be inserted in and removed from the running kernel
@@ -6807,16 +7074,14 @@ CONFIG_TR
   connected to such a Token Ring network and want to use your Token
   Ring card under Linux, say Y here and to the driver for your
   particular card below and read the Token-Ring mini-HOWTO, available
-  via FTP (user:anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Most people can say N
-  here.
+  from http://metalab.unc.edu/mdw/linux.html#howto . Most people can
+  say N here.
 
 IBM Tropic chipset based adapter support
 CONFIG_IBMTR
   This is support for all IBM Token Ring cards that don't use DMA. If
   you have such a beast, say Y and read the Token-Ring mini-HOWTO,
-  available via FTP (user:anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   Warning: this driver will almost definitely fail if more than one
   active Token Ring card is present. 
@@ -6832,16 +7097,16 @@ CONFIG_IBMOL
   Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
   Wake On Lan, and PCI 100/16/4 adapters.
 
-  If you have such an adapter, say Y and read the Token-Ring mini-HOWTO,
-  available via FTP (user:anonymous) from
-  ftp://metalab.unc/edu/pub/Linux/docs/HOWTO.
+  If you have such an adapter, say Y and read the Token-Ring
+  mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
-  The module will will be called olympic.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
+  The module will will be called olympic.o. If you want to compile it
+  as a module, say M here and read Documentation/modules.txt.
 
-  Also read the linux/Documentation/networking/olympic.txt or check the 
+  Also read the file Documentation/networking/olympic.txt or check the 
   Linux Token Ring Project site for the latest information at
   http://www.linuxtr.net
 
@@ -6852,21 +7117,28 @@ CONFIG_SKTR
   (SK-4590), SysKonnect TR4/16 PCI (SK-4591) adapters.
 
   If you have such an adapter and would like to use it, say Y or M and
-  read the Token-Ring mini-HOWTO, available via FTP (user: anonymous)
-  from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  read the Token-Ring mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Also read the file linux/Documentation/networking/sktr.txt or check
   the Linux-SNA WWW site for the latest information at
-  http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/
+  http://www.linux-sna.org .
 
 Traffic Shaper (EXPERIMENTAL)
 CONFIG_SHAPER
   The traffic shaper is a virtual network device that allows you to
-  limit the rate of outgoing data flow over some other network
-  device. See Documentation/networking/shaper.txt for more
-  information. To set up and configure shaper devices, you need the
-  shapecfg program, available via FTP (user: anonymous) from
-  ftp://shadow.cabi.net/pub/Linux in the shaper package. 
+  limit the rate of outgoing data flow over some other network device.
+  The traffic that you want to slow down can then be routed through
+  these virtual devices. See Documentation/networking/shaper.txt for
+  more information.
+
+  An alternative to this traffic shaper is the experimental
+  Class-Based Queueing (CBQ) scheduling support which you get if you
+  say Y to "QoS and/or fair queueing" above.
+
+  To set up and configure shaper devices, you need the shapecfg
+  program, available from ftp://shadow.cabi.net/pub/Linux in the
+  shaper package.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -6899,16 +7171,6 @@ 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.
@@ -6950,8 +7212,8 @@ CONFIG_ARM_AM79C961A
 Support CDROM drives that are not SCSI or IDE/ATAPI
 CONFIG_CD_NO_IDESCSI
   If you have a CDROM drive that is neither SCSI nor IDE/ATAPI, say Y
-  here, otherwise N. Read the CDROM-HOWTO, available via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  here, otherwise N. Read the CDROM-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -7009,9 +7271,6 @@ CONFIG_MCD
   (PhotoCDs). There is a new driver (next question) which can do
   this. If you want that one, say N here.
 
-  If the driver doesn't work out of the box, you might want to have a
-  look at drivers/cdrom/mcd.h. 
-
   If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
@@ -7215,22 +7474,253 @@ CONFIG_ISP16_CDI
   The module will be called isp16.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
-Quota support
-CONFIG_QUOTA
-  If you say Y here, you will be able to set per user limits for disk
-  usage (also called disk quotas). Currently, it works only for the
-  ext2 filesystem. You need additional software in order to use quota
-  support; for details, read the Quota mini-HOWTO, available via FTP
-  (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini. Probably the quota
-  support is only useful for multi user systems. If unsure, say N.
+Quota support
+CONFIG_QUOTA
+  If you say Y here, you will be able to set per user limits for disk
+  usage (also called disk quotas). Currently, it works only for the
+  ext2 filesystem. You need additional software in order to use quota
+  support; for details, read the Quota mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . Probably the quota
+  support is only useful for multi user systems. If unsure, say N.
+
+Support for USB (EXPERIMENTAL!)
+CONFIG_USB
+  Universal Serial Bus (USB) is a specification for a serial bus
+  system which offers higher speeds and more features than the
+  traditional PC serial port. The bus supplies power to peripherals
+  and allows for hot swapping. Up to 127 USB peripherals can be
+  connected to a single USB port in a tree structure; the USB port is
+  the root of the tree, the peripherals are the leafs and the inner
+  nodes are special USB devices called hubs. Many newer PC's have USB
+  ports and newer peripherals such as scanners, keyboards, mice,
+  modems and printers support the USB protocol and can be connected to
+  the PC via those ports.
+
+  Say Y here if your computer has a USB port and you want to
+  experiment with USB devices. You then need to say Y to at least one
+  of "UHCI support" or "OHCI support" below (the type of interface
+  that the USB hardware in your computer provides) and then choose
+  from among the drivers for USB peripherals.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usbcore.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+UHCI (intel PIIX4 and others) support?
+CONFIG_USB_UHCI
+  The Universal Host Controller Interface is a standard by Intel for
+  accessing the USB hardware in the PC (which is also called the USB
+  host controller). If your USB host controller conforms to this
+  standard, say Y. All recent boards with Intel PCI chipsets conform
+  to this standard. If unsure, say Y.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-uhci.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+  
+OHCI (compaq and some others) support?
+CONFIG_USB_OHCI
+  The Open Host Controller Interface is a standard by Compaq for
+  accessing the USB PC hardware (also called USB host controller). If
+  your USB host controller conforms to this standard, say Y. The USB
+  host controllers on most non-Intel architectures and on several x86
+  compatibles with non-Intel chipsets conform to this standard.
+
+  There are currently two OHCI drivers in development. You should
+  compile at most one. The other one is "OHCI-HCD (other OHCI opt.
+  Virt. Root Hub) support?", below.
+
+  You may want to read the file drivers/usb/README.ohci.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-ohci.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+Enable tons of OHCI debugging output
+CONFIG_USB_OHCI_DEBUG
+  Say Y here in order to have the OHCI code generate verbose debugging
+  output.
+
+OHCI-HCD (other OHCI opt. Virt. Root Hub) support?
+CONFIG_USB_OHCI_HCD
+  This is an alternative driver for USB PC hardware (also called USB
+  host controller) which complies with Compaq's Open Host Controller
+  Interface. You may want to read the file
+  drivers/usb/README.ohci_hcd.
+
+  There are currently two OHCI drivers in development. You should
+  compile at most one. The other one is "OHCI (compaq and some others)
+  support?", above.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-ohci-hcd.o. If you want to compile it
+  as a module, say M here and read Documentation/modules.txt.
+
+OHCI-HCD Virtual Root Hub
+CONFIG_USB_OHCI_VROOTHUB
+  The virtual root hub support is currently unstable, so you probably
+  want to say N unless you are a hacker. But you aren't a hacker since
+  you are reading help texts.
+
+Enable lots of ISOC debugging output
+CONFIG_USB_DEBUG_ISOC
+  Say Y here if you want to get lots of debugging output related to
+  the USB code.
+
+USB hub support
+CONFIG_USB_HUB
+  Say Y here if you want to connect several USB devices to a single
+  USB port. You will need an USB hub to do this.
+    
+  If unsure, say Y.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hub.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+USB mouse support
+CONFIG_USB_MOUSE
+  Say Y here if you want to connect a USB mouse to your computer's USB
+  port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mouse.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+USB HP scanner support
+CONFIG_USB_HP_SCANNER
+  Say Y here if you want to connect a USB HP scanner to your
+  computer's USB port. Please read drivers/usb/README.hp_scanner
+  for more information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hp_scanner.o. If you want to compile it as
+  a module, say M here and read Documentation/modules.txt.
+
+USB keyboard support
+CONFIG_USB_KBD
+  Say Y here if you want to connect a USB keyboard to your computer's
+  USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-keyboard.o. If you want to compile it
+  as a module, say M here and read Documentation/modules.txt.
+
+USB audio parsing support
+CONFIG_USB_AUDIO
+  Say Y here if you want to connect audio equipment such as USB
+  speakers to your computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called audio.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+USB Communications Device Class (ACM) support (Preliminary)
+CONFIG_USB_ACM
+  This driver allows for devices which support the Abstract Control
+  Model, including many USB-based modems, ISDN adapters, and network
+  adapters.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called acm.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+USB Printer support
+CONFIG_USB_PRINTER
+  Say Y here if you want to connect a printer to your computer's USB
+  port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called printer.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+USB CPiA Camera support
+CONFIG_USB_CPIA
+  Say Y here if you want to connect this type of camera to your
+  computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cpia.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+USB SCSI Support
+CONFIG_USB_SCSI
+  Say Y here if you want to connect SCSI devices to your computer's
+  USB port.
+
+USB SCSI verbose debug
+CONFIG_USB_SCSI_DEBUG
+  Say Y here in order to have the USB SCSI code generate verbose
+  debugging messages.
+
+#EZUSB Firmware downloader
+#CONFIG_USB_EZUSB
+
+USS720 parport driver
+CONFIG_USB_USS720
+  This driver is for USB parallel port adapters that use the Lucent
+  Technologies USS-720 chip. These adapters provide USB compatibility
+  to peripherals designed with parallel port interfaces.
+  
+  The chip has two modes: automatic mode and manual mode. In automatic
+  mode, it looks to the computer like a standard USB printer. Only
+  printers may be connected to the USS-720 in this mode. The generic
+  USB printer driver ("USB Printer support", above) may be used in
+  that mode, and you can say N here if you want to use the chip only
+  in this mode.
+
+  Manual mode is not limited to printers, any parallel port
+  device should work. This driver utilizes manual mode.
+  Note however that some operations are three orders of a magnitude
+  slower than on a PCI/ISA Parallel Port, so timing critical
+  applications might not work.
+
+  Say Y here if you own an USS-720 USB->Parport cable and intend to
+  connect anything other than a printer to it.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called uss720.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+  
+USB /proc filesystem entry support (Preliminary)
+CONFIG_USB_PROC
+  This reports USB drivers and devices in the /proc filesystem.
+  Entries are located in /proc/bus/usb. The entries are described in
+  the file Documentation/proc_usb_info.txt.
+
+  Note that you must say Y to "/proc filesystem support" below for
+  this to work.
 
-Acorn's ADFS filesystem support (read only) (EXPERIMENTAL)
-CONFIG_ADFS_FS
-  The Advanced Disk File System is the filesystem used on floppy and
-  hard disks by Acorn Systems.  Currently in development, as a read-
-  only driver for hard disks.  These should be the first partition
-  (eg. /dev/[sh]d?1) on each of your drives.  If unsure, say N.
+Generic ACPI support
+CONFIG_ACPI
+  Advanced Configuration and Power Interface (ACPI) is an interface
+  specification to support power management of peripherals. If your
+  system supports it, say Y here.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called acpi.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+  
+PIIX4 ACPI support
+CONFIG_PIIX4_ACPI
+  If you have a PIIX4 based motherboard (PCI ISA IDE Xcelerator
+  (PIIX4) is a multi-function PCI device) and you want support for
+  Advanced Configuration and Power Interface (ACPI) to support power
+  management of peripherals, say Y here.
 
 Minix fs support
 CONFIG_MINIX_FS
@@ -7269,10 +7759,9 @@ CONFIG_EXT2_FS
   filesystem support" below). Saying Y here will enlarge your kernel
   by about 44 kB.
 
-  The Ext2fs-Undeletion mini-HOWTO, available via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini,
-  gives information about how to retrieve deleted files on ext2fs
-  filesystems.
+  The Ext2fs-Undeletion mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , gives information about
+  how to retrieve deleted files on ext2fs filesystems.
 
   To change the behavior of ext2 filesystems, you can use the tune2fs
   utility ("man tune2fs"). To modify attributes of files and
@@ -7280,12 +7769,12 @@ CONFIG_EXT2_FS
   
   Ext2fs partitions can be read from within DOS using the ext2tool
   command line tool package (available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2) and from
+  ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2 ) and from
   within Windows NT using the ext2nt command line tool package from
-  ftp://metalab.unc.edu/pub/Linux/utils/dos. Explore2fs is a graphical
+  ftp://metalab.unc.edu/pub/Linux/utils/dos . Explore2fs is a graphical
   explorer for ext2fs partitions which runs on Windows 95 and Windows
   NT and includes experimental write support; it is available from
-  http://jnewbigin-pc.it.swin.edu.au/Linux/Explore2fs.htm.
+  http://jnewbigin-pc.it.swin.edu.au/Linux/Explore2fs.htm .
 
   If you want to compile this filesystem as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
@@ -7304,9 +7793,8 @@ CONFIG_ISO9660_FS
   If you have a CDROM drive and want to do more with it than just
   listen to audio CDs and watch its LEDs, say Y (and read
   Documentation/filesystems/isofs.txt and the CDROM-HOWTO, available
-  via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO), thereby enlarging your
-  kernel by about 27 kB; otherwise say N.
+  from http://metalab.unc.edu/mdw/linux.html#howto ), thereby
+  enlarging your kernel by about 27 kB; otherwise say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -7319,16 +7807,15 @@ CONFIG_JOLIET
   which allows for long filenames in unicode format (unicode is the
   new 16 bit character code, successor to ASCII, which encodes the
   characters of almost all languages of the world; see
-  http://www.unicode.org for more information; to browse the WWW, you
-  need to have access to a machine on the Internet that has a program
-  like lynx or netscape). Say Y here if you want to be able to read
-  Joliet CDROMs under Linux.
+  http://www.unicode.org for more information). Say Y here if you want
+  to be able to read Joliet CDROMs under Linux.
 
 UDF Filesystem support
 CONFIG_UDF_FS
-  This is the new filesystem used by some CDROMS and DVD drivers. 
-  Say Y if you intend to mount DVD discs or CDRWs written in packet mode,
-  or if written to by other UDF utilities, such as DirectCD.
+  This is the new filesystem used by some CDROMS and DVD drivers. Say
+  Y if you intend to mount DVD discs or CDRW's written in packet mode,
+  or if written to by other UDF utilities, such as DirectCD. Please
+  read Documentation/filesystems/udf.txt.
 
   This filesystem support is also available as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
@@ -7384,9 +7871,9 @@ CONFIG_MSDOS_FS
   This allows you to mount MSDOS partitions of your hard drive (unless
   they are compressed; to access compressed MSDOS partitions under
   Linux, you can either use the DOS emulator DOSEMU, described in the
-  DOSEMU-HOWTO, available via FTP (user: anonymous) at
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, or try dmsdosfs in
-  ftp://metalab.unc.edu/pub/Linux/system/filesystems/dosfs. If you
+  DOSEMU-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , or try dmsdosfs in
+  ftp://metalab.unc.edu/pub/Linux/system/filesystems/dosfs . If you
   intend to use dosemu with a non-compressed MSDOS partition, say Y
   here) and MSDOS floppies. This means that file access becomes
   transparent, i.e. the MSDOS files look and behave just like all
@@ -7468,11 +7955,8 @@ CONFIG_PROC_FS
   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").
+  Documentation/filesystems/proc.txt and on the proc(5) manpage ("man
+  5 proc").
 
   This option will enlarge your kernel by about 67 KB. Several
   programs depend on this, so everyone should say Y here.
@@ -7487,8 +7971,8 @@ CONFIG_NFS_FS
   client's hard disk. For this to work, the server must run the
   programs nfsd and mountd (but does not need to have NFS filesystem
   support enabled in its kernel). NFS is explained in the Network
-  Administrator's Guide, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/LDP, on its man page: "man
+  Administrator's Guide, available from
+  http://metalab.unc.edu/mdw/linux.html#guide , on its man page: "man
   nfs", and in the NFS-HOWTO.
   
   A superior but less widely used alternative to NFS is provided by
@@ -7538,8 +8022,8 @@ CONFIG_NFSD
   locations are given in the file Documentation/Changes in the NFS
   section.
 
-  Please read the NFS-HOWTO, available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  Please read the NFS-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   The NFS server is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -7550,26 +8034,16 @@ Emulate Sun NFS daemon
 CONFIG_NFSD_SUN
   If you would like for the server to allow clients to access
   directories that are mount points on the local filesystem (this is
-  how nfsd behaves on Sun systems), say yes here. If unsure, say N.
+  how nfsd behaves on Sun systems), say Y here. If unsure, say N.
 
-OS/2 HPFS filesystem support (read/write)
+OS/2 HPFS filesystem support (read only)
 CONFIG_HPFS_FS
   OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
   is the filesystem used for organizing files on OS/2 hard disk
-  partitions. Say Y if you want to be able to read and write files
-  on an OS/2 HPFS partition of your hard drive. OS/2 floppies however
-  are in regular MSDOS format, so you don't need this option in order
-  to be able to read them. Read Documentation/filesystems/hpfs.txt. 
-  
-  Write support is new and experimental. I don't think it's so
-  "experimental" that it corrupts disks. (but you know: "There's no
-  warranty") There are many checks and filesystem is remounted read-only
-  if any inconsistency found. I use it quite long time and it works.
-
-  This driver may not be able to write to HPFS386 disks on Warp server.
-  HPFS386 on Warp client seems to work ok. If some unknown HPFS386
-  structures are deteced, they are not destroyed and filesystem is
-  remounted read-only.
+  partitions. Say Y if you want to be able to read files from an OS/2
+  HPFS partition of your hard drive. OS/2 floppies however are in
+  regular MSDOS format, so you don't need this option in order to be
+  able to read them. Read Documentation/filesystems/hpfs.txt. 
 
   This filesystem is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -7612,7 +8086,7 @@ CONFIG_SYSV_FS
   Xenix, Wyse, UnixWare, Dell Unix and System V programs under Linux
   and is often needed to run commercial software that's only available
   for those systems. It's available via FTP (user: anonymous) from
-  ftp://tsx-11.mit.edu/pub/linux/BETA).
+  ftp://tsx-11.mit.edu/pub/linux/BETA ).
 
   If you only intend to mount files from some other Unix over the
   network using NFS, you don't need the System V filesystem support
@@ -7645,11 +8119,9 @@ CONFIG_AFFS_FS
   fs/affs/Changes. 
 
   With this driver you can also mount disk files used by Bernd
-  Schmidt's Un*X Amiga Emulator (http://www.freiburg.linux.de/~uae/;
-  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 want to
-  do this, you will also need to say Y or M to "Loop device support",
-  above.
+  Schmidt's Un*X Amiga Emulator (http://www.freiburg.linux.de/~uae/ ).
+  If you want to do this, you will also need to say Y or M to "Loop
+  device support", above.
 
   This filesystem is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -7709,7 +8181,7 @@ CONFIG_AUTOFS_FS
   automounter (amd), which is a pure user space daemon.
 
   To use the automounter you need the user-space tools from
-  ftp://ftp.kernel.org/pub/linux/daemons/autofs; you also want to
+  ftp://ftp.kernel.org/pub/linux/daemons/autofs ; you also want to
   answer Y to "NFS filesystem support", below.
 
   If you want to compile this as a module ( = code which can be
@@ -7720,6 +8192,26 @@ CONFIG_AUTOFS_FS
   If you are not a part of a fairly large, distributed network, you
   probably do not need an automounter, and can say N here.
 
+EFS filesystem support (experimental)
+CONFIG_EFS_FS
+  EFS is an older filesystem used for non-ISO9660 CDROMs and hard disk
+  partitions by SGI's IRIX operating system (IRIX 6.0 and newer uses
+  the XFS filesystem for hard disk partitions however).
+
+  This implementation only offers read-only access. If you don't know
+  what all this is about, it's safe to say N. For more information
+  about EFS see its home page at http://aeschi.ch.eu.org/efs/ .
+
+  If you want to compile the UFS filesystem support as a module ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read Documentation/modules.txt.
+  The module will be called efs.o. 
+
+SGI disklabel support
+CONFIG_SGI_DISKLABEL
+  Say Y to this only if you plan on mounting disks with SGI
+  disklabels. This is not required to mount EFS-format CDROMs.
+
 UFS filesystem support
 CONFIG_UFS_FS
   BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
@@ -7755,29 +8247,30 @@ CONFIG_UFS_FS_WRITE
   Say Y here if you want to try writing to UFS partitions. This is
   experimental, so you should back up your UFS partitions beforehand.
 
-EFS filesystem support (experimental)
-CONFIG_EFS_FS
-  EFS is the filesystem used for CDROMs and filesystems by SGI's IRIX.
-  This implementation only offers read-only access. If you don't know
-  what all this is about, it's safe to say N. For more information
-  about EFS see its homepage at http://aeschi.ch.eu.org/efs/.
+Advanced partition selection
+CONFIG_PARTITION_ADVANCED
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned under an operating system running on a different
+  architecture than your Linux system.
 
-SGI disklabel support
-CONFIG_SGI_DISKLABEL
-  Say Y to this only if you plan on mounting disks with SGI disklabels.
-  This is not required to mount EFS-format CDROMs.
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause this configure script to skip all
+  the questions about foreign partitioning schemes. If unsure, say N.
 
-EFS filesystem support (experimental)
-CONFIG_EFS_FS
-  EFS is the filesystem used for CDROMs and filesystems by SGI's IRIX.
-  This implementation only offers read-only access.  If you don't know
-  what all this is about, it's safe to say N.  For more information
-  about EFS see it's homepage at http://aeschi.ch.eu.org/efs.
+Alpha OSF partition support
+CONFIG_OSF_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned on an Alpha machine.
 
-SGI disklabel support
-CONFIG_SGI_DISKLABEL
-  Say Y to this only if you plan on mounting disks with SGI disklabels.
-  This is not required to mount EFS-format CDROMs.
+Macintosh partition map support
+CONFIG_MAC_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned on a Macintosh.
+
+PC BIOS (MSDOS partition tables) support
+CONFIG_MSDOS_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned on an x86 PC (not necessarily by DOS).
 
 BSD disklabel (FreeBSD partition tables) support
 CONFIG_BSD_DISKLABEL
@@ -7790,11 +8283,11 @@ CONFIG_BSD_DISKLABEL
   filesystem support", above. If you don't know what all this is
   about, say N.
 
-SMD disklabel (Sun partition tables) support
-CONFIG_SMD_DISKLABEL
+Sun partition tables support
+CONFIG_SUN_PARTITION
   Like most systems, SunOS uses its own hard disk partition table
   format, incompatible with all others. Saying Y here allows you to
-  read these partition tables and further mount SunOS disks from
+  read these partition tables and further mount SunOS partitions 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
@@ -7807,9 +8300,14 @@ 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
-  from within Linux if you have also said Y to "UFS filesystem
-  support", above.
+  to read these partition tables and further mount Solaris x86
+  partitions from within Linux if you have also said Y to "UFS
+  filesystem support", above.
+
+SGI partition support
+CONFIG_SGI_PARTITION
+  Say Y here if you would like to be able to read the hard disk
+  partition table format used by SGI machines.
 
 ADFS filesystem support (read only) (EXPERIMENTAL)
 CONFIG_ADFS_FS
@@ -7820,7 +8318,8 @@ CONFIG_ADFS_FS
   and from ADFS-formatted floppy discs.
 
   The ADFS partition should be the first partition (i.e.,
-  /dev/[hs]d?1) on each of your drives.
+  /dev/[hs]d?1) on each of your drives. Please read the file
+  Documentation/filesystems/adfs.txt for further details.
 
   This code is also available as a module called adfs.o ( = code which
   can be inserted in and removed from the running kernel whenever you
@@ -7863,12 +8362,6 @@ CONFIG_UNIXWARE_DISKLABEL
 
   If you don't know what all this is about, say N.
 
-Macintosh partition map support
-CONFIG_MAC_PARTITION
-  Say Y here if you want your Linux system to be able to read the
-  partition tables of Macintosh hard drives, and thus use partitions
-  on those drives.
-
 SMB filesystem support (to mount Windows shares etc...)
 CONFIG_SMB_FS
   SMB (Server Message Block) is the protocol Windows for Workgroups
@@ -7878,20 +8371,17 @@ CONFIG_SMB_FS
   access them just like any other Unix directory. Currently, this
   works only if the Windows machines use TCP/IP as the underlying
   transport protocol, and not NetBEUI. For details, read
-  Documentation/filesystems/smbfs.txt and the SMB-HOWTO, available via
-  FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  Documentation/filesystems/smbfs.txt and the SMB-HOWTO, available
+  from http://metalab.unc.edu/mdw/linux.html#howto .
 
   Note: if you just want your box to act as an SMB *server* and make
   files and printing services available to Windows clients (which need
   to have a TCP/IP stack), you don't need to say Y here; you can use
   the program samba (available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/system/network/samba) for that.
+  ftp://metalab.unc.edu/pub/Linux/system/network/samba ) for that.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html (to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape). 
+  Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
 
   If you want to compile the SMB support as a module ( = code which
   can be inserted in and removed from the running kernel whenever you
@@ -7912,9 +8402,7 @@ CONFIG_CODA_FS
   *client*. You will need user level code as well, both for the client
   and server. Servers are currently user level, i.e. need no kernel
   support. Please read Documentation/filesystems/coda.txt and check
-  out the Coda home page http://www.coda.cs.cmu.edu (to browse the
-  WWW, you need to have access to a machine on the Internet that has a
-  program like lynx or netscape).
+  out the Coda home page http://www.coda.cs.cmu.edu .
 
   If you want to compile the coda client support as a module ( = code
   which can be inserted in and removed from the running kernel
@@ -7929,15 +8417,13 @@ CONFIG_NCP_FS
   mount NetWare file server volumes and to access them just like any
   other Unix directory. For details, please read the file
   Documentation/filesystems/ncpfs.txt in the kernel source and the
-  IPX-HOWTO on ftp://metalab.unc.edu/pub/Linux/docs/howto.
+  IPX-HOWTO from http://metalab.unc.edu/mdw/linux.html#howto .
 
   You do not have to say Y here if you want your Linux box to act as a
   file *server* for Novell NetWare clients.
 
   General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at http://www.eats.com/linux_mac_win.html (to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape). 
+  Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -8300,7 +8786,7 @@ CONFIG_NLS_ISO8859_10
   letters that were missing in Latin 4 to cover the entire Nordic
   area.
 
-nls iso8859-14
+NLS ISO 8859-14 (Latin 8; Celtic)
 CONFIG_NLS_ISO8859_14
   If you want to display filenames with native language characters
   from the Microsoft fat filesystem family or from JOLIET CDROMs
@@ -8372,9 +8858,8 @@ CONFIG_VT_CONSOLE
   would use the third virtual terminal as system console. (Try "man
   bootparam" or see the documentation of your boot loader (lilo or
   loadlin) about how to pass options to the kernel at boot time. The
-  lilo procedure is also explained in the SCSI-HOWTO, available via
-  FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.)
+  lilo procedure is also explained in the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
 
   If unsure, say Y.
 
@@ -8416,9 +8901,9 @@ CONFIG_SERIAL
   BTW1: If you have a mouseman serial mouse which is not recognized by
   the X window system, try running gpm first. 
   
-  BTW2: If you intend to connect a so-called Winmodem to your
-  machine's serial port, forget it. These modems are crippled and
-  require proprietary drivers which are only available under Windows.
+  BTW2: If you intend to use a software modem (also called Winmodem)
+  under Linux, forget it. These modems are crippled and require
+  proprietary drivers which are only available under Windows.
 
   Most people will say Y or M here, so that they can use serial mice,
   modems and similar devices connecting to the standard serial ports.
@@ -8437,8 +8922,8 @@ CONFIG_SERIAL_CONSOLE
   "console=ttyS1". (Try "man bootparam" or see the documentation of
   your boot loader (lilo or loadlin) about how to pass options to the
   kernel at boot time. The lilo procedure is also explained in the
-  SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.) 
+  SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
 
   If you don't have a VGA card installed and you say Y here, the
   kernel will automatically use the first serial line, /dev/ttyS0, as
@@ -8501,6 +8986,21 @@ CONFIG_RISCOM8
   Also it's possible to say M here and compile this driver as kernel
   loadable module; the module will be called riscom8.o.
 
+Computone IntelliPort Plus serial support
+CONFIG_COMPUTONE
+  This driver supports the entire family of Intelliport II/Plus
+  controllers with the exception of the MicroChannel controllers. It
+  does not support products previous to the Intelliport II. These are
+  multiport cards, which give you many serial ports. You would need
+  something like this to connect more than two modems to your Linux
+  box, for instance in order to become a dial-in server. If you have a
+  card like that, say Y here and read Documentation/computone.txt.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. You will get two
+  modules called ip2.o and ip2main.o.
+
 Specialix IO8+ card support
 CONFIG_SPECIALIX
   This is a driver for the Specialix IO8+ multiport card (both the
@@ -8594,15 +9094,23 @@ CONFIG_SYNCLINK
 
 Synchronous HDLC line discipline support
 CONFIG_N_HDLC
-  Allows synchronous HDLC communications with
-  tty device drivers that support synchronous
-  HDLC such as the Microgate SyncLink adapter.
+  Allows synchronous HDLC communications with tty device drivers that
+  support synchronous HDLC such as the Microgate SyncLink adapter.
 
   This driver can only be built as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module will be called n_hdlc.o. If you want to do that, say M
   here.
 
+Specialix SX (and SI) card support
+CONFIG_SX
+  This is a driver for the SX and SI multiport serial cards.
+  Please read the file Documentation/sx.txt for details.
+
+  This driver can only be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sx.o. If you want to do that, say M here.
+
 Hayes ESP serial port support
 CONFIG_ESPSERIAL
   This is a driver which supports Hayes ESP serial ports. Both single
@@ -8665,25 +9173,24 @@ CONFIG_PRINTER
   If you intend to attach a printer to the parallel port of your Linux
   box (as opposed to using a serial printer; if the connector at the
   printer has 9 or 25 holes ["female"], then it's serial), say Y. Also
-  read the Printing-HOWTO, available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  read the Printing-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   It is possible to share one parallel port among several devices
   (e.g. printer and ZIP drive) and it is safe to compile the
   corresponding drivers into the kernel. If you want to compile this
   driver as a module however ( = code which can be inserted in and
   removed from the running kernel whenever you want), say M here and
-  read Documentation/modules.txt and Documentation/parport.txt. The
+  read Documentation/modules.txt and Documentation/parport.txt. The 
   module will be called lp.o. 
 
   If you have several parallel ports, you can specify which ports to
   use with the "lp" kernel command line option. (Try "man bootparam"
-  or see the documentation of your boot loader (lilo or loadlin)
-  about how to pass options to the kernel at boot time. The lilo
-  procedure is also explained in the SCSI-HOWTO, available via FTP
-  (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.)
-  The syntax of the "lp" command line option can be found in
-  drivers/char/lp.c.
+  or see the documentation of your boot loader (lilo or loadlin) about
+  how to pass options to the kernel at boot time. The lilo procedure
+  is also explained in the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .) The syntax of the "lp"
+  command line option can be found in drivers/char/lp.c.
 
   If you have more than 3 printers, you need to increase the LP_NO
   variable in lp.c.
@@ -8701,15 +9208,38 @@ CONFIG_LP_CONSOLE
 
   If unsure, say N.
 
-Mouse Support (not serial mice)
-CONFIG_MOUSE
-  This is for machines with a bus mouse or a PS/2 mouse as opposed to
-  a serial mouse. Most people have a regular serial MouseSystem or
+Bus Mouse Support
+CONFIG_BUSMOUSE
+  Say Y here if your machine has a bus mouse as opposed to a serial
+  mouse. Most people have a regular serial MouseSystem or
   Microsoft mouse (made by Logitech) that plugs into a COM port
   (rectangular with 9 or 25 pins). These people say N here. If you
-  have something else, read the Busmouse-HOWTO, available via FTP
-  (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO and
-  say Y here.
+  have something else, read the Busmouse-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto , and say Y here.
+
+  If you have a laptop, you either have to check the documentation or
+  experiment a bit to find out whether the trackball is a serial mouse
+  or not; it's best to say Y here for you. 
+
+  This is the generic bus mouse driver code. If you have a bus mouse,
+  you will have to say Y here and also to the specific driver for your
+  mouse below.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called busmouse.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+Mouse Support (not serial and bus mice)
+CONFIG_MOUSE
+  This is for machines with a mouse which is neither a serial nor a
+  bus mouse. Examples are PS/2 mice (such as the track balls on some
+  laptops) and some digitizer pads. Most people have a regular serial
+  MouseSystem or Microsoft mouse (made by Logitech) that plugs into a
+  COM port (rectangular with 9 or 25 pins). These people say N here.
+  If you have something else, read the Busmouse-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . This HOWTO contains
+  information about all non-serial mice, not just bus mice.
 
   If you have a laptop, you either have to check the documentation or
   experiment a bit to find out whether the trackball is a serial mouse
@@ -8720,13 +9250,12 @@ CONFIG_MOUSE
   the questions about non-serial mice. If unsure, say Y.
 
 Logitech busmouse support
-CONFIG_BUSMOUSE
+CONFIG_LOGIBUSMOUSE
   Logitech mouse connected to a proprietary interface card. It's
   generally a round connector with 9 pins. Note that the newer mice
   made by Logitech don't use the Logitech protocol anymore; for those,
-  you don't need this option. You want to read the Busmouse-HOWTO,
-  available via FTP (user: anonymous) in
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  you don't need this option. You want to read the Busmouse-HOWTO ,
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -8745,29 +9274,27 @@ CONFIG_PSMOUSE
   particular, the C&T 82C710 mouse on TI Travelmates is a PS/2 mouse.
 
   Although PS/2 mice are not technically bus mice, they are explained
-  in detail in the Busmouse-HOWTO, available via FTP (user: anonymous)
-  in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. 
+  in detail in the Busmouse-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   When using a PS/2 mouse, you can get problems if you want to use the
   mouse both on the Linux console and under X. Using the "-R" option
   of the Linux mouse managing program gpm (available from
-  ftp://metalab.unc.edu/pub/Linux/system/Daemons) solves this
-  problem, or you can get the "mconv" utility also from metalab.
+  ftp://metalab.unc.edu/pub/Linux/system/mouse ) solves this
+  problem, or you can get the "mconv2" utility from the same location.
 
 C&T 82C710 mouse port support (as on TI Travelmate)
 CONFIG_82C710_MOUSE
   This is a certain kind of PS/2 mouse used on the TI Travelmate. If
   you are unsure, try first to say N here and come back if the mouse
-  doesn't work. Read the Busmouse-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  doesn't work. Read the Busmouse-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
 PC110 digitizer pad support
 CONFIG_PC110_PAD
   This drives the digitizer pad on the IBM PC110 palmtop (see
-  http://toy.cabi.net; to browse the WWW, you need to have access to a
-  machine on the Internet that has a program like lynx or
-  netscape). It can turn the digitizer pad into a PS/2 mouse emulation
-  with tap gestures or into an absolute pad. 
+  http://toy.cabi.net ). It can turn the digitizer pad into a PS/2
+  mouse emulation with tap gestures or into an absolute pad.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -8778,8 +9305,8 @@ Microsoft busmouse support
 CONFIG_MS_BUSMOUSE
   These animals (also called Inport mice) are connected to an
   expansion board using a round connector with 9 pins. If this is what
-  you have, say Y and read the Busmouse-HOWTO, available via FTP
-  (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  you have, say Y and read the Busmouse-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you are unsure, say N and read the HOWTO nevertheless: it will
   tell you what you have. Also be aware that several vendors talk
@@ -8791,12 +9318,25 @@ CONFIG_MS_BUSMOUSE
   say M here and read Documentation/modules.txt. The module will be
   called msbusmouse.o. 
 
+Apple Desktop Bus mouse support
+CONFIG_ADBMOUSE
+  Say Y here if you have this type of bus mouse (4 pin connector) as
+  is common on Macintoshes. You may want to read the Busmouse-HOWTO,
+  available from http://metalab.unc.edu/mdw/linux.html#howto .
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called adbmouse.o.
+
 ATIXL busmouse support
 CONFIG_ATIXL_BUSMOUSE
   This is a rare type of busmouse that is connected to the back of an
-  ATI video card. Note that most ATI mice are actually Microsoft
-  busmice. Read the Busmouse-HOWTO, available via FTP (user:
-  anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO.
+  ATI video card. Say Y if you have one of those. Note however that
+  most mice by ATI are actually Microsoft busmice; you should say Y to
+  "Microsoft busmouse support" above if you have one of those. Read
+  the Busmouse-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -8806,11 +9346,6 @@ CONFIG_ATIXL_BUSMOUSE
   If you are unsure, say N and read the HOWTO nevertheless: it will
   tell you what you have.
 
-Support for PowerMac ADB mouse
-CONFIG_ADBMOUSE
-  If you have an ADB mouse (4 pin connector) as is common on
-  Macintoshes, say Y here.
-
 QIC-02 tape support
 CONFIG_QIC02_TAPE
   If you have a non-SCSI tape drive like that, say Y. Or, if you want
@@ -8860,13 +9395,12 @@ CONFIG_FTAPE
   Note that the Ftape-HOWTO is out of date (sorry) and documents the
   older version 2.08 of this software but still contains useful
   information. There is a web page with more recent documentation at
-  http://www-math.math.rwth-aachen.de/~LBFM/claus/ftape/ . This page
+  http://www.math1.rwth-aachen.de/~heine/ftape/ . This page
   always contains the latest release of the ftape driver and useful
   information (backup software, ftape related patches and
-  documentation, FAQ). (To browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or netscape.)
-  Note that the file system interface has changed quite a bit compared
-  to previous versions of ftape. Please read Documentation/ftape.txt.
+  documentation, FAQ). Note that the file system interface has changed
+  quite a bit compared to previous versions of ftape. Please read
+  Documentation/ftape.txt.
 
 The file system interface for ftape
 CONFIG_ZFTAPE
@@ -8897,8 +9431,7 @@ CONFIG_ZFTAPE
   most important changes in the file system interface compared to
   previous versions of ftape. The ftape home page
   http://www-math.math.rwth-aachen.de/~LBFM/claus/ftape/ contains
-  further information (to browse the WWW, you need to have access to a
-  machine on the Internet that has a program like lynx or netscape).
+  further information.
 
   IMPORTANT NOTE: zftape can read archives created by previous
   versions of ftape and provide file mark support (i.e. fast skipping
@@ -9120,6 +9653,17 @@ CONFIG_FT_FDC_MAX_RATE
   speed. If unsure, leave this disabled, i.e. leave it at 2000
   bits/sec.
 
+Direct Rendering Manager (XFree86 DRI support)
+CONFIG_DRM
+  Kernel-level support for the Direct Rendering Infrastructure (DRI)
+  introduced in XFree86 4.x. These modules provide support for
+  synchronization, security, and DMA transfers. Select the module that
+  provides support for your graphics card.
+
+3dlabs GMX 2000 Direct Rendering Driver (XFree86 DRI support)
+CONFIG_DRM_GAMMA
+  Choose M here if you have a 3dlabs GMX 2000 graphics card.
+
 MTRR control and configuration
 CONFIG_MTRR
   On Intel P6 family processors (Pentium Pro, Pentium II and later)
@@ -9136,11 +9680,13 @@ CONFIG_MTRR
 
   The Cyrix 6x86, 6x86MX and M II processors have Address Range
   Registers (ARRs) which provide a similar functionality to MTRRs. For
-  these, the ARRs are used to emulate the MTRRs.
+  these, the ARRs are used to emulate the MTRRs, which means that it
+  makes sense to say Y here for these processors as well.
 
   The AMD K6-2 (stepping 8 and above) and K6-3 processors have two
-  MTRRs. These are supported.
-  
+  MTRRs. The Centaur C6 (WinChip) has 8 MCRs, allowing
+  write-combining. All of these processors are supported by this code.
+
   The Centaur C6 (WinChip) has 8 MCRs, allowing write-combining. These
   are supported.
 
@@ -9161,13 +9707,13 @@ CONFIG_FT_ALPHA_CLOCK
 
 Zilog serial support
 CONFIG_SUN_ZS
-  If you are asked this question, something is wrong with config scripts.
-  Zilog serial driver is always enabled in sparc architecture.
+  This driver does not exist at this point, so you might as well 
+  say N.
 
 Double Talk PC internal speech card support
 CONFIG_DTLK
   This driver is for the DoubleTalk PC, a speech synthesizer
-  manufactured by RC Systems (http://www.rcsys.com/).  It is also
+  manufactured by RC Systems (http://www.rcsys.com/ ).  It is also
   called the `internal DoubleTalk'.  If you want to compile this as a
   module ( = code which can be inserted in and removed from the
   running kernel whenever you want), say M here and read
@@ -9175,7 +9721,7 @@ CONFIG_DTLK
 
 Siemens R3964 serial protocol support
 CONFIG_R3964
-  This driver allows syncronous communication with devices using the
+  This driver allows synchronous communication with devices using the
   Siemens R3964 packet protocol. Unless you are dealing with special
   hardware like PLCs, you are unlikely to need this.
 
@@ -9188,12 +9734,11 @@ CONFIG_R3964
 
 Applicom intelligent fieldbus card support
 CONFIG_APPLICOM
-  This driver provides the kernel-side support for the intelligent 
+  This driver provides the kernel-side support for the intelligent
   fieldbus cards made by Applicom International. More information
   about these cards can be found on the WWW at the address
-  http://www.applicom-int.com/ (to browse the WWW, you need to have
-  access to a machine on the Internet that has a program like lynx
-  or netscape), or by email from David Woodhouse <dwmw2@mvhi.com>.
+  http://www.applicom-int.com/ , or by email from David Woodhouse
+  <dwmw2@mvhi.com>.
 
   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
@@ -9212,8 +9757,8 @@ CONFIG_APM
   receive notification of APM "events" (e.g., battery status change).
 
   Supporting software is available; for more information, read the
-  Battery Powered Linux mini-HOWTO, available via FTP (user:
-  anonymous) from ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini.
+  Battery Powered Linux mini-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .
 
   This driver does not spin down disk drives (see the hdparm(8)
   manpage ("man 8 hdparm") for that), and it doesn't turn off
@@ -9228,9 +9773,7 @@ CONFIG_APM
 
   If you are running Linux on a laptop, you may also want to read the
   Linux Laptop home page on the WWW at
-  http://www.cs.utexas.edu/users/kharker/linux-laptop/ (to browse the
-  WWW, you need to have access to a machine on the Internet that has a
-  program like lynx or netscape). 
+  http://www.cs.utexas.edu/users/kharker/linux-laptop/ .
 
   Generally, if you don't have a battery in your machine, there isn't
   much point in using this driver and you should say N. If you get
@@ -9257,6 +9800,11 @@ CONFIG_APM
    11) exchange RAM chips 
    12) exchange the motherboard.
 
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt. The module will be called apm.o.
+
 Ignore USER SUSPEND
 CONFIG_APM_IGNORE_USER_SUSPEND
   This option will ignore USER SUSPEND requests. On machines with a
@@ -9307,11 +9855,10 @@ CONFIG_APM_POWER_OFF
   is halted. You will need software (e.g., a suitable version of the
   halt(8) command ("man 8 halt")) to cause the computer to power down.
   Recent versions of the sysvinit package available from
-  ftp://metalab.unc.edu/pub/Linux/system/daemons/init/ (user:
-  anonymous) contain support for this ("halt -p" shuts down Linux and
-  powers off the computer, if executed from runlevel 0). As with the
-  other APM options, this option may not work reliably with some APM
-  BIOS implementations.
+  ftp://metalab.unc.edu/pub/Linux/system/daemons/init/ contain support
+  for this ("halt -p" shuts down Linux and powers off the computer, if
+  executed from runlevel 0). As with the other APM options, this
+  option may not work reliably with some APM BIOS implementations.
 
 Ignore multiple suspend/standby events
 CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
@@ -9367,7 +9914,7 @@ CONFIG_WATCHDOG
 
   The watchdog is usually used together with the watchdog daemon 
   which is available via FTP (user: anonymous) from
-  ftp://tsx-11.mit.edu/pub/linux/sources/sbin/. This daemon can also
+  ftp://tsx-11.mit.edu/pub/linux/sources/sbin/ . This daemon can also
   monitor NFS connections and can reboot the machine when the process
   table is full.
 
@@ -9425,8 +9972,7 @@ CONFIG_PCWATCHDOG
   and if it does, it reboots your computer after a certain amount of
   time. This driver is like the WDT501 driver but for different
   hardware. Please read Documentation/pcwd-watchdog.txt. The PC
-  watchdog cards can be ordered from http://www.berkprod.com. Some
-  example rc.local files are available from ftp://ftp.bitgate.com. 
+  watchdog cards can be ordered from http://www.berkprod.com . 
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -9500,17 +10046,6 @@ CONFIG_NVRAM
   The module will be called nvram.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
-Atomwide Serial Support
-CONFIG_ATOMWIDE_SERIAL
-  If you have an Atomwide Serial card for an Acorn system, say Y to
-  this option.  The driver can handle 1, 2, or 3 port cards.
-  If unsure, say N
-
-The Serial Port Dual Serial Port
-CONFIG_DUALSP_SERIAL
-  If you have the Serial Port's dual serial card for an Acorn system,
-  say Y to this option.  If unsure, say N
-
 Joystick support
 CONFIG_JOYSTICK
   If you have a joystick, you can say Y here to enable generic
@@ -9616,32 +10151,37 @@ CONFIG_DUALSP_SERIAL
 
 NetWinder Button
 CONFIG_NWBUTTON
-  If you enable this driver and create a character device node
-  /dev/nwbutton with major and minor numbers 10 and 158 ("man mknod"),
-  then every time the orange button is pressed a number of times, the
-  number of times the button was pressed will be written to that device.
-  This is most useful for applications, as yet unwritten, which perform
-  actions based on how many times the button is pressed in a row.
-  Do not hold the button down for too long, as the driver does not alter
-  the behaviour of the hardware reset circuitry attached to the button;
-  it will still execute a hard reset if the button is held down for
-  longer than approximately five seconds.
+  If you say Y here and create a character device node /dev/nwbutton
+  with major and minor numbers 10 and 158 ("man mknod"), then every
+  time the orange button is pressed a number of times, the number of
+  times the button was pressed will be written to that device.
+
+  This is most useful for applications, as yet unwritten, which
+  perform actions based on how many times the button is pressed in a
+  row.
+
+  Do not hold the button down for too long, as the driver does not
+  alter the behaviour of the hardware reset circuitry attached to the
+  button; it will still execute a hard reset if the button is held
+  down for longer than approximately five seconds.
+
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   If you want to compile it as a module, say M here and read
   Documentation/modules.txt. The module will be called nwbutton.o.
+
   Most people will answer Y to this question and "Reboot Using Button"
   below to be able to initiate a system shutdown from the button.
 
 Reboot Using Button
 CONFIG_NWBUTTON_REBOOT
-  If you enable this option, then you will be able to initiate a system
+  If you say Y here, then you will be able to initiate a system
   shutdown and reboot by pressing the orange button a number of times.
-  The number of presses to initiate the shutdown is two by default, but
-  this can be altered by modifying the value of NUM_PRESSES_REBOOT in
-  nwbutton.h and recompiling the driver or, if you compile the driver as
-  a module, you can specify the number of presses at load time with
-  "insmod button reboot_count=<something>".
+  The number of presses to initiate the shutdown is two by default,
+  but this can be altered by modifying the value of NUM_PRESSES_REBOOT
+  in nwbutton.h and recompiling the driver or, if you compile the
+  driver as a module, you can specify the number of presses at load
+  time with "insmod button reboot_count=<something>".
 
 Sound card support
 CONFIG_SOUND
@@ -9650,29 +10190,27 @@ CONFIG_SOUND
   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. General
-  information about the modular sound system is contained in the files
+  You want to read the Sound-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto . General information
+  about the modular sound system is contained in the files
   Documentation/sound/Introduction. The file
   Documentation/sound/README.OSS contains some slightly outdated but
   still useful information as well.
 
   If you have a PnP sound card and you want to configure it at boot
   time using the ISA PnP tools (read
-  http://www.roestock.demon.co.uk/isapnptools/ (to browse the WWW, you
-  need to have access to a machine on the Internet that has a program
-  like lynx or netscape)), then you need to compile the sound card
-  support as a module ( = code which can be inserted in and removed
-  from the running kernel whenever you want) and load that module
-  after the PnP configuration is finished. To do this, say M here and
-  read Documentation/modules.txt as well as
+  http://www.roestock.demon.co.uk/isapnptools/ ), then you need to
+  compile the sound card support as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want)
+  and load that module after the PnP configuration is finished. To do
+  this, say M here and read Documentation/modules.txt as well as
   Documentation/sound/README.modules; the module will be called
   soundcore.o.
 
   I'm told that even without a sound card, you can make your computer
   say more than an occasional beep, by programming the PC speaker.
   Kernel patches and supporting utilities to do that are in the pcsp
-  package, available at http://www.imladris.demon.co.uk/pcsp/.
+  package, available at http://www.imladris.demon.co.uk/pcsp/ .
 
 OSS sound modules
 CONFIG_SOUND_OSS
@@ -9858,6 +10396,12 @@ CONFIG_SOUND_MSS
   have their own MSS support and saying Y to this option will cause a
   conflict.
 
+SGI Visual Workstation on-board audio
+CONFIG_SOUND_VWSND
+  Say Y or M if you have an SGI Visual Workstation and you want to
+  be able to use its on-board audio.  Read Documentation/sound/visws
+  for more info on this driver's capabilities.
+
 Ensoniq Soundscape support
 CONFIG_SOUND_SSCAPE
   Answer Y if you have a sound card based on the Ensoniq SoundScape
@@ -10058,8 +10602,8 @@ CONFIG_AWE32_SYNTH
   Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or
   similar sound card. See Documentation/sound/README.awe,
   Documentation/sound/AWE32 and the Soundblaster-AWE mini-HOWTO,
-  available via FTP (user: anonymous) from
-  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/mini for more info.
+  available from http://metalab.unc.edu/mdw/linux.html#howto for more
+  info.
 
 Gallant's Audio Excel DSP 16 support (SC-6000 and SC-6600)
 CONFIG_AEDSP16
@@ -10101,9 +10645,9 @@ CONFIG_AEDSP16_SB_IRQ
 
 Audio Excel DSP 16 DMA
 CONFIG_AEDSP16_SB_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'.
 
 Audio Excel DSP 16 (MSS emulation)
 CONFIG_AEDSP16_MSS
@@ -10157,12 +10701,6 @@ CONFIG_AEDSP16_MPU_IRQ
   you compiled aedsp16.o as a module you can specify this parameter as
   'mpu_irq=NN'.
 
-SGI Visual Workstation on-board audio
-CONFIG_SOUND_VWSND
-  Say Y or M if you have an SGI Visual Workstation and you want to
-  be able to use its on-board audio.  Read Documentation/sound/visws
-  for more info on this driver's capabilities.
-
 Ensoniq ES1370 based PCI sound cards
 CONFIG_SOUND_ES1370
   Say Y or M if you have a PCI sound card utilizing the Ensoniq
@@ -10174,10 +10712,6 @@ CONFIG_SOUND_ES1370
   This driver differs slightly from OSS/Free, so PLEASE READ
   Documentation/sound/es1370.
 
-Joystick support at boot time
-CONFIG_SOUND_ES1370_JOYPORT_BOOT
-  Say Y here to use the joystick port of your sound card.
-
 Ensoniq ES1371 based PCI sound cards
 CONFIG_SOUND_ES1371
   Say Y or M if you have a PCI sound card utilizing the Ensoniq
@@ -10188,19 +10722,6 @@ 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 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 sound card.
-
 ESS Solo1 based PCI sound cards (eg. SC1938)
 CONFIG_SOUND_ESSSOLO1
   Say Y or M if you have a PCI sound card utilizing the ESS Technology
@@ -10263,9 +10784,7 @@ CONFIG_ISDN
   conversations while downloading stuff. It only works if your
   computer is equipped with an ISDN card and both you and your service
   provider purchased an ISDN line from the phone company. For details,
-  read http://alumni.caltech.edu/~dank/isdn/ on the WWW. (To browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape.)
+  read http://alumni.caltech.edu/~dank/isdn/ on the WWW.
 
   This driver allows you to use an ISDN-card for networking
   connections and as dialin/out device. The isdn-tty's have a built in
@@ -10325,15 +10844,18 @@ ISDN diversion services support
 CONFIG_ISDN_DIVERSION
   This option allows you to use some supplementary diversion
   services in conjunction with the HiSax driver on an EURO/DSS1
-  line. Supported options are CD (call deflection), CFU (Call 
-  forward unconditional), CFB (Call forward when busy) and CFNR 
-  (call forward not reachable).
-  Additionally the actual CFU, CFB and CFNR state may be 
-  interrogated. The use of CFU, CFB, CFNR and interrogation may
-  be limited to some countries. The keypad protocol is still not
-  implemented.
-  CD should work in all countries if this service has been sub-
-  scribed.
+  line. 
+
+  Supported options are CD (call deflection), CFU (Call forward
+  unconditional), CFB (Call forward when busy) and CFNR (call forward
+  not reachable). Additionally the actual CFU, CFB and CFNR state may
+  be interrogated.
+
+  The use of CFU, CFB, CFNR and interrogation may be limited to some
+  countries. The keypad protocol is still not implemented. CD should
+  work in all countries if the service has been subscribed to.
+
+  Please read the file Documentation/isdn/README.diversion.
 
 ICN 2B and 4B support
 CONFIG_ISDN_DRV_ICN
@@ -10557,32 +11079,30 @@ CONFIG_ISDN_DRV_SC
   can be inserted in and removed from the running kernel whenever you
   want, details in Documentation/modules.txt); the module will be
   called sc.o. See Documentation/isdn/README.sc and
-  http://www.spellcast.com for more information (to browse the WWW,
-  you need to have access to a machine on the Internet that has a
-  program like lynx or netscape).
+  http://www.spellcast.com for more information.
 
 Eicon.Diehl active card support
 CONFIG_ISDN_DRV_EICON
   Say Y here if you have an Eicon active ISDN card. In order to use
   this card, additional firmware is necessary, which has to be loaded
-  into the card using the eiconctrl utility which is part of the latest
-  isdn4k-utils package. Please read the file
+  into the card using the eiconctrl utility which is part of the
+  latest isdn4k-utils package. Please read the file
   Documentation/isdn/README.eicon for more information.
   
 Eicon old-type card support
 CONFIG_ISDN_DRV_EICON_ISA
-  Say Y here if you have an old-type Eicon active ISDN card. In order to
-  use this card, additional firmware is necessary, which has to be loaded
-  into the card using the eiconctrl utility which is part of the latest
-  isdn4k-utils package. Please read the file
+  Say Y here if you have an old-type Eicon active ISDN card. In order
+  to use this card, additional firmware is necessary, which has to be
+  loaded into the card using the eiconctrl utility which is part of
+  the latest isdn4k-utils package. Please read the file
   Documentation/isdn/README.eicon for more information.
 
 Support AT-Fax Class 2 commands
 CONFIG_ISDN_TTY_FAX
   If you say Y here, the modem-emulator will support a subset of the
   Fax Class 2 commands. Using a getty with fax-support
-  (mgetty+sendfax, hylafax), you will be able to use your Linux box 
-  as an ISDN-fax-machine. This must be supported by the lowlevel driver
+  (mgetty+sendfax, hylafax), you will be able to use your Linux box as
+  an ISDN-fax-machine. This must be supported by the lowlevel driver
   also. See Documentation/isdn/README.fax for more information.
 
 AVM-B1 with CAPI2.0 support
@@ -10590,12 +11110,10 @@ CONFIG_ISDN_DRV_AVMB1
   This enables support for the AVM B1 ISDN networking cards. In
   addition, a CAPI (Common ISDN Application Programming Interface, a
   standard making it easy for programs to access ISDN hardware, see
-  http://www.capi.org/; to browse the WWW, you need to have access to
-  a machine on the Internet that has a program like lynx or netscape)
-  interface for this card is provided. In order to use this card,
-  additional firmware is necessary, which has to be downloaded into
-  the card using a utility which is distributed separately. Please
-  read the file Documentation/isdn/README.avmb1. 
+  http://www.capi.org/ ) interface for this card is provided. In order
+  to use this card, additional firmware is necessary, which has to be
+  downloaded into the card using a utility which is distributed
+  separately. Please read the file Documentation/isdn/README.avmb1.
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -10620,9 +11138,8 @@ Support for AP1000 multicomputer
 CONFIG_AP1000
   This enables support for a SPARC based parallel multi-computer
   called AP1000+. For details on our efforts to port Linux to this
-  machine see http://cap.anu.edu.au/cap/projects/linux (to browse the
-  WWW, you need to have access to a machine on the Internet that has a
-  program like lynx or netscape) or mail to hackers@cafe.anu.edu.au
+  machine see http://cap.anu.edu.au/cap/projects/linux or mail to
+  hackers@cafe.anu.edu.au
 
 Support for Sun4 architecture
 CONFIG_SUN4
@@ -10648,12 +11165,11 @@ CONFIG_SUN_OPENPROMIO
 Mostek real time clock support
 CONFIG_SUN_MOSTEK_RTC
   The Mostek RTC chip is used on all knows Sun computers except
-  some JavaStation-s. For a JavaStation you need to say Y both here
-  and to CONFIG_RTC.
+  some JavaStations. For a JavaStation you need to say Y both here
+  and to "Enhanced Real Time Clock Support".
 
   Say Y here unless you are building a special purpose kernel.
 
-#
 #Siemens SAB82532 serial support
 #CONFIG_SAB82532
 ###
@@ -10700,13 +11216,13 @@ CONFIG_HP300
 
 Sun 3 support
 CONFIG_SUN3
-  This option enables support for the Sun 3 series of workstations.
-  Be warned that this support is very experimental. You will also
-  want to say Y to 68020 support and N to the other processors below.
-  Currently, it is not possible to build a kernel with support for
-  the Sun 3 and and something else, so make sure you have said N to
-  all the other machines. This option does not support the sun3x series
-  of machines (the Sun 3/80 and 3/460). If you don't want to compile a
+  This option enables support for the Sun 3 series of workstations. Be
+  warned that this support is very experimental. You will also want to
+  say Y to 68020 support and N to the other processors below.
+  Currently, it is not possible to build a kernel with support for the
+  Sun 3 and something else, so make sure you have said N to all the
+  other machines. This option does not support the sun3x series of
+  machines (the Sun 3/80 and 3/460). If you don't want to compile a
   kernel for a Sun 3, say N.
 
 68020 support
@@ -10793,9 +11309,10 @@ CONFIG_ZORRO
   Note that even if you say N here, you can still use your expansion
   cards. If in doubt, say Y.
 
+Amiga 1200/600 PCMCIA support
 CONFIG_AMIGA_PCMCIA
-  Include support in the kernel for pcmcia on Amiga 1200 and Amiga 600.
-  If you intend to use pcmcia cards say Y; otherwise say N.
+  Include support in the kernel for pcmcia on Amiga 1200 and Amiga
+  600. If you intend to use pcmcia cards say Y; otherwise say N.
 
 Amiga GSP (TMS340x0) support
 CONFIG_AMIGA_GSP
@@ -11177,14 +11694,6 @@ CONFIG_DIO
   HP300 machines. If you are using such a system you almost certainly
   want this.
 
-MSDOS partition support
-CONFIG_MSDOS_PARTITION
-  This option enables support for using hard disks that were
-  partitioned on an MS-DOS system. This may be useful if you are
-  sharing a hard disk between i386 and m68k Linux boxes, for example.
-  Say Y if you need this feature; users who are only using their
-  system-native partitioning scheme can say N here.
-
 Processor Type
 CONFIG_6xx
   There are two types of PowerPC chips supported. The more common
@@ -11267,7 +11776,7 @@ CONFIG_VIDEO_DEV
   Support for audio/video capture and overlay devices and FM radio
   cards. The exact capabilities of each device vary. User tools for
   this are available from
-  ftp://ftp.uk.linux.org/pub/linux/video4linux.
+  ftp://ftp.uk.linux.org/pub/linux/video4linux .
 
   If you are interested in writing a driver for such an audio/video
   device or user software interacting with such a driver, please read
@@ -11278,17 +11787,6 @@ CONFIG_VIDEO_DEV
   whenever you want). If you want to compile it as a module, say M
   here and read Documentation/modules.txt.
 
-Direct Rendering Manager (XFree86 DRI support)
-CONFIG_DRM
-  Kernel-level support for the Direct Rendering Infrastructure (DRI)
-  introduced in XFree86 4.x.  These modules provide support for
-  synchronization, security, and DMA transfers.  Select the module that
-  provides support for your graphics card.
-
-3dlabs GMX 2000 Direct Rendering Driver (XFree86 DRI support)
-CONFIG_DRM_GAMMA
-  Choose M here if you have a 3dlabs GMX 2000 graphics card.
-
 AIMSlab RadioTrack (aka RadioReveal) support
 CONFIG_RADIO_RTRACK
   Choose Y here if you have one of these FM radio cards, and then fill
@@ -11298,13 +11796,16 @@ CONFIG_RADIO_RTRACK
   and are not supported by this driver. For these cards, use the
   RadioTrack II driver below.
 
+  If you have a GemTeks combined (PnP) sound- and radio card you must
+  use this driver as a module and setup the card with isapnptools. You
+  must also pass the module a suitable io parameter, 0x248 has been
+  reported to be used by these cards.
+
   In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
+  that are compatible with the Video for Linux API. Information on
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape. More information is contained in the
-  file Documentation/video4linux/radiotrack.txt.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml . More information
+  is contained in the file Documentation/video4linux/radiotrack.txt.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11321,17 +11822,10 @@ CONFIG_RADIO_RTRACK2
   Choose Y here if you have this FM radio card, and then fill in the 
   port address below.
 
-  If you have GemTeks combined (PnP) sound- and radio card you must use
-  this driver as a module and setup the card with isapnptools. You must
-  also pass the module a suitable io parameter, 0x248 has been reported
-  to be used by these cards.
-
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11351,9 +11845,7 @@ CONFIG_RADIO_AZTECH
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11366,6 +11858,28 @@ CONFIG_RADIO_AZTECH_PORT
   haven't changed the setting of jumper JP3 on the card. Removing the
   jumper sets the card to 0x358.
 
+ADS Cadet AM/FM Radio Tuner Card
+CONFIG_RADIO_CADET
+  Choose Y here if you have one of these AM/FM radio cards, and then
+  fill in the port address below.
+  
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API. Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
+
+  Further documentation on this driver can be found on the WWW at
+  http://linux.blackhawke.net/cadet.html . 
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called radio-cadet.o.
+
+ADS Cadet AM/FM Radio Tuner Card I/O Port
+CONFIG_RADIO_CADET_PORT
+  Enter the I/O address of the card here (most commonly 330). 
+
 SF16FMI Radio
 CONFIG_RADIO_SF16FMI
   Choose Y here if you have one of these FM radio cards, and then fill
@@ -11374,9 +11888,7 @@ CONFIG_RADIO_SF16FMI
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11395,9 +11907,7 @@ CONFIG_RADIO_TYPHOON
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11433,9 +11943,7 @@ CONFIG_RADIO_ZOLTRIX
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11446,21 +11954,16 @@ ZOLTRIX I/O port (0x20c or 0x30c)
 CONFIG_RADIO_ZOLTRIX_PORT
   Enter the I/O port of your Zoltrix radio card.
 
-ADS Cadet AM/FM Tuner
-CONFIG_RADIO_CADET
-  Say Y here if this is your AM/FM radio card.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API. Information on 
-  this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+IIC on parallel port
+CONFIG_I2C_PARPORT
+  I2C is a simple serial bus system used in many micro controller
+  applications. Saying Y here will allow you to use your parallel port
+  as an I2C interface.
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
   say M here and read Documentation/modules.txt. The module will be
-  called radio-cadet.o
+  called i2c-parport.o.
 
 Miro PCM20 Radio
 CONFIG_RADIO_MIROPCM20
@@ -11471,9 +11974,7 @@ CONFIG_RADIO_MIROPCM20
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11488,9 +11989,7 @@ CONFIG_RADIO_GEMTEK
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on 
   this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml .
 
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -11516,11 +12015,11 @@ CONFIG_RADIO_TERRATEC
   Choose Y here if you have this FM radio card, and then fill in the
   port address below. (TODO)
 
-  Note: This driver is in its early stages. Right now volume and frequency
-  control and muting works at least for me, but unfortunately i have not
-  found anybody who wants to use this card with linux. So if it is this
-  what YOU are trying to do right now, PLEASE DROP ME A NOTE!!
-  Rolf Offermanns (rolf@offermanns.de)
+  Note: This driver is in its early stages. Right now volume and
+  frequency control and muting works at least for me, but
+  unfortunately i have not found anybody who wants to use this card
+  with linux. So if it is this what YOU are trying to do right now,
+  PLEASE DROP ME A NOTE!! Rolf Offermanns (rolf@offermanns.de)
   
   In order to control your radio card, you will need to use programs
   that are compatible with the Video for Linux API. Information on
@@ -11529,12 +12028,16 @@ CONFIG_RADIO_TERRATEC
   you need to have access to a machine on the Internet that has a
   program like lynx or netscape.
 
-
   If you want to compile this driver as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
   say M here and read Documentation/modules.txt. The module will be
   called radio-terratec.o.
-  
+
+# Zoran ZR36057/36060 support
+# CONFIG_VIDEO_ZORAN
+
+# Include support for Iomega Buz
+# CONFIG_VIDEO_BUZ
 
 BT848 Video For Linux
 CONFIG_VIDEO_BT848
@@ -11586,10 +12089,10 @@ Compaq SMART2 support
 CONFIG_BLK_CPQ_DA
    This is the driver for Compaq Smart Array controllers.  
    Everyone using these boards should say Y here.  
-   See "linux/Documentation/cpqarray.txt" for the current list of 
+   See the file Documentation/cpqarray.txt for the current list of 
    boards supported by this driver, and for further information 
    on the use of this driver. 
+
 #
 # ARM options
 #
@@ -11615,24 +12118,36 @@ CONFIG_CATS
 
 Include support for Intel EBSA285
 CONFIG_ARCH_EBSA285
-  Say Y here if you intend to run this kernel on an EBSA-285 evaluation
   board.
 
 Include support for the NetWinder
 CONFIG_ARCH_NETWINDER
   Say Y here if you intend to run this kernel on the NetWinder.
 
+Maximum Physical Memory
+CONFIG_1GB
+  Linux can use up to 2 Gigabytes (= 2^31 bytes) of physical memory.
+  If you are compiling a kernel which will never run on a machine with
+  more than 1 Gigabyte, answer "1GB" here. Otherwise, say "2GB".
+
+  The actual amount of physical memory should be specified using a
+  kernel command line option such as "mem=256M". (Try "man bootparam"
+  or see the documentation of your boot loader (lilo or loadlin) about
+  how to pass options to the kernel at boot time. The lilo procedure
+  is also explained in the SCSI-HOWTO, available from
+  http://metalab.unc.edu/mdw/linux.html#howto .)
+
 Math emulation
 CONFIG_NWFPE
-  Say Y to include the NWFPE floating point emulator in the kernel. This
-  is necessary to run most binaries. Linux does not currently support
-  floating point hardware so you need to say Y here even if your machine
-  has an FPA or floating point co-processor podule.
+  Say Y to include the NWFPE floating point emulator in the kernel.
+  This is necessary to run most binaries. Linux does not currently
+  support floating point hardware so you need to say Y here even if
+  your machine has an FPA or floating point co-processor podule.
 
   It is also possible to say M to build the emulator as a module
   (nwfpe.o) or indeed to leave it out altogether. However, unless you
-  know what you are doing this can easily render your machine unbootable.
-  Saying Y is the safe option.
+  know what you are doing this can easily render your machine
+  unbootable. Saying Y is the safe option.
 
   You may say N here if you are going to load the Acorn FPEmulator
   early in the bootup.
@@ -11656,6 +12171,12 @@ CONFIG_DEBUG_ERRORS
   you are concerned with the code size or don't want to see these
   messages.
 
+Build Tools Selection
+CONFIG_BINUTILS_NEW
+  Say Y here if and only if you're using GCC 2.8.1/EGCS with a
+  binutils version >= 2.8.1 to compile the kernel (check with "gcc
+  --version" and "ld -v").
+
 Compile kernel with frame pointer
 CONFIG_FRAME_POINTER
   If you say Y here, the resulting kernel will be slightly larger and
@@ -11664,10 +12185,10 @@ CONFIG_FRAME_POINTER
 
 User fault debugging
 CONFIG_DEBUG_USER
-  When a user program crashes due to an exception, the kernel can print
-  a brief message explaining what the problem was. This is sometimes
-  helpful for debugging but serves no purpose on a production system.
-  Most people should say N here.
+  When a user program crashes due to an exception, the kernel can
+  print a brief message explaining what the problem was. This is
+  sometimes helpful for debugging but serves no purpose on a
+  production system. Most people should say N here.
 
 Include gdb debugging information in kernel binary
 CONFIG_DEBUG_INFO
@@ -11675,25 +12196,27 @@ CONFIG_DEBUG_INFO
   `vmlinux' binary image. This is handy if you want to use gdb or
   addr2line to debug the kernel. It has no impact on the in-memory
   footprint of the running kernel but it can increase the amount of
-  time and disk space needed for compilation. If in doubt say N.
+  time and disk space needed for compilation of the kernel. If in
+  doubt say N.
 
 Split initialisation functions into discardable section
 CONFIG_TEXT_SECTIONS
-  Normally code that is only used during initialisation is collected
-  into a special area of the kernel so that it can be discarded and
-  the memory reclaimed when initialisation is complete. In addition,
-  if the kernel you wish to build is able to run on multiple
-  architectures, it allows the unused code to be discarded. Some
-  versions of binutils, however, have a bug that causes the kernel
-  to crash during startup when this option is enabled. Say Y unless
-  you experience problems that you suspect may be caused by this.
+  If you say Y here, kernel code that is only used during
+  initialisation is collected into a special area of the kernel so
+  that it can be discarded and the memory reclaimed when
+  initialisation is complete. In addition, if the kernel you wish to
+  build is able to run on multiple architectures, it allows the unused
+  code to be discarded. Some versions of binutils, however, have a bug
+  that causes the kernel to crash during startup when this option is
+  enabled. Say Y unless you experience problems that you suspect may
+  be caused by this.
 
 Disable pgtable cache
 CONFIG_NO_PGT_CACHE
-  Normally the kernel maintains a `quicklist' of preallocated pagetable
-  structures in order to increase performance. On machines with very
-  few pages this may however be a loss. Say Y here to disable the pgtable
-  cache.
+  Normally the kernel maintains a `quicklist' of preallocated
+  pagetable structures in order to increase performance. On machines
+  with very few pages this may however be a loss. Say Y here to
+  disable the pgtable cache.
 
 RISC OS personality
 CONFIG_ARTHUR
@@ -11709,16 +12232,17 @@ CONFIG_CMDLINE
   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)
+  memory size and the root device (e.g., mem=64M root=/dev/nfs)
 
 Hardware alignment trap
 CONFIG_ALIGNMENT_TRAP
-  ARM processors can not fetch/store information which is not naturally
-  aligned on the bus, ie, a 4 byte fetch must start at an address divisable
-  by 4.  On 32-bit ARM processors, these instructions can be emulated in
-  software with a severe performance impact. This is necessary for correct
-  operation of some network protocols.  With an IP-only configuration
-  it is safe to say N, otherwise say Y.
+  ARM processors can not fetch/store information which is not
+  naturally aligned on the bus, i.e., a 4 byte fetch must start at an
+  address divisible by 4. On 32-bit ARM processors, these non-aligned
+  fetch/store instructions will be emulated in software if you say
+  here, which has a severe performance impact. This is necessary for
+  correct operation of some network protocols. With an IP-only
+  configuration it is safe to say N, otherwise say Y.
 
 21285 serial port support
 CONFIG_SERIAL_21285
@@ -11729,32 +12253,32 @@ CONFIG_SERIAL_21285
 Console on 21285 serial port
 CONFIG_SERIAL_21285_CONSOLE
   If you have enabled the serial port on the 21285 footbridge you can
-  make it the console by answering 'Y' to this option.
+  make it the console by answering Y to this option.
 
 Footbridge Mode
 CONFIG_HOST_FOOTBRIDGE
   The 21285 Footbridge chip can operate in either `host mode' or
   `add-in' mode.  Say Y if your 21285 is in host mode, and therefore
-  is the configuration master, otherwise say N.  This must not be
-  set to 'Y' if the card is used in 'add-in' mode.
+  is the configuration master, otherwise say N. This must not be
+  set to Y if the card is used in 'add-in' mode.
 
-MFM harddisk support
+MFM hard disk support
 CONFIG_BLK_DEV_MFM
   Support the MFM hard drives on the Acorn Archimedes both
   on-board the A4x0 motherboards and via the Acorn MFM podules.
-  Drives upto 64MB are supported. If you haven't got one of these
-  machines or drives just say 'N'.
+  Drives up to 64MB are supported. If you haven't got one of these
+  machines or drives just say N.
 
 Old Archimedes floppy (1772) support
 CONFIG_BLK_DEV_FD1772
   Support the floppy drive on the Acorn Archimedes (A300, A4x0, A540,
   R140 and R260) series of computers; it supports only 720K floppies
   at the moment. If you don't have one of these machines just answer
-  'N'.
+  N.
 
 Autodetect hard drive geometry
 CONFIG_BLK_DEV_MFM_AUTODETECT
-  If you answer 'Y' the MFM code will attempt to automatically detect
+  If you answer Y, the MFM code will attempt to automatically detect
   the cylinders/heads/sectors count on your hard drive. WARNING: This
   sometimes doesn't work and it also does some dodgy stuff which
   potentially might damage your drive.
@@ -11769,12 +12293,10 @@ CONFIG_IRDA
   some user-space utilities like the irmanager and probably irattach
   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.
+  IR-HOWTO, available at http://metalab.unc.edu/mdw/linux.html#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 
+  it as a module, say M here and read Documentation/modules.txt.
 
 IrDA Cache last LSAP
 CONFIG_IRDA_CACHE_LAST_LSAP
@@ -11878,6 +12400,17 @@ CONFIG_IRPORT_SIR
 
   If unsure, say Y.
 
+SiS5513 chipset support
+CONFIG_BLK_DEV_SIS5513
+  This driver ensures (U)DMA support for SIS5513 chipset based
+  mainboards. SiS620/530 UDMA mode 4, SiS5600/5597 UDMA mode 2, all
+  other DMA mode 2 limited chipsets are unsupported to date.
+
+  If you say Y here, you need to say Y to "Use DMA by default when
+  available" as well.
+
+  Please read the comments at the top of drivers/block/sis5513.c
 Winbond W83977AF IrDA Device Driver
 CONFIG_WINBOND_FIR
   Say Y here if you want to build IrDA support for the Winbond
@@ -11945,15 +12478,6 @@ CONFIG_GIRBIL_DONGLE
   by IrTTY. To activate support for Greenwich dongles you will have to
   insert "irattach -d girbil" in the /etc/irda/drivers script.
 
-Adaptec Airport 1000 and 2000 dongle
-CONFIG_AIRPORT_DONGLE
-  Say Y here if you want to build support for the Adaptec Airport 1000
-  and 2000 dongles. If you want to compile it as a module, say M here
-  and read Documentation/modules.txt. The Airport dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY. To activate support for Airport dongles you will have
-  to insert "irattach -d airport" in the /etc/irda/drivers script.
-
 Parallax Litelink dongle
 CONFIG_LITELINK_DONGLE
   Say Y here if you want to build support for the Parallax Litelink
@@ -11963,6 +12487,16 @@ CONFIG_LITELINK_DONGLE
   by IrTTY. To activate support for Parallax dongles you will have to
   insert "irattach -d litelink" in the /etc/irda/drivers script.
 
+Adaptec Airport 1000 and 2000 dongle
+CONFIG_AIRPORT_DONGLE
+  Say Y here if you want to build support for the Adaptec Airport 1000
+  and 2000 dongles. If you want to compile it as a module, say M here
+  and read Documentation/modules.txt. The module will be called
+  airport.o. The Airport dongle attaches to the normal 9-pin serial
+  port connector, and can currently only be used by IrTTY. To activate
+  support for Airport dongles you will have to insert "irattach -d
+  airport" in the /etc/irda/drivers script.
+
 VME (Motorola and BVM) support
 CONFIG_VME
   Say Y here if you want to build a kernel for a 680x0 based VME
@@ -12041,104 +12575,10 @@ CONFIG_BVME6000_SCC
   boards from BVM Ltd.  Everyone using one of these boards should say
   Y here.
 
-Universal Serial Bus (USB) Support (Experimental)
-CONFIG_USB
-  This will enable support for the Universal Serial Bus (USB).  USB 
-  allows you to connect up to 127 external devices such as keyboards, 
-  mice, printers and modems to your computer through a USB connector.
-  This code can also be built as a module (i.e. code outside the 
-  kernel that can be added and removed at runtime), consult 
-  Documentation/modules.txt for more information.
-
-UHCI (intel PIIX4 and others) support
-CONFIG_USB_UHCI
-  The UHCI is the USB host controller for many computers, and is built
-  into all recent boards with intel PCI chipsets. This driver is
-  needed for these motherboards to support USB.
-
-OHCI (compaq and some others) support
-CONFIG_USB_OHCI
-  The OHCI (Open Host Controller Interface) is the USB host controller
-  on most non-Intel architectures, several USB-adding PCI cards, and
-  is on several x86 compatibles with non-Intel chipsets. This driver
-  is needed for these motherboards to support USB. There is presently
-  two OHCI drivers in development. Say 'N' here if you would like to
-  compile the other OHCI driver into the linux kernel.
-
-OHCI-HCD (other OHCI opt. Virt. Root Hub) support
-CONFIG_USB_OHCI_HCD
-  The OHCI (Open Host Controller Interface) is the USB host controller
-  on most non-Intel architectures, several USB-adding PCI cards, and
-  is on several x86 compatibles with non-Intel chipsets. This driver
-  is needed for these motherboards to support USB. There is presently
-  two OHCI drivers in development. 
-
-USB hub support
-CONFIG_USB_HUB
-  To expand beyond the USB ports on the computer, a device called a 
-  hub is used. This driver supports hubs, allowing them to be used. 
-  Say 'Y'.
-
-USB mouse support
-CONFIG_USB_MOUSE  
-  This driver allows mice to work under the USB stack. It currently
-  patches into /dev/ps2aux, although it does not require the ps2 
-  mouse code to be included in the kernel as well.
-
-USB keyboard support
-CONFIG_USB_KBD
-  This driver allows USB keyboards to work under the USB stack.
-
-USB audio parsing support (Preliminary)
-CONFIG_USB_AUDIO
-  This driver will eventually handle audio devices, such 
-  as USB speakers.
-
-USB Communications Device Class (ACM) support (Preliminary)
-CONFIG_USB_ACM
-  This driver handles devices which support the Abstract Control Model,
-  a subtype of the USB Communications Device Class. This includes many
-  USB-based modems and ISDN adapters. Add special files with:
-  mknod /dev/ttyACM0 c 166 0 
-  mknod /dev/ttyACM1 c 166 1
-  mknod /dev/ttyACM2 c 166 2
-  mknod /dev/ttyACM3 c 166 3
-
-USB Printer Device Class support (Preliminary)
-CONFIG_USB_PRINTER
-  This is a generic driver for USB printers.
-
-USS720 parport driver
-CONFIG_USB_USS720
-  This driver is for USB parallel port adapters that use the 
-  Lucent Technologies USS-720 chip.
-  
-  The chip has two modes: automatic mode and manual mode.
-  In automatic mode, it looks like a standard USB printer. Only
-  Printers may be connected to the USS-720 in this mode.
-  The generic USB printer driver (CONFIG_USB_PRINTER, above)
-  may be used in that mode.
-
-  Manual mode is not limited to printers, any parallel port
-  device should work. This driver utilizes manual mode.
-  Note however that some operations are three orders of a magnitude
-  slower than on a PCI/ISA Parallel Port, so timing critical
-  applications might not work.
-
-  Say Y or M if you own an USS-720 USB->Parport cable and
-  intend to connect anything other than a printer to it. 
-
-USB /proc filesystem entry support (Preliminary)
-CONFIG_USB_PROC
-  This reports USB drivers and devices in the /proc filesystem.
-  Entries are located in /proc/bus/usb.
-  Note that you must enable support for the proc filesystem
-  for this to work.
-
 Support for user-space parallel port device drivers
 CONFIG_PPDEV
   Saying Y to this adds support for /dev/parport device nodes.  This
-  is needed for programs that want low-level access to the parallel
+  is needed for programs that want portable access to the parallel
   port, for instance deviceid (which displays Plug-and-Play device
   IDs) and vlp (which makes a Linux computer act as though it's a
   printer).
@@ -12147,10 +12587,16 @@ CONFIG_PPDEV
   It is safe to say N to this -- it is not needed for normal printing
   or parallel port CD-ROM/disk support.
 
+  This support is also available as a module. If you want to compile
+  it as a module, say M here and read Documentation/modules.txt. The
+  module will be called ppdev.o.
+
+  If unsure, say N.
+
 Kernel httpd acceleration (experimental)
 CONFIG_KHTTPD
   The kernel httpd acceleration daemon (kHTTPd) is a (limited) 
-  webserver build into the kernel. It is limited since it can only
+  web server build into the kernel. It is limited since it can only
   serve files from the filesystem. Saying "M" here builds the
   kHTTPd module; this is NOT enough to have a working kHTTPd. 
   For safety reasons, the module has to be activated by doing a
@@ -12161,7 +12607,6 @@ CONFIG_KHTTPD
   The kHTTPd is experimental. Be careful when using it on a production
   machine. Also note that kHTTPd doesn't support virtual servers yet.
 
-
 #
 # A couple of things I keep forgetting:
 #   capitalize: AppleTalk, Ethernet, DOS, DMA, FAT, FTP, Internet, 
@@ -12302,7 +12747,7 @@ CONFIG_KHTTPD
 # LocalWords:  KERNNAME kname ktype kernelname Kerneltype KERNTYPE Alt RX mdafb
 # LocalWords:  dataless kerneltype SYSNAME Comtrol Rocketport palmtop fbset EGS
 # LocalWords:  nvram SYSRQ SysRq PrintScreen sysrq NVRAMs NvRAM Shortwave RTTY
-# LocalWords:  hayes TX TMOUT
+# LocalWords:  Sitor Amtor Pactor GTOR hayes TX TMOUT JFdocs BIGMEM DAC IRQ's
 # LocalWords:  IDEPCI IDEDMA idedma PDC pdc TRM trm raidtools luthien nuclecu
 # LocalWords:  unam mx miguel koobera uic EMUL solaris pp ieee lpsg co DMAs TOS
 # LocalWords:  BLDCONFIG preloading jumperless BOOTINIT modutils multipath GRE
@@ -12388,5 +12833,40 @@ CONFIG_KHTTPD
 # 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
-
+# LocalWords:  IrLPT UIRCC Tecra Strebel jstrebel suse Eichwalder ke INI INIA
+# LocalWords:  FCP qlogicfc sym isapnp DTLK DoubleTalk rcsys dtlk DMAP SGIVW ar
+# LocalWords:  dmabuf EcoRadio MUTEFREQ GIrBIL girbil tepkom vol mha diplom PQS
+# LocalWords:  bmac Microgate SyncLink synclink hdlc excl ioaddr Tane tanep TCQ
+# LocalWords:  PDS SMALLDOS charsets bigfoot kernelfr mcs cls fw rsvp SKnet sk
+# LocalWords:  SKMC USB UHCI OHCI intel compaq usb ohci HCD Virt Compaq's hcd
+# LocalWords:  VROOTHUB KBD ARRs MCRs NWBUTTON nwbutton NUM WaveArtist APNE cpu
+# LocalWords:  apne blackhawke PlanB lu mlan planb NWFPE FPA nwfpe unbootable
+# LocalWords:  FPEmulator ds vmlinux initialisation discardable pgtable PGT mdw
+# LocalWords:  quicklist pagetable arthur StrongARM podule podules Autodetect
+# LocalWords:  dodgy IrPORT irport Litelink litelink SuSE rtfm internet hda CY
+# LocalWords:  multmode DriveReady SeekComplete DriveStatusError miscompile AEC
+# LocalWords:  mainboard's Digital's alim FastTrak aec PIIXn piix Gayle Eyetech
+# LocalWords:  Catweasel IDEDOUBLER Powerbook Centris ICSIDE RapIDE OSM HDM IOP
+# LocalWords:  HDM's OSM's lan FibreChannel ECP autoprobe itg lbl ipmasq cjb IC
+# LocalWords:  bieringer Caulfield's dreamtime decnet SIOCFIGCONF SIOCGIFCONF
+# LocalWords:  rtnetlink Endnode Aironet Arlan Telxon ylenurme arlan ACB aeschi
+# LocalWords:  Sealevel sealevel Cyclom br wanconfig tarball conectiva cycsyn
+# LocalWords:  devel bazar cyclomx NetGear GA IBMOL Lanstreamer uhci eu efs CYZ
+# LocalWords:  olympic linuxtr usbcore acm EZUSB downloader EFS XFS INTR op IIC
+# LocalWords:  heine soundcore JavaStations JavaStation GemTeks TerraTec TODO
+# LocalWords:  ActiveRadio Standalone terratec Rolf Offermanns rolf offermanns
+# LocalWords:  Zoran ZR Buz LML CPQ DA cpqarray PPDEV deviceid vlp ppdev atyfb
+# LocalWords:  AcceleRAID eXtremeRAID NETFILTER Netfilter masqueraded netfilter
+# LocalWords:  kernelnotes Cardbus PCMCIA's CardBus clgenfb Permedia YAM MMAP
+# LocalWords:  mmapped ATM atm PVCs SVCs InARP ATMARP neighbour neighbours MPOA
+# LocalWords:  VCs ENI FPGA Tonga MMF MF UTP printks ZeitNet ZN ZATM uPD SAR PN
+# LocalWords:  approx NICStAR NICs ForeRunnerLE Madge Collage ATMizer Dxxxx VCI
+# LocalWords:  ServeRAID IPS ips ipslinux gzip BSDCOMP LZW RAYCS Interphase app
+# LocalWords:  Tachyon IPHASE Surfboard NextLevel SURFboard jacksonville Tigon
+# LocalWords:  fventuri adelphia siglercm linuxpower AceNICs Starfire starfire
+# LocalWords:  ISOC CPiA cpia uss ACPI UDF DirectCD udf CDRW's OSF Manx acpi
+# LocalWords:  Unixware cymru Computone IntelliPort Intelliport computone SI sx
+# LocalWords:  adbmouse DRI DRM dlabs GMX PLCs Applicom fieldbus applicom int
+# LocalWords:  VWSND eg ESSSOLO CFU CFNR scribed eiconctrl eicon hylafax KFPU
+# LocalWords:  EXTRAPREC fpu mainboards KHTTPD kHTTPd khttpd Xcelerator
+# LocalWords:  LOGIBUSMOUSE
index 136034f6f8c9006dbad62a39d2f36e9b30c17cb6..8e9c288326e3383638acafbc5c41455d62446ca9 100644 (file)
@@ -59,29 +59,30 @@ comment 'General setup'
 
 bool 'BIGMEM support' CONFIG_BIGMEM
 bool 'Networking support' CONFIG_NET
-bool 'PCI support' CONFIG_PCI
-if [ "$CONFIG_PCI" = "y" ]; then
-  choice 'PCI access mode' \
-       "BIOS           CONFIG_PCI_GOBIOS       \
-        Direct         CONFIG_PCI_GODIRECT     \
-        Any            CONFIG_PCI_GOANY"       Any
-  if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
-    define_bool CONFIG_PCI_BIOS y
-  fi
-  if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
-    define_bool CONFIG_PCI_DIRECT y
-  fi
-fi
-bool 'MCA support' CONFIG_MCA
 bool 'SGI Visual Workstation support' CONFIG_VISWS
 if [ "$CONFIG_VISWS" = "y" ]; then
   define_bool CONFIG_X86_VISWS_APIC y
   define_bool CONFIG_X86_LOCAL_APIC y
+  define_bool CONFIG_PCI y
 else
   if [ "$CONFIG_SMP" = "y" ]; then
     define_bool CONFIG_X86_IO_APIC y
     define_bool CONFIG_X86_LOCAL_APIC y
   fi
+  bool 'PCI support' CONFIG_PCI
+  if [ "$CONFIG_PCI" = "y" ]; then
+    choice 'PCI access mode' \
+       "BIOS           CONFIG_PCI_GOBIOS       \
+        Direct         CONFIG_PCI_GODIRECT     \
+        Any            CONFIG_PCI_GOANY"       Any
+    if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
+      define_bool CONFIG_PCI_BIOS y
+    fi
+    if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
+      define_bool CONFIG_PCI_DIRECT y
+    fi
+  fi
+  bool 'MCA support' CONFIG_MCA
 fi
 
 source drivers/pcmcia/Config.in
index e4cad464f5c760fac888b4412e3ccd7a5d40b047..29afabd7abbf4d7238f8fed137c1161377818927 100644 (file)
@@ -19,7 +19,12 @@ OX_OBJS  := i386_ksyms.o
 MX_OBJS  :=
 
 ifdef CONFIG_PCI
-O_OBJS += bios32.o
+O_OBJS += pci-i386.o
+ifdef CONFIG_VISWS
+O_OBJS += pci-visws.o
+else
+O_OBJS += pci-pc.o
+endif
 endif
 
 ifdef CONFIG_MCA
diff --git a/arch/i386/kernel/bios32.c b/arch/i386/kernel/bios32.c
deleted file mode 100644 (file)
index 770e859..0000000
+++ /dev/null
@@ -1,1545 +0,0 @@
-/*
- * bios32.c - Low-Level PCI Access
- *
- * $Id: bios32.c,v 1.48 1998/09/26 08:06:55 mj Exp $
- *
- * Copyright 1993, 1994 Drew Eckhardt
- *      Visionary Computing
- *      (Unix and Linux consulting and custom programming)
- *      Drew@Colorado.EDU
- *      +1 (303) 786-7975
- *
- * Drew's work was sponsored by:
- *     iX Multiuser Multitasking Magazine
- *     Hannover, Germany
- *     hm@ix.de
- *
- * Copyright 1997--1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
- *
- * For more information, please consult the following manuals (look at
- * http://www.pcisig.com/ for how to get them):
- *
- * PCI BIOS Specification
- * PCI Local Bus Specification
- * PCI to PCI Bridge Specification
- * PCI System Design Guide
- *
- *
- * CHANGELOG :
- * Jun 17, 1994 : Modified to accommodate the broken pre-PCI BIOS SPECIFICATION
- *     Revision 2.0 present on <thys@dennis.ee.up.ac.za>'s ASUS mainboard.
- *
- * Jan 5,  1995 : Modified to probe PCI hardware at boot time by Frederic
- *     Potter, potter@cao-vlsi.ibp.fr
- *
- * Jan 10, 1995 : Modified to store the information about configured pci
- *      devices into a list, which can be accessed via /proc/pci by
- *      Curtis Varner, cvarner@cs.ucr.edu
- *
- * Jan 12, 1995 : CPU-PCI bridge optimization support by Frederic Potter.
- *     Alpha version. Intel & UMC chipset support only.
- *
- * Apr 16, 1995 : Source merge with the DEC Alpha PCI support. Most of the code
- *     moved to drivers/pci/pci.c.
- *
- * Dec 7, 1996  : Added support for direct configuration access of boards
- *      with Intel compatible access schemes (tsbogend@alpha.franken.de)
- *
- * Feb 3, 1997  : Set internal functions to static, save/restore flags
- *     avoid dead locks reading broken PCI BIOS, werner@suse.de 
- *
- * Apr 26, 1997 : Fixed case when there is BIOS32, but not PCI BIOS
- *     (mj@atrey.karlin.mff.cuni.cz)
- *
- * May 7,  1997 : Added some missing cli()'s. [mj]
- * 
- * Jun 20, 1997 : Corrected problems in "conf1" type accesses.
- *      (paubert@iram.es)
- *
- * Aug 2,  1997 : Split to PCI BIOS handling and direct PCI access parts
- *     and cleaned it up...     Martin Mares <mj@atrey.karlin.mff.cuni.cz>
- *
- * Feb 6,  1998 : No longer using BIOS to find devices and device classes. [mj]
- *
- * May 1,  1998 : Support for peer host bridges. [mj]
- *
- * Jun 19, 1998 : Changed to use spinlocks, so that PCI configuration space
- *     can be accessed from interrupts even on SMP systems. [mj]
- *
- * August  1998 : Better support for peer host bridges and more paranoid
- *     checks for direct hardware access. Ugh, this file starts to look as
- *     a large gallery of common hardware bug workarounds (watch the comments)
- *     -- the PCI specs themselves are sane, but most implementors should be
- *     hit hard with \hammer scaled \magstep5. [mj]
- *
- * Jan 23, 1999 : More improvements to peer host bridge logic. i450NX fixup. [mj]
- *
- * Feb 8,  1999 : Added UM8886BF I/O address fixup. [mj]
- *
- * August  1999 : New resource management and configuration access stuff. [mj]
- *
- * Sep 19, 1999 : Use PCI IRQ routing tables for detection of peer host bridges.
- *               Based on ideas by Chris Frantz and David Hinds. [mj]
- */
-
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/malloc.h>
-#include <linux/smp_lock.h>
-#include <linux/irq.h>
-#include <linux/spinlock.h>
-#include <linux/mm.h>
-
-#include <asm/page.h>
-#include <asm/segment.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-
-#undef DEBUG
-
-#ifdef DEBUG
-#define DBG(x...) printk(x)
-#else
-#define DBG(x...)
-#endif
-
-#define PCI_PROBE_BIOS 1
-#define PCI_PROBE_CONF1 2
-#define PCI_PROBE_CONF2 4
-#define PCI_NO_SORT 0x100
-#define PCI_BIOS_SORT 0x200
-#define PCI_NO_CHECKS 0x400
-#define PCI_NO_PEER_FIXUP 0x800
-#define PCI_ASSIGN_ROMS 0x1000
-#define PCI_NO_IRQ_SCAN 0x2000
-
-static unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2;
-
-/*
- * IRQ routing table provided by the BIOS
- */
-
-struct irq_info {
-       u8 bus, devfn;                  /* Bus, device and function */
-       struct {
-               u8 link;                /* IRQ line ID, chipset dependent, 0=not routed */
-               u16 bitmap;             /* Available IRQs */
-       } __attribute__((packed)) irq[4];
-       u8 slot;                        /* Slot number, 0=onboard */
-       u8 rfu;
-} __attribute__((packed));
-
-struct irq_routing_table {
-       u32 signature;                  /* PIRQ_SIGNATURE should be here */
-       u16 version;                    /* PIRQ_VERSION */
-       u16 size;                       /* Table size in bytes */
-       u8 rtr_bus, rtr_devfn;          /* Where the interrupt router lies */
-       u16 exclusive_irqs;             /* IRQs devoted exclusively to PCI usage */
-       u16 rtr_vendor, rtr_device;     /* Vendor and device ID of interrupt router */
-       u32 miniport_data;              /* Crap */
-       u8 rfu[11];
-       u8 checksum;                    /* Modulo 256 checksum must give zero */
-       struct irq_info slots[0];
-} __attribute__((packed));
-
-/*
- * Direct access to PCI hardware...
- */
-
-#ifdef CONFIG_PCI_DIRECT
-
-/*
- * Functions for accessing PCI configuration space with type 1 accesses
- */
-
-#define CONFIG_CMD(dev, where)   (0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) | (where & ~3))
-
-static int pci_conf1_read_config_byte(struct pci_dev *dev, int where, u8 *value)
-{
-    outl(CONFIG_CMD(dev,where), 0xCF8);
-    *value = inb(0xCFC + (where&3));
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value)
-{
-    outl(CONFIG_CMD(dev,where), 0xCF8);    
-    *value = inw(0xCFC + (where&2));
-    return PCIBIOS_SUCCESSFUL;    
-}
-
-static int pci_conf1_read_config_dword(struct pci_dev *dev, int where, u32 *value)
-{
-    outl(CONFIG_CMD(dev,where), 0xCF8);
-    *value = inl(0xCFC);
-    return PCIBIOS_SUCCESSFUL;    
-}
-
-static int pci_conf1_write_config_byte(struct pci_dev *dev, int where, u8 value)
-{
-    outl(CONFIG_CMD(dev,where), 0xCF8);    
-    outb(value, 0xCFC + (where&3));
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf1_write_config_word(struct pci_dev *dev, int where, u16 value)
-{
-    outl(CONFIG_CMD(dev,where), 0xCF8);
-    outw(value, 0xCFC + (where&2));
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf1_write_config_dword(struct pci_dev *dev, int where, u32 value)
-{
-    outl(CONFIG_CMD(dev,where), 0xCF8);
-    outl(value, 0xCFC);
-    return PCIBIOS_SUCCESSFUL;
-}
-
-#undef CONFIG_CMD
-
-static struct pci_ops pci_direct_conf1 = {
-      pci_conf1_read_config_byte,
-      pci_conf1_read_config_word,
-      pci_conf1_read_config_dword,
-      pci_conf1_write_config_byte,
-      pci_conf1_write_config_word,
-      pci_conf1_write_config_dword
-};
-
-/*
- * Functions for accessing PCI configuration space with type 2 accesses
- */
-
-#define IOADDR(devfn, where)   ((0xC000 | ((devfn & 0x78) << 5)) + where)
-#define FUNC(devfn)            (((devfn & 7) << 1) | 0xf0)
-#define SET(dev)               if (dev->devfn) return PCIBIOS_DEVICE_NOT_FOUND;                \
-                               outb(FUNC(dev->devfn), 0xCF8);                                  \
-                               outb(dev->bus->number, 0xCFA);
-
-static int pci_conf2_read_config_byte(struct pci_dev *dev, int where, u8 *value)
-{
-    SET(dev);
-    *value = inb(IOADDR(dev->devfn,where));
-    outb (0, 0xCF8);
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf2_read_config_word(struct pci_dev *dev, int where, u16 *value)
-{
-    SET(dev);
-    *value = inw(IOADDR(dev->devfn,where));
-    outb (0, 0xCF8);
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf2_read_config_dword(struct pci_dev *dev, int where, u32 *value)
-{
-    SET(dev);
-    *value = inl (IOADDR(dev->devfn,where));    
-    outb (0, 0xCF8);    
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf2_write_config_byte(struct pci_dev *dev, int where, u8 value)
-{
-    SET(dev);
-    outb (value, IOADDR(dev->devfn,where));
-    outb (0, 0xCF8);    
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf2_write_config_word(struct pci_dev *dev, int where, u16 value)
-{
-    SET(dev);
-    outw (value, IOADDR(dev->devfn,where));
-    outb (0, 0xCF8);    
-    return PCIBIOS_SUCCESSFUL;
-}
-
-static int pci_conf2_write_config_dword(struct pci_dev *dev, int where, u32 value)
-{
-    SET(dev);
-    outl (value, IOADDR(dev->devfn,where));    
-    outb (0, 0xCF8);    
-    return PCIBIOS_SUCCESSFUL;
-}
-
-#undef SET
-#undef IOADDR
-#undef FUNC
-
-static struct pci_ops pci_direct_conf2 = {
-      pci_conf2_read_config_byte,
-      pci_conf2_read_config_word,
-      pci_conf2_read_config_dword,
-      pci_conf2_write_config_byte,
-      pci_conf2_write_config_word,
-      pci_conf2_write_config_dword
-};
-
-/*
- * Before we decide to use direct hardware access mechanisms, we try to do some
- * trivial checks to ensure it at least _seems_ to be working -- we just test
- * whether bus 00 contains a host bridge (this is similar to checking
- * techniques used in XFree86, but ours should be more reliable since we
- * attempt to make use of direct access hints provided by the PCI BIOS).
- *
- * This should be close to trivial, but it isn't, because there are buggy
- * chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID.
- */
-static int __init pci_sanity_check(struct pci_ops *o)
-{
-       u16 x;
-       struct pci_bus bus;             /* Fake bus and device */
-       struct pci_dev dev;
-
-#ifdef CONFIG_VISWS
-       return 1;       /* Lithium PCI Bridges are non-standard */
-#endif
-
-       if (pci_probe & PCI_NO_CHECKS)
-               return 1;
-       bus.number = 0;
-       dev.bus = &bus;
-       for(dev.devfn=0; dev.devfn < 0x100; dev.devfn++)
-               if ((!o->read_word(&dev, PCI_CLASS_DEVICE, &x) &&
-                    (x == PCI_CLASS_BRIDGE_HOST || x == PCI_CLASS_DISPLAY_VGA)) ||
-                   (!o->read_word(&dev, PCI_VENDOR_ID, &x) &&
-                    (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ)))
-                       return 1;
-       DBG("PCI: Sanity check failed\n");
-       return 0;
-}
-
-static struct pci_ops * __init pci_check_direct(void)
-{
-       unsigned int tmp;
-       unsigned long flags;
-
-       __save_flags(flags); __cli();
-
-       /*
-        * Check if configuration type 1 works.
-        */
-       if (pci_probe & PCI_PROBE_CONF1) {
-               outb (0x01, 0xCFB);
-               tmp = inl (0xCF8);
-               outl (0x80000000, 0xCF8);
-               if (inl (0xCF8) == 0x80000000 &&
-                   pci_sanity_check(&pci_direct_conf1)) {
-                       outl (tmp, 0xCF8);
-                       __restore_flags(flags);
-                       printk("PCI: Using configuration type 1\n");
-                       return &pci_direct_conf1;
-               }
-               outl (tmp, 0xCF8);
-       }
-
-       /*
-        * Check if configuration type 2 works.
-        */
-       if (pci_probe & PCI_PROBE_CONF2) {
-               outb (0x00, 0xCFB);
-               outb (0x00, 0xCF8);
-               outb (0x00, 0xCFA);
-               if (inb (0xCF8) == 0x00 && inb (0xCFA) == 0x00 &&
-                   pci_sanity_check(&pci_direct_conf2)) {
-                       __restore_flags(flags);
-                       printk("PCI: Using configuration type 2\n");
-                       return &pci_direct_conf2;
-               }
-       }
-
-       __restore_flags(flags);
-       return NULL;
-}
-
-#endif
-
-/*
- * BIOS32 and PCI BIOS handling.
- */
-
-#ifdef CONFIG_PCI_BIOS
-
-#define PCIBIOS_PCI_FUNCTION_ID        0xb1XX
-#define PCIBIOS_PCI_BIOS_PRESENT       0xb101
-#define PCIBIOS_FIND_PCI_DEVICE                0xb102
-#define PCIBIOS_FIND_PCI_CLASS_CODE    0xb103
-#define PCIBIOS_GENERATE_SPECIAL_CYCLE 0xb106
-#define PCIBIOS_READ_CONFIG_BYTE       0xb108
-#define PCIBIOS_READ_CONFIG_WORD       0xb109
-#define PCIBIOS_READ_CONFIG_DWORD      0xb10a
-#define PCIBIOS_WRITE_CONFIG_BYTE      0xb10b
-#define PCIBIOS_WRITE_CONFIG_WORD      0xb10c
-#define PCIBIOS_WRITE_CONFIG_DWORD     0xb10d
-#define PCIBIOS_GET_ROUTING_OPTIONS    0xb10e
-#define PCIBIOS_SET_PCI_HW_INT         0xb10f
-
-/* BIOS32 signature: "_32_" */
-#define BIOS32_SIGNATURE       (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24))
-
-/* PCI signature: "PCI " */
-#define PCI_SIGNATURE          (('P' << 0) + ('C' << 8) + ('I' << 16) + (' ' << 24))
-
-/* PCI service signature: "$PCI" */
-#define PCI_SERVICE            (('$' << 0) + ('P' << 8) + ('C' << 16) + ('I' << 24))
-
-/* PCI BIOS hardware mechanism flags */
-#define PCIBIOS_HW_TYPE1               0x01
-#define PCIBIOS_HW_TYPE2               0x02
-#define PCIBIOS_HW_TYPE1_SPEC          0x10
-#define PCIBIOS_HW_TYPE2_SPEC          0x20
-
-/*
- * This is the standard structure used to identify the entry point
- * to the BIOS32 Service Directory, as documented in
- *     Standard BIOS 32-bit Service Directory Proposal
- *     Revision 0.4 May 24, 1993
- *     Phoenix Technologies Ltd.
- *     Norwood, MA
- * and the PCI BIOS specification.
- */
-
-union bios32 {
-       struct {
-               unsigned long signature;        /* _32_ */
-               unsigned long entry;            /* 32 bit physical address */
-               unsigned char revision;         /* Revision level, 0 */
-               unsigned char length;           /* Length in paragraphs should be 01 */
-               unsigned char checksum;         /* All bytes must add up to zero */
-               unsigned char reserved[5];      /* Must be zero */
-       } fields;
-       char chars[16];
-};
-
-/*
- * Physical address of the service directory.  I don't know if we're
- * allowed to have more than one of these or not, so just in case
- * we'll make pcibios_present() take a memory start parameter and store
- * the array there.
- */
-
-static struct {
-       unsigned long address;
-       unsigned short segment;
-} bios32_indirect = { 0, __KERNEL_CS };
-
-/*
- * Returns the entry point for the given service, NULL on error
- */
-
-static unsigned long bios32_service(unsigned long service)
-{
-       unsigned char return_code;      /* %al */
-       unsigned long address;          /* %ebx */
-       unsigned long length;           /* %ecx */
-       unsigned long entry;            /* %edx */
-       unsigned long flags;
-
-       __save_flags(flags); __cli();
-       __asm__("lcall (%%edi)"
-               : "=a" (return_code),
-                 "=b" (address),
-                 "=c" (length),
-                 "=d" (entry)
-               : "0" (service),
-                 "1" (0),
-                 "D" (&bios32_indirect));
-       __restore_flags(flags);
-
-       switch (return_code) {
-               case 0:
-                       return address + entry;
-               case 0x80:      /* Not present */
-                       printk("bios32_service(0x%lx): not present\n", service);
-                       return 0;
-               default: /* Shouldn't happen */
-                       printk("bios32_service(0x%lx): returned 0x%x, report to <mj@ucw.cz>.\n",
-                               service, return_code);
-                       return 0;
-       }
-}
-
-static struct {
-       unsigned long address;
-       unsigned short segment;
-} pci_indirect = { 0, __KERNEL_CS };
-
-static int pci_bios_present;
-
-static int __init check_pcibios(void)
-{
-       u32 signature, eax, ebx, ecx;
-       u8 status, major_ver, minor_ver, hw_mech, last_bus;
-       unsigned long flags, pcibios_entry;
-
-       if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
-               pci_indirect.address = pcibios_entry + PAGE_OFFSET;
-
-               __save_flags(flags); __cli();
-               __asm__(
-                       "lcall (%%edi)\n\t"
-                       "jc 1f\n\t"
-                       "xor %%ah, %%ah\n"
-                       "1:"
-                       : "=d" (signature),
-                         "=a" (eax),
-                         "=b" (ebx),
-                         "=c" (ecx)
-                       : "1" (PCIBIOS_PCI_BIOS_PRESENT),
-                         "D" (&pci_indirect)
-                       : "memory");
-               __restore_flags(flags);
-
-               status = (eax >> 8) & 0xff;
-               hw_mech = eax & 0xff;
-               major_ver = (ebx >> 8) & 0xff;
-               minor_ver = ebx & 0xff;
-               last_bus = ecx & 0xff;
-               DBG("PCI: BIOS probe returned s=%02x hw=%02x ver=%02x.%02x l=%02x\n",
-                       status, hw_mech, major_ver, minor_ver, last_bus);
-               if (status || signature != PCI_SIGNATURE) {
-                       printk (KERN_ERR "PCI: BIOS BUG #%x[%08x] found, report to <mj@ucw.cz>\n",
-                               status, signature);
-                       return 0;
-               }
-               printk("PCI: PCI BIOS revision %x.%02x entry at 0x%lx\n",
-                       major_ver, minor_ver, pcibios_entry);
-#ifdef CONFIG_PCI_DIRECT
-               if (!(hw_mech & PCIBIOS_HW_TYPE1))
-                       pci_probe &= ~PCI_PROBE_CONF1;
-               if (!(hw_mech & PCIBIOS_HW_TYPE2))
-                       pci_probe &= ~PCI_PROBE_CONF2;
-#endif
-               return 1;
-       }
-       return 0;
-}
-
-static int __init pci_bios_find_device (unsigned short vendor, unsigned short device_id,
-                                       unsigned short index, unsigned char *bus, unsigned char *device_fn)
-{
-       unsigned short bx;
-       unsigned short ret;
-
-       __asm__("lcall (%%edi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=b" (bx),
-                 "=a" (ret)
-               : "1" (PCIBIOS_FIND_PCI_DEVICE),
-                 "c" (device_id),
-                 "d" (vendor),
-                 "S" ((int) index),
-                 "D" (&pci_indirect));
-       *bus = (bx >> 8) & 0xff;
-       *device_fn = bx & 0xff;
-       return (int) (ret & 0xff00) >> 8;
-}
-
-static int pci_bios_read_config_byte(struct pci_dev *dev, int where, u8 *value)
-{
-       unsigned long ret;
-       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
-
-       __asm__("lcall (%%esi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=c" (*value),
-                 "=a" (ret)
-               : "1" (PCIBIOS_READ_CONFIG_BYTE),
-                 "b" (bx),
-                 "D" ((long) where),
-                 "S" (&pci_indirect));
-       return (int) (ret & 0xff00) >> 8;
-}
-
-static int pci_bios_read_config_word(struct pci_dev *dev, int where, u16 *value)
-{
-       unsigned long ret;
-       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
-
-       __asm__("lcall (%%esi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=c" (*value),
-                 "=a" (ret)
-               : "1" (PCIBIOS_READ_CONFIG_WORD),
-                 "b" (bx),
-                 "D" ((long) where),
-                 "S" (&pci_indirect));
-       return (int) (ret & 0xff00) >> 8;
-}
-
-static int pci_bios_read_config_dword(struct pci_dev *dev, int where, u32 *value)
-{
-       unsigned long ret;
-       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
-
-       __asm__("lcall (%%esi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=c" (*value),
-                 "=a" (ret)
-               : "1" (PCIBIOS_READ_CONFIG_DWORD),
-                 "b" (bx),
-                 "D" ((long) where),
-                 "S" (&pci_indirect));
-       return (int) (ret & 0xff00) >> 8;
-}
-
-static int pci_bios_write_config_byte(struct pci_dev *dev, int where, u8 value)
-{
-       unsigned long ret;
-       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
-
-       __asm__("lcall (%%esi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=a" (ret)
-               : "0" (PCIBIOS_WRITE_CONFIG_BYTE),
-                 "c" (value),
-                 "b" (bx),
-                 "D" ((long) where),
-                 "S" (&pci_indirect));
-       return (int) (ret & 0xff00) >> 8;
-}
-
-static int pci_bios_write_config_word(struct pci_dev *dev, int where, u16 value)
-{
-       unsigned long ret;
-       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
-
-       __asm__("lcall (%%esi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=a" (ret)
-               : "0" (PCIBIOS_WRITE_CONFIG_WORD),
-                 "c" (value),
-                 "b" (bx),
-                 "D" ((long) where),
-                 "S" (&pci_indirect));
-       return (int) (ret & 0xff00) >> 8;
-}
-
-static int pci_bios_write_config_dword(struct pci_dev *dev, int where, u32 value)
-{
-       unsigned long ret;
-       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
-
-       __asm__("lcall (%%esi)\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=a" (ret)
-               : "0" (PCIBIOS_WRITE_CONFIG_DWORD),
-                 "c" (value),
-                 "b" (bx),
-                 "D" ((long) where),
-                 "S" (&pci_indirect));
-       return (int) (ret & 0xff00) >> 8;
-}
-
-/*
- * Function table for BIOS32 access
- */
-
-static struct pci_ops pci_bios_access = {
-      pci_bios_read_config_byte,
-      pci_bios_read_config_word,
-      pci_bios_read_config_dword,
-      pci_bios_write_config_byte,
-      pci_bios_write_config_word,
-      pci_bios_write_config_dword
-};
-
-/*
- * Try to find PCI BIOS.
- */
-
-static struct pci_ops * __init pci_find_bios(void)
-{
-       union bios32 *check;
-       unsigned char sum;
-       int i, length;
-
-       /*
-        * Follow the standard procedure for locating the BIOS32 Service
-        * directory by scanning the permissible address range from
-        * 0xe0000 through 0xfffff for a valid BIOS32 structure.
-        */
-
-       for (check = (union bios32 *) __va(0xe0000);
-            check <= (union bios32 *) __va(0xffff0);
-            ++check) {
-               if (check->fields.signature != BIOS32_SIGNATURE)
-                       continue;
-               length = check->fields.length * 16;
-               if (!length)
-                       continue;
-               sum = 0;
-               for (i = 0; i < length ; ++i)
-                       sum += check->chars[i];
-               if (sum != 0)
-                       continue;
-               if (check->fields.revision != 0) {
-                       printk("PCI: unsupported BIOS32 revision %d at 0x%p, report to <mj@ucw.cz>\n",
-                               check->fields.revision, check);
-                       continue;
-               }
-               DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check);
-               if (check->fields.entry >= 0x100000) {
-                       printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check);
-                       return NULL;
-               } else {
-                       unsigned long bios32_entry = check->fields.entry;
-                       DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry);
-                       bios32_indirect.address = bios32_entry + PAGE_OFFSET;
-                       if (check_pcibios())
-                               return &pci_bios_access;
-               }
-               break;  /* Hopefully more than one BIOS32 cannot happen... */
-       }
-
-       return NULL;
-}
-
-/*
- * Sort the device list according to PCI BIOS. Nasty hack, but since some
- * fool forgot to define the `correct' device order in the PCI BIOS specs
- * and we want to be (possibly bug-to-bug ;-]) compatible with older kernels
- * which used BIOS ordering, we are bound to do this...
- */
-
-static void __init pcibios_sort(void)
-{
-       struct pci_dev *dev = pci_devices;
-       struct pci_dev **last = &pci_devices;
-       struct pci_dev *d, **dd, *e;
-       int idx;
-       unsigned char bus, devfn;
-
-       DBG("PCI: Sorting device list...\n");
-       while ((e = dev)) {
-               idx = 0;
-               while (pci_bios_find_device(e->vendor, e->device, idx, &bus, &devfn) == PCIBIOS_SUCCESSFUL) {
-                       idx++;
-                       for(dd=&dev; (d = *dd); dd = &d->next) {
-                               if (d->bus->number == bus && d->devfn == devfn) {
-                                       *dd = d->next;
-                                       *last = d;
-                                       last = &d->next;
-                                       break;
-                               }
-                       }
-                       if (!d) {
-                               printk("PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn);
-                               /*
-                                * We must not continue scanning as several buggy BIOSes
-                                * return garbage after the last device. Grr.
-                                */
-                               break;
-                       }
-               }
-               if (e == dev) {
-                       printk("PCI: Device %02x:%02x not found by BIOS\n",
-                               dev->bus->number, dev->devfn);
-                       d = dev;
-                       dev = dev->next;
-                       *last = d;
-                       last = &d->next;
-               }
-       }
-       *last = NULL;
-}
-
-/*
- *  Ask BIOS for IRQ Routing Table
- */
-
-struct irq_routing_options {
-       u16 size;
-       struct irq_info *table;
-       u16 segment;
-} __attribute__((packed));
-
-static unsigned long pcibios_irq_page __initdata = 0;
-
-static inline void __init pcibios_free_irq_routing_table(void)
-{
-       if (pcibios_irq_page)
-               free_page(pcibios_irq_page);
-}
-
-static struct irq_routing_table * __init pcibios_get_irq_routing_table(void)
-{
-       struct irq_routing_options opt;
-       struct irq_routing_table *rt;
-       int ret, map;
-
-       if (pci_probe & PCI_NO_IRQ_SCAN)
-               return NULL;
-       pcibios_irq_page = __get_free_page(GFP_KERNEL);
-       if (!pcibios_irq_page)
-               return 0;
-       rt = (void *) pcibios_irq_page;
-       opt.table = rt->slots;
-       opt.size = PAGE_SIZE - sizeof(struct irq_routing_table);
-       opt.segment = __KERNEL_DS;
-
-       DBG("PCI: Fetching IRQ routing table... ");
-       __asm__("push %%es\n\t"
-               "push %%ds\n\t"
-               "pop  %%es\n\t"
-               "lcall (%%esi)\n\t"
-               "pop %%es\n\t"
-               "jc 1f\n\t"
-               "xor %%ah, %%ah\n"
-               "1:"
-               : "=a" (ret),
-                 "=b" (map)
-               : "0" (PCIBIOS_GET_ROUTING_OPTIONS),
-                 "1" (0),
-                 "D" ((long) &opt),
-                 "S" (&pci_indirect));
-       DBG("OK  ret=%d, size=%d, map=%x\n", ret, opt.size, map);
-       if (ret & 0xff00) {
-               printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", (ret >> 8) & 0xff);
-               return 0;
-       }
-
-       memset(rt, 0, sizeof(struct irq_routing_table));
-       rt->size = opt.size + sizeof(struct irq_routing_table);
-       printk("PCI: Using BIOS Interrupt Routing Table\n");
-       return rt;
-}
-
-#endif
-
-/*
- * Assign new address to PCI resource.  We hope our resource information
- * is complete.  On the PC, we don't re-assign resources unless we are
- * forced to do so.
- *
- * Expects start=0, end=size-1, flags=resource type.
- */
-
-static int __init pcibios_assign_resource(struct pci_dev *dev, int i)
-{
-       struct resource *r = &dev->resource[i];
-       struct resource *pr = pci_find_parent_resource(dev, r);
-       unsigned long size = r->end + 1;
-       u32 new, check;
-
-       if (!pr) {
-               printk(KERN_ERR "PCI: Cannot find parent resource for device %s\n", dev->slot_name);
-               return -EINVAL;
-       }
-       if (r->flags & IORESOURCE_IO) {
-               /*
-                * We need to avoid collisions with `mirrored' VGA ports and other strange
-                * ISA hardware, so we always want the addresses kilobyte aligned.
-                */
-               if (size > 0x100) {
-                       printk(KERN_ERR "PCI: I/O Region %s/%d too large (%ld bytes)\n", dev->slot_name, i, size);
-                       return -EFBIG;
-               }
-               if (allocate_resource(pr, r, size, 0x1000, ~0, 1024)) {
-                       printk(KERN_ERR "PCI: Allocation of I/O region %s/%d (%ld bytes) failed\n", dev->slot_name, i, size);
-                       return -EBUSY;
-               }
-       } else {
-               if (allocate_resource(pr, r, size, 0x10000000, ~0, size)) {
-                       printk(KERN_ERR "PCI: Allocation of memory region %s/%d (%ld bytes) failed\n", dev->slot_name, i, size);
-                       return -EBUSY;
-               }
-       }
-       if (i < 6) {
-               int reg = PCI_BASE_ADDRESS_0 + 4*i;
-               new = r->start | (r->flags & PCI_REGION_FLAG_MASK);
-               pci_write_config_dword(dev, reg, new);
-               pci_read_config_dword(dev, reg, &check);
-               if (new != check)
-                       printk(KERN_ERR "PCI: Error while updating region %s/%d (%08x != %08x)\n", dev->slot_name, i, new, check);
-       } else if (i == PCI_ROM_RESOURCE) {
-               r->flags |= PCI_ROM_ADDRESS_ENABLE;
-               pci_write_config_dword(dev, dev->rom_base_reg, r->start | (r->flags & PCI_REGION_FLAG_MASK));
-       }
-       printk("PCI: Assigned addresses %08lx-%08lx to region %s/%d\n", r->start, r->end, dev->slot_name, i);
-       return 0;
-}
-
-/*
- * Several buggy motherboards address only 16 devices and mirror
- * them to next 16 IDs. We try to detect this `feature' on all
- * primary buses (those containing host bridges as they are
- * expected to be unique) and remove the ghost devices.
- */
-
-static void __init pcibios_fixup_ghosts(struct pci_bus *b)
-{
-       struct pci_dev *d, *e, **z;
-       int mirror = PCI_DEVFN(16,0);
-       int seen_host_bridge = 0;
-       int i;
-
-       DBG("PCI: Scanning for ghost devices on bus %d\n", b->number);
-       for(d=b->devices; d && d->devfn < mirror; d=d->sibling) {
-               if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
-                       seen_host_bridge++;
-               for(e=d->next; e; e=e->sibling) {
-                       if (e->devfn != d->devfn + mirror ||
-                           e->vendor != d->vendor ||
-                           e->device != d->device ||
-                           e->class != d->class)
-                               continue;
-                       for(i=0; i<PCI_NUM_RESOURCES; i++)
-                               if (e->resource[i].start != d->resource[i].start ||
-                                   e->resource[i].end != d->resource[i].end ||
-                                   e->resource[i].flags != d->resource[i].flags)
-                                       continue;
-                       break;
-               }
-               if (!e)
-                       return;
-       }
-       if (!seen_host_bridge)
-               return;
-       printk("PCI: Ignoring ghost devices on bus %02x\n", b->number);
-       for(e=b->devices; e->sibling != d; e=e->sibling);
-       e->sibling = NULL;
-       for(z=&pci_devices; (d=*z);)
-               if (d->bus == b && d->devfn >= mirror) {
-                       *z = d->next;
-                       kfree_s(d, sizeof(*d));
-               } else
-                       z = &d->next;
-}
-
-/*
- * In case there are peer host bridges, scan bus behind each of them.
- * Although several sources claim that the host bridges should have
- * header type 1 and be assigned a bus number as for PCI2PCI bridges,
- * the reality doesn't pass this test and the bus number is usually
- * set by BIOS to the first free value.
- */
-static void __init pcibios_fixup_peer_bridges(void)
-{
-       struct pci_bus *b = pci_root;
-       int n, cnt=-1;
-       struct pci_dev *d;
-       struct pci_ops *ops = pci_root->ops;
-
-#ifdef CONFIG_VISWS
-       pci_scan_bus(1, ops, NULL);
-       return;
-#endif
-
-#ifdef CONFIG_PCI_DIRECT
-       /*
-        * Don't search for peer host bridges if we use config type 2
-        * since it reads bogus values for non-existent buses and
-        * chipsets supporting multiple primary buses use conf1 anyway.
-        */
-       if (ops == &pci_direct_conf2)
-               return;
-#endif
-
-       for(d=b->devices; d; d=d->sibling)
-               if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
-                       cnt++;
-       n = b->subordinate + 1;
-       while (n <= 0xff) {
-               int found = 0;
-               u16 l;
-               struct pci_bus bus;
-               struct pci_dev dev;
-               bus.number = n;
-               bus.ops = ops;
-               dev.bus = &bus;
-               for(dev.devfn=0; dev.devfn<256; dev.devfn += 8)
-                       if (!pci_read_config_word(&dev, PCI_VENDOR_ID, &l) &&
-                           l != 0x0000 && l != 0xffff) {
-#ifdef CONFIG_PCI_BIOS
-                               if (pci_bios_present) {
-                                       int err, idx = 0;
-                                       u8 bios_bus, bios_dfn;
-                                       u16 d;
-                                       pci_read_config_word(&dev, PCI_DEVICE_ID, &d);
-                                       DBG("BIOS test for %02x:%02x (%04x:%04x)\n", n, dev.devfn, l, d);
-                                       while (!(err = pci_bios_find_device(l, d, idx, &bios_bus, &bios_dfn)) &&
-                                              (bios_bus != n || bios_dfn != dev.devfn))
-                                               idx++;
-                                       if (err)
-                                               break;
-                               }
-#endif
-                               DBG("Found device at %02x:%02x\n", n, dev.devfn);
-                               found++;
-                               if (!pci_read_config_word(&dev, PCI_CLASS_DEVICE, &l) &&
-                                   l == PCI_CLASS_BRIDGE_HOST)
-                                       cnt++;
-                       }
-               if (cnt-- <= 0)
-                       break;
-               if (found) {
-                       printk("PCI: Discovered primary peer bus %02x\n", n);
-                       b = pci_scan_bus(n, ops, NULL);
-                       if (b)
-                               n = b->subordinate;
-               }
-               n++;
-       }
-}
-
-/*
- * Exceptions for specific devices. Usually work-arounds for fatal design flaws.
- */
-
-static void __init pci_fixup_i450nx(struct pci_dev *d)
-{
-       /*
-        * i450NX -- Find and scan all secondary buses on all PXB's.
-        */
-       int pxb, reg;
-       u8 busno, suba, subb;
-       printk("PCI: Searching for i450NX host bridges on %s\n", d->slot_name);
-       reg = 0xd0;
-       for(pxb=0; pxb<2; pxb++) {
-               pci_read_config_byte(d, reg++, &busno);
-               pci_read_config_byte(d, reg++, &suba);
-               pci_read_config_byte(d, reg++, &subb);
-               DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb);
-               if (busno)
-                       pci_scan_bus(busno, pci_root->ops, NULL);       /* Bus A */
-               if (suba < subb)
-                       pci_scan_bus(suba+1, pci_root->ops, NULL);      /* Bus B */
-       }
-       pci_probe |= PCI_NO_PEER_FIXUP;
-}
-
-static void __init pci_fixup_umc_ide(struct pci_dev *d)
-{
-       /*
-        * UM8886BF IDE controller sets region type bits incorrectly,
-        * therefore they look like memory despite of them being I/O.
-        */
-       int i;
-
-       printk("PCI: Fixing base address flags for device %s\n", d->slot_name);
-       for(i=0; i<4; i++)
-               d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
-}
-
-static void __init pci_fixup_ide_bases(struct pci_dev *d)
-{
-       int i;
-
-       /*
-        * PCI IDE controllers use non-standard I/O port decoding, respect it.
-        */
-       if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
-               return;
-/* This just can't be right even with the fixes */
-#if 0
-       DBG("PCI: IDE base address fixup for %s\n", d->slot_name);
-       for(i=0; i<4; i++) {
-               struct resource *r = &d->resource[i];
-               if ((r->start & ~0x80) == 0x374) {
-                       r->start += 2;
-                       r->end = r->start;
-               }
-       }
-#endif
-}
-
-struct pci_fixup pcibios_fixups[] = {
-       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82451NX,    pci_fixup_i450nx },
-       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_UMC,      PCI_DEVICE_ID_UMC_UM8886BF,     pci_fixup_umc_ide },
-       { PCI_FIXUP_HEADER,     PCI_ANY_ID,             PCI_ANY_ID,                     pci_fixup_ide_bases },
-       { 0 }
-};
-
-/*
- *  Handle resources of PCI devices.  If the world were perfect, we could
- *  just allocate all the resource regions and do nothing more.  It isn't.
- *  On the other hand, we cannot just re-allocate all devices, as it would
- *  require us to know lots of host bridge internals.  So we attempt to
- *  keep as much of the original configuration as possible, but tweak it
- *  when it's found to be wrong.
- *
- *  Known BIOS problems we have to work around:
- *     - I/O or memory regions not configured
- *     - regions configured, but not enabled in the command register
- *     - bogus I/O addresses above 64K used
- *     - expansion ROMs left enabled (this may sound harmless, but given
- *       the fact the PCI specs explicitly allow address decoders to be
- *       shared between expansion ROMs and other resource regions, it's
- *       at least dangerous)
- *
- *  Our solution:
- *     (1) Allocate resources for all buses behind PCI-to-PCI bridges.
- *         This gives us fixed barriers on where we can allocate.
- *     (2) Allocate resources for all enabled devices.  If there is
- *         a collision, just mark the resource as unallocated. Also
- *         disable expansion ROMs during this step.
- *     (3) Try to allocate resources for disabled devices.  If the
- *         resources were assigned correctly, everything goes well,
- *         if they weren't, they won't disturb allocation of other
- *         resources.
- *     (4) Assign new addresses to resources which were either
- *         not configured at all or misconfigured.  If explicitly
- *         requested by the user, configure expansion ROM address
- *         as well.  Finally enable the I/O and Memory bits.
- */
-
-static void __init pcibios_allocate_bus_resources(struct pci_bus *bus)
-{
-       struct pci_dev *dev;
-       int idx;
-       struct resource *r, *pr;
-
-       /* Depth-First Search on bus tree */
-       while (bus) {
-               if ((dev = bus->self)) {
-                       for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
-                               r = &dev->resource[idx];
-                               if (!r->start)
-                                       continue;
-                               pr = pci_find_parent_resource(dev, r);
-                               if (!pr || request_resource(pr, r) < 0)
-                                       printk(KERN_ERR "PCI: Cannot allocate resource region %d of bridge %s\n", idx, dev->slot_name);
-                       }
-               }
-               if (bus->children)
-                       pcibios_allocate_bus_resources(bus->children);
-               bus = bus->next;
-       }
-}
-
-static void __init pcibios_allocate_resources(int pass)
-{
-       struct pci_dev *dev;
-       int idx, disabled;
-       u16 command;
-       struct resource *r, *pr;
-
-       for(dev=pci_devices; dev; dev=dev->next) {
-               pci_read_config_word(dev, PCI_COMMAND, &command);
-               for(idx = 0; idx < 6; idx++) {
-                       r = &dev->resource[idx];
-                       if (r->parent)          /* Already allocated */
-                               continue;
-                       if (!r->start)          /* Address not assigned at all */
-                               continue;
-                       if (r->flags & IORESOURCE_IO)
-                               disabled = !(command & PCI_COMMAND_IO);
-                       else
-                               disabled = !(command & PCI_COMMAND_MEMORY);
-                       if (pass == disabled) {
-                               DBG("PCI: Resource %08lx-%08lx (f=%lx, d=%d, p=%d)\n",
-                                   r->start, r->end, r->flags, disabled, pass);
-                               pr = pci_find_parent_resource(dev, r);
-                               if (!pr || request_resource(pr, r) < 0) {
-                                       printk(KERN_ERR "PCI: Cannot allocate resource region %d of device %s\n", idx, dev->slot_name);
-                                       /* We'll assign a new address later */
-                                       r->start -= r->end;
-                                       r->start = 0;
-                               }
-                       }
-               }
-               if (!pass) {
-                       r = &dev->resource[PCI_ROM_RESOURCE];
-                       if (r->flags & PCI_ROM_ADDRESS_ENABLE) {
-                               /* Turn the ROM off, leave the resource region, but keep it unregistered. */
-                               u32 reg;
-                               DBG("PCI: Switching off ROM of %s\n", dev->slot_name);
-                               r->flags &= ~PCI_ROM_ADDRESS_ENABLE;
-                               pci_read_config_dword(dev, dev->rom_base_reg, &reg);
-                               pci_write_config_dword(dev, dev->rom_base_reg, reg & ~PCI_ROM_ADDRESS_ENABLE);
-                       }
-               }
-       }
-}
-
-static void __init pcibios_assign_resources(void)
-{
-       struct pci_dev *dev;
-       u16 cmd, old_cmd;
-       int idx;
-       int fault = 0;
-       struct resource *r;
-
-       for(dev=pci_devices; dev; dev=dev->next) {
-               pci_read_config_word(dev, PCI_COMMAND, &cmd);
-               old_cmd = cmd;
-               for(idx=0; idx<6; idx++) {
-                       r = &dev->resource[idx];
-                       if (((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && idx < 4) ||
-                           ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO)))
-                               /*
-                                *  Don't touch IDE controllers and I/O ports of video cards!
-                                *  Neither enable anything in their command registers.
-                                */
-                               continue;
-                       if (!r->start && r->end) {
-                               /*
-                                *  We shall assign a new address to this resource, either because
-                                *  the BIOS forgot to do so or because we have decided the old
-                                *  address was unusable for some reason.
-                                */
-                               if (pcibios_assign_resource(dev, idx) < 0)
-                                       fault = 1;
-                       }
-                       if (r->flags & IORESOURCE_IO)
-                               cmd |= PCI_COMMAND_IO;
-                       if (r->flags & IORESOURCE_MEM)
-                               cmd |= PCI_COMMAND_MEMORY;
-               }
-
-               if (cmd != old_cmd) {
-                       if (fault)
-                               printk("PCI: Not enabling device %s because of resource collisions\n", dev->slot_name);
-                       else {
-                               printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->slot_name, old_cmd, cmd);
-                               pci_write_config_word(dev, PCI_COMMAND, cmd);
-                       }
-               }
-
-               if (pci_probe & PCI_ASSIGN_ROMS) {
-                       r = &dev->resource[PCI_ROM_RESOURCE];
-                       r->end -= r->start;
-                       r->start = 0;
-                       if (r->end)
-                               pcibios_assign_resource(dev, PCI_ROM_RESOURCE);
-               }
-       }
-}
-
-static void __init pcibios_resource_survey(void)
-{
-       pcibios_allocate_bus_resources(pci_root);
-       pcibios_allocate_resources(0);
-       pcibios_allocate_resources(1);
-       pcibios_assign_resources();
-}
-
-/*
- *  Fix up IRQs of all PCI devices.
- */
-
-extern int skip_ioapic_setup;
-
-#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
-#define PIRQ_VERSION 0x0100
-
-/*
- *  Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table.
- */
-
-static struct irq_routing_table * __init pcibios_find_irq_routing_table(void)
-{
-       u8 *addr;
-       struct irq_routing_table *rt;
-       int i;
-       u8 sum;
-
-       for(addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) {
-               rt = (struct irq_routing_table *) addr;
-               if (rt->signature != PIRQ_SIGNATURE ||
-                   rt->version != PIRQ_VERSION ||
-                   rt->size % 16 ||
-                   rt->size < sizeof(struct irq_routing_table))
-                       continue;
-               sum = 0;
-               for(i=0; i<rt->size; i++)
-                       sum += addr[i];
-               if (!sum) {
-                       printk("PCI: Interrupt Routing Table found at 0x%p [router type %04x/%04x]\n",
-                              rt, rt->rtr_vendor, rt->rtr_device);
-                       return rt;
-               }
-       }
-       return NULL;
-}
-
-/*
- *  If we have a IRQ routing table, use it to search for peer host
- *  bridges.  It's a gross hack, but since there are no other known
- *  ways how to get a list of buses, we have to go this way.
- */
-
-static void __init pcibios_irq_peer_trick(struct irq_routing_table *rt)
-{
-       u8 busmap[256];
-       int i;
-       struct irq_info *e;
-
-       memset(busmap, 0, sizeof(busmap));
-       for(i=0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
-               e = &rt->slots[i];
-               DBG("b=%02x d=%02x s=%02x\n", e->bus, e->devfn, e->slot);
-               busmap[e->bus] = 1;
-       }
-       for(i=1; i<256; i++)
-               /*
-                *  It might be a secondary bus, but in this case its parent is already
-                *  known (ascending bus order) and therefore pci_scan_bus returns immediately.
-                */
-               if (busmap[i] && pci_scan_bus(i, pci_root->ops, NULL))
-                       printk("PCI: Discovered primary peer bus %02x [IRQ]\n", i);
-       pci_probe |= PCI_NO_PEER_FIXUP;
-}
-
-/*
- *  In case BIOS forgets to tell us about IRQ, we try to look it up in the routing
- *  table, but unfortunately we have to know the interrupt router chip.
- */
-
-static int __init pcibios_lookup_irq(struct pci_dev *dev, struct irq_routing_table *rt, int pin)
-{
-       struct irq_info *q;
-       struct pci_dev *router;
-       int i, pirq, newirq;
-       u32 rtrid, mask;
-       u8 x;
-
-       pin--;
-       DBG("IRQ for %s(%d)", dev->slot_name, pin);
-       while (dev->bus->self) {
-               pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-               dev = dev->bus->self;
-               DBG(" -> %s(%d)", dev->slot_name, pin);
-       }
-       for(q = rt->slots, i = rt->size - sizeof(struct irq_routing_table);
-           i && (q->bus != dev->bus->number || PCI_SLOT(q->devfn) != PCI_SLOT(dev->devfn));
-           i -= sizeof(struct irq_info), q++)
-               ;
-       if (!i) {
-               DBG(" -> not found in routing table\n");
-               return 0;
-       }
-       pirq = q->irq[pin].link;
-       mask = q->irq[pin].bitmap;
-       if (!pirq) {
-               DBG(" -> not routed\n");
-               return 0;
-       }
-       DBG(" -> PIRQ %02x, mask %04x", pirq, mask);
-       if ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
-               newirq = 0;
-       else for(newirq = 15; newirq && !(mask & (1 << newirq)); newirq--)
-               ;
-       if (!(router = pci_find_slot(rt->rtr_bus, rt->rtr_devfn))) {
-               DBG(" -> router not found\n");
-               return 0;
-       }
-#define ID(x,y) ((x << 16) | y)
-       rtrid = ID(rt->rtr_vendor, rt->rtr_device);
-       if (!rtrid) {
-               /*
-                * Several BIOSes forget to set the router type. In such cases, we
-                * use chip vendor/device. This doesn't guarantee us semantics of
-                * PIRQ values, but was found to work in practice and it's still
-                * better than not trying.
-                */
-               DBG(" [%s]", router->slot_name);
-               rtrid = ID(router->vendor, router->device);
-       }
-       switch (rtrid) {
-       case ID(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0):
-       case ID(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0):
-       case ID(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0):
-               /* Intel PIIX: PIRQ holds configuration register address */
-               pci_read_config_byte(router, pirq, &x);
-               if (x < 16) {
-                       DBG(" -> [PIIX] %02x\n", x);
-                       return x;
-               } else if (newirq) {
-                       DBG(" -> [PIIX] set to %02x\n", newirq);
-                       pci_write_config_byte(router, pirq, newirq);
-                       return newirq;
-               }
-               DBG(" -> [PIIX] sink\n");
-               return 0;
-       default:
-               DBG(" -> unknown router %04x/%04x\n", rt->rtr_vendor, rt->rtr_device);
-               return 0;
-       }
-#undef ID
-}
-
-static void __init pcibios_fixup_irqs(void)
-{
-       struct irq_routing_table *rtable;
-       struct pci_dev *dev;
-       u8 pin;
-
-       rtable = pcibios_find_irq_routing_table();
-#ifdef CONFIG_PCI_BIOS
-       if (!rtable && pci_bios_present)
-               rtable = pcibios_get_irq_routing_table();
-#endif
-
-       if (rtable)
-               pcibios_irq_peer_trick(rtable);
-
-       for(dev=pci_devices; dev; dev=dev->next) {
-               pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-#if defined(CONFIG_X86_IO_APIC)
-               /*
-                * Recalculate IRQ numbers if we use the I/O APIC.
-                */
-               if(!skip_ioapic_setup)
-               {
-                       int irq;
-
-                       if (pin) {
-                               pin--;          /* interrupt pins are numbered starting from 1 */
-                               irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
-                               if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-                                       struct pci_dev * bridge = dev->bus->self;
-
-                                       pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-                                       irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
-                                                       PCI_SLOT(bridge->devfn), pin);
-                                       if (irq >= 0)
-                                               printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", 
-                                                       bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
-                               }
-                               if (irq >= 0) {
-                                       printk("PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
-                                               dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
-                                       dev->irq = irq;
-                               }
-                       }
-                       rtable = NULL;  /* Avoid IRQ assignment below */
-               }
-#endif
-               /*
-                * Fix out-of-range IRQ numbers and missing IRQs.
-                */
-               if (dev->irq >= NR_IRQS)
-                       dev->irq = 0;
-               if (pin && !dev->irq && rtable && rtable->version) {
-                       dev->irq = pcibios_lookup_irq(dev, rtable, pin);
-                       if (dev->irq)
-                               printk("PCI: Assigned IRQ %d to device %s\n", dev->irq, dev->slot_name);
-               }
-       }
-
-#ifdef CONFIG_PCI_BIOS
-       pcibios_free_irq_routing_table();
-#endif
-}
-
-/*
- *  Called after each bus is probed, but before its children
- *  are examined.
- */
-
-void __init pcibios_fixup_bus(struct pci_bus *b)
-{
-       pcibios_fixup_ghosts(b);
-       pci_read_bridge_bases(b);
-}
-
-/*
- * Initialization. Try all known PCI access methods. Note that we support
- * using both PCI BIOS and direct access: in such cases, we use I/O ports
- * to access config space, but we still keep BIOS order of cards to be
- * compatible with 2.0.X. This should go away some day.
- */
-
-void __init pcibios_init(void)
-{
-       struct pci_ops *bios = NULL;
-       struct pci_ops *dir = NULL;
-       struct pci_ops *ops;
-
-#ifdef CONFIG_PCI_BIOS
-       if ((pci_probe & PCI_PROBE_BIOS) && ((bios = pci_find_bios()))) {
-               pci_probe |= PCI_BIOS_SORT;
-               pci_bios_present = 1;
-       }
-#endif
-#ifdef CONFIG_PCI_DIRECT
-       if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
-               dir = pci_check_direct();
-#endif
-       if (dir)
-               ops = dir;
-       else if (bios)
-               ops = bios;
-       else {
-               printk("PCI: No PCI bus detected\n");
-               return;
-       }
-
-       printk("PCI: Probing PCI hardware\n");
-       pci_scan_bus(0, ops, NULL);
-
-       pcibios_fixup_irqs();
-       if (!(pci_probe & PCI_NO_PEER_FIXUP))
-               pcibios_fixup_peer_bridges();
-       pcibios_resource_survey();
-
-#ifdef CONFIG_PCI_BIOS
-       if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
-               pcibios_sort();
-#endif
-}
-
-char * __init pcibios_setup(char *str)
-{
-       if (!strcmp(str, "off")) {
-               pci_probe = 0;
-               return NULL;
-       }
-#ifdef CONFIG_PCI_BIOS
-       else if (!strcmp(str, "bios")) {
-               pci_probe = PCI_PROBE_BIOS;
-               return NULL;
-       } else if (!strcmp(str, "nobios")) {
-               pci_probe &= ~PCI_PROBE_BIOS;
-               return NULL;
-       } else if (!strcmp(str, "nosort")) {
-               pci_probe |= PCI_NO_SORT;
-               return NULL;
-       } else if (!strcmp(str, "noirq")) {
-               pci_probe |= PCI_NO_IRQ_SCAN;
-               return NULL;
-       }
-#endif
-#ifdef CONFIG_PCI_DIRECT
-       else if (!strcmp(str, "conf1")) {
-               pci_probe = PCI_PROBE_CONF1 | PCI_NO_CHECKS;
-               return NULL;
-       }
-       else if (!strcmp(str, "conf2")) {
-               pci_probe = PCI_PROBE_CONF2 | PCI_NO_CHECKS;
-               return NULL;
-       }
-#endif
-       else if (!strcmp(str, "nopeer")) {
-               pci_probe |= PCI_NO_PEER_FIXUP;
-               return NULL;
-       } else if (!strcmp(str, "rom")) {
-               pci_probe |= PCI_ASSIGN_ROMS;
-               return NULL;
-       }
-       return str;
-}
index f76c68f594d2f7fa59012d358d0691d55d1e4927..f55e86b61c9ccc19ca45abacdcfdc21ef22d0001 100644 (file)
     19990819   Alan Cox <alan@redhat.com>
                Tested Zoltan's changes on a pre production Athlon - 100%
                success.
+    19991008   Manfred Spraul <manfreds@colorfullife.com>
+              replaced spin_lock_reschedule() with a normal semaphore.
 */
 #include <linux/types.h>
 #include <linux/errno.h>
@@ -303,8 +305,6 @@ typedef u8 mtrr_type;
                                                       TRUE)
 #endif
 
-#define spin_lock_reschedule(lock) while (!spin_trylock(lock)) schedule ();
-
 #ifndef CONFIG_PROC_FS
 #  define compute_ascii() while (0)
 #endif
@@ -314,7 +314,7 @@ static char *ascii_buffer = NULL;
 static unsigned int ascii_buf_bytes = 0;
 #endif
 static unsigned int *usage_table = NULL;
-static spinlock_t main_lock = SPIN_LOCK_UNLOCKED;
+static DECLARE_MUTEX(main_lock);
 
 /*  Private functions  */
 #ifdef CONFIG_PROC_FS
@@ -1172,7 +1172,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
     increment = increment ? 1 : 0;
     max = get_num_var_ranges ();
     /*  Search for existing MTRR  */
-    spin_lock_reschedule (&main_lock);
+    down(&main_lock);
     for (i = 0; i < max; ++i)
     {
        (*get_mtrr) (i, &lbase, &lsize, &ltype);
@@ -1181,7 +1181,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
        /*  At this point we know there is some kind of overlap/enclosure  */
        if ( (base < lbase) || (base + size > lbase + lsize) )
        {
-           spin_unlock (&main_lock);
+           up(&main_lock);
            printk ("mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n",
                    base, size, lbase, lsize);
            return -EINVAL;
@@ -1190,14 +1190,14 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
        if (ltype != type)
        {
            if (type == MTRR_TYPE_UNCACHABLE) continue;
-           spin_unlock (&main_lock);
+           up(&main_lock);
            printk ( "mtrr: type mismatch for %lx,%lx old: %s new: %s\n",
                     base, size, attrib_to_str (ltype), attrib_to_str (type) );
            return -EINVAL;
        }
        if (increment) ++usage_table[i];
        compute_ascii ();
-       spin_unlock (&main_lock);
+       up(&main_lock);
        return i;
     }
     /*  Search for an empty MTRR  */
@@ -1211,7 +1211,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
     set_mtrr (i, base, size, type);
     usage_table[i] = 1;
     compute_ascii ();
-    spin_unlock (&main_lock);
+    up(&main_lock);
     return i;
 }   /*  End Function mtrr_add  */
 
@@ -1232,7 +1232,7 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
 
     if ( !(boot_cpu_data.x86_capability & X86_FEATURE_MTRR) ) return -ENODEV;
     max = get_num_var_ranges ();
-    spin_lock_reschedule (&main_lock);
+    down(&main_lock);
     if (reg < 0)
     {
        /*  Search for existing MTRR  */
@@ -1247,14 +1247,14 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
        }
        if (reg < 0)
        {
-           spin_unlock (&main_lock);
+           up(&main_lock);
            printk ("mtrr: no MTRR for %lx,%lx found\n", base, size);
            return -EINVAL;
        }
     }
     if (reg >= max)
     {
-       spin_unlock (&main_lock);
+       up(&main_lock);
        printk ("mtrr: register: %d too big\n", reg);
        return -EINVAL;
     }
@@ -1262,7 +1262,7 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
     {
        if ((reg == 3) && arr3_protected)
        {
-           spin_unlock (&main_lock);
+           up(&main_lock);
            printk ("mtrr: ARR3 cannot be changed\n");
            return -EINVAL;
        }
@@ -1270,19 +1270,19 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
     (*get_mtrr) (reg, &lbase, &lsize, &ltype);
     if (lsize < 1)
     {
-       spin_unlock (&main_lock);
+       up(&main_lock);
        printk ("mtrr: MTRR %d not used\n", reg);
        return -EINVAL;
     }
     if (usage_table[reg] < 1)
     {
-       spin_unlock (&main_lock);
+       up(&main_lock);
        printk ("mtrr: reg: %d has count=0\n", reg);
        return -EINVAL;
     }
     if (--usage_table[reg] < 1) set_mtrr (reg, 0, 0, 0);
     compute_ascii ();
-    spin_unlock (&main_lock);
+    up(&main_lock);
     return reg;
 }   /*  End Function mtrr_del  */
 
diff --git a/arch/i386/kernel/pci-i386.c b/arch/i386/kernel/pci-i386.c
new file mode 100644 (file)
index 0000000..af36261
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ *     Low-Level PCI Access for i386 machines
+ *
+ * Copyright 1993, 1994 Drew Eckhardt
+ *      Visionary Computing
+ *      (Unix and Linux consulting and custom programming)
+ *      Drew@Colorado.EDU
+ *      +1 (303) 786-7975
+ *
+ * Drew's work was sponsored by:
+ *     iX Multiuser Multitasking Magazine
+ *     Hannover, Germany
+ *     hm@ix.de
+ *
+ * Copyright 1997--1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ * For more information, please consult the following manuals (look at
+ * http://www.pcisig.com/ for how to get them):
+ *
+ * PCI BIOS Specification
+ * PCI Local Bus Specification
+ * PCI to PCI Bridge Specification
+ * PCI System Design Guide
+ *
+ *
+ * CHANGELOG :
+ * Jun 17, 1994 : Modified to accommodate the broken pre-PCI BIOS SPECIFICATION
+ *     Revision 2.0 present on <thys@dennis.ee.up.ac.za>'s ASUS mainboard.
+ *
+ * Jan 5,  1995 : Modified to probe PCI hardware at boot time by Frederic
+ *     Potter, potter@cao-vlsi.ibp.fr
+ *
+ * Jan 10, 1995 : Modified to store the information about configured pci
+ *      devices into a list, which can be accessed via /proc/pci by
+ *      Curtis Varner, cvarner@cs.ucr.edu
+ *
+ * Jan 12, 1995 : CPU-PCI bridge optimization support by Frederic Potter.
+ *     Alpha version. Intel & UMC chipset support only.
+ *
+ * Apr 16, 1995 : Source merge with the DEC Alpha PCI support. Most of the code
+ *     moved to drivers/pci/pci.c.
+ *
+ * Dec 7, 1996  : Added support for direct configuration access of boards
+ *      with Intel compatible access schemes (tsbogend@alpha.franken.de)
+ *
+ * Feb 3, 1997  : Set internal functions to static, save/restore flags
+ *     avoid dead locks reading broken PCI BIOS, werner@suse.de 
+ *
+ * Apr 26, 1997 : Fixed case when there is BIOS32, but not PCI BIOS
+ *     (mj@atrey.karlin.mff.cuni.cz)
+ *
+ * May 7,  1997 : Added some missing cli()'s. [mj]
+ * 
+ * Jun 20, 1997 : Corrected problems in "conf1" type accesses.
+ *      (paubert@iram.es)
+ *
+ * Aug 2,  1997 : Split to PCI BIOS handling and direct PCI access parts
+ *     and cleaned it up...     Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ * Feb 6,  1998 : No longer using BIOS to find devices and device classes. [mj]
+ *
+ * May 1,  1998 : Support for peer host bridges. [mj]
+ *
+ * Jun 19, 1998 : Changed to use spinlocks, so that PCI configuration space
+ *     can be accessed from interrupts even on SMP systems. [mj]
+ *
+ * August  1998 : Better support for peer host bridges and more paranoid
+ *     checks for direct hardware access. Ugh, this file starts to look as
+ *     a large gallery of common hardware bug workarounds (watch the comments)
+ *     -- the PCI specs themselves are sane, but most implementors should be
+ *     hit hard with \hammer scaled \magstep5. [mj]
+ *
+ * Jan 23, 1999 : More improvements to peer host bridge logic. i450NX fixup. [mj]
+ *
+ * Feb 8,  1999 : Added UM8886BF I/O address fixup. [mj]
+ *
+ * August  1999 : New resource management and configuration access stuff. [mj]
+ *
+ * Sep 19, 1999 : Use PCI IRQ routing tables for detection of peer host bridges.
+ *               Based on ideas by Chris Frantz and David Hinds. [mj]
+ *
+ * Sep 28, 1999 : Handle unreported/unassigned IRQs. Thanks to Shuu Yamaguchi
+ *               for a lot of patience during testing. [mj]
+ *
+ * Oct  8, 1999 : Split to pci-i386.c, pci-pc.c and pci-visws.c. [mj]
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/errno.h>
+
+#include "pci-i386.h"
+
+/*
+ * Assign new address to PCI resource.  We hope our resource information
+ * is complete.  On the PC, we don't re-assign resources unless we are
+ * forced to do so.
+ *
+ * Expects start=0, end=size-1, flags=resource type.
+ */
+
+static int __init pcibios_assign_resource(struct pci_dev *dev, int i)
+{
+       struct resource *r = &dev->resource[i];
+       struct resource *pr = pci_find_parent_resource(dev, r);
+       unsigned long size = r->end + 1;
+       u32 new, check;
+
+       if (!pr) {
+               printk(KERN_ERR "PCI: Cannot find parent resource for device %s\n", dev->slot_name);
+               return -EINVAL;
+       }
+       if (r->flags & IORESOURCE_IO) {
+               /*
+                * We need to avoid collisions with `mirrored' VGA ports and other strange
+                * ISA hardware, so we always want the addresses kilobyte aligned.
+                */
+               if (size > 0x100) {
+                       printk(KERN_ERR "PCI: I/O Region %s/%d too large (%ld bytes)\n", dev->slot_name, i, size);
+                       return -EFBIG;
+               }
+               if (allocate_resource(pr, r, size, 0x1000, ~0, 1024)) {
+                       printk(KERN_ERR "PCI: Allocation of I/O region %s/%d (%ld bytes) failed\n", dev->slot_name, i, size);
+                       return -EBUSY;
+               }
+       } else {
+               if (allocate_resource(pr, r, size, 0x10000000, ~0, size)) {
+                       printk(KERN_ERR "PCI: Allocation of memory region %s/%d (%ld bytes) failed\n", dev->slot_name, i, size);
+                       return -EBUSY;
+               }
+       }
+       if (i < 6) {
+               int reg = PCI_BASE_ADDRESS_0 + 4*i;
+               new = r->start | (r->flags & PCI_REGION_FLAG_MASK);
+               pci_write_config_dword(dev, reg, new);
+               pci_read_config_dword(dev, reg, &check);
+               if (new != check)
+                       printk(KERN_ERR "PCI: Error while updating region %s/%d (%08x != %08x)\n", dev->slot_name, i, new, check);
+       } else if (i == PCI_ROM_RESOURCE) {
+               r->flags |= PCI_ROM_ADDRESS_ENABLE;
+               pci_write_config_dword(dev, dev->rom_base_reg, r->start | (r->flags & PCI_REGION_FLAG_MASK));
+       }
+       printk("PCI: Assigned addresses %08lx-%08lx to region %s/%d\n", r->start, r->end, dev->slot_name, i);
+       return 0;
+}
+
+/*
+ *  Handle resources of PCI devices.  If the world were perfect, we could
+ *  just allocate all the resource regions and do nothing more.  It isn't.
+ *  On the other hand, we cannot just re-allocate all devices, as it would
+ *  require us to know lots of host bridge internals.  So we attempt to
+ *  keep as much of the original configuration as possible, but tweak it
+ *  when it's found to be wrong.
+ *
+ *  Known BIOS problems we have to work around:
+ *     - I/O or memory regions not configured
+ *     - regions configured, but not enabled in the command register
+ *     - bogus I/O addresses above 64K used
+ *     - expansion ROMs left enabled (this may sound harmless, but given
+ *       the fact the PCI specs explicitly allow address decoders to be
+ *       shared between expansion ROMs and other resource regions, it's
+ *       at least dangerous)
+ *
+ *  Our solution:
+ *     (1) Allocate resources for all buses behind PCI-to-PCI bridges.
+ *         This gives us fixed barriers on where we can allocate.
+ *     (2) Allocate resources for all enabled devices.  If there is
+ *         a collision, just mark the resource as unallocated. Also
+ *         disable expansion ROMs during this step.
+ *     (3) Try to allocate resources for disabled devices.  If the
+ *         resources were assigned correctly, everything goes well,
+ *         if they weren't, they won't disturb allocation of other
+ *         resources.
+ *     (4) Assign new addresses to resources which were either
+ *         not configured at all or misconfigured.  If explicitly
+ *         requested by the user, configure expansion ROM address
+ *         as well.  Finally enable the I/O and Memory bits.
+ */
+
+static void __init pcibios_allocate_bus_resources(struct pci_bus *bus)
+{
+       struct pci_dev *dev;
+       int idx;
+       struct resource *r, *pr;
+
+       /* Depth-First Search on bus tree */
+       while (bus) {
+               if ((dev = bus->self)) {
+                       for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
+                               r = &dev->resource[idx];
+                               if (!r->start)
+                                       continue;
+                               pr = pci_find_parent_resource(dev, r);
+                               if (!pr || request_resource(pr, r) < 0)
+                                       printk(KERN_ERR "PCI: Cannot allocate resource region %d of bridge %s\n", idx, dev->slot_name);
+                       }
+               }
+               if (bus->children)
+                       pcibios_allocate_bus_resources(bus->children);
+               bus = bus->next;
+       }
+}
+
+static void __init pcibios_allocate_resources(int pass)
+{
+       struct pci_dev *dev;
+       int idx, disabled;
+       u16 command;
+       struct resource *r, *pr;
+
+       for(dev=pci_devices; dev; dev=dev->next) {
+               pci_read_config_word(dev, PCI_COMMAND, &command);
+               for(idx = 0; idx < 6; idx++) {
+                       r = &dev->resource[idx];
+                       if (r->parent)          /* Already allocated */
+                               continue;
+                       if (!r->start)          /* Address not assigned at all */
+                               continue;
+                       if (r->flags & IORESOURCE_IO)
+                               disabled = !(command & PCI_COMMAND_IO);
+                       else
+                               disabled = !(command & PCI_COMMAND_MEMORY);
+                       if (pass == disabled) {
+                               DBG("PCI: Resource %08lx-%08lx (f=%lx, d=%d, p=%d)\n",
+                                   r->start, r->end, r->flags, disabled, pass);
+                               pr = pci_find_parent_resource(dev, r);
+                               if (!pr || request_resource(pr, r) < 0) {
+                                       printk(KERN_ERR "PCI: Cannot allocate resource region %d of device %s\n", idx, dev->slot_name);
+                                       /* We'll assign a new address later */
+                                       r->start -= r->end;
+                                       r->start = 0;
+                               }
+                       }
+               }
+               if (!pass) {
+                       r = &dev->resource[PCI_ROM_RESOURCE];
+                       if (r->flags & PCI_ROM_ADDRESS_ENABLE) {
+                               /* Turn the ROM off, leave the resource region, but keep it unregistered. */
+                               u32 reg;
+                               DBG("PCI: Switching off ROM of %s\n", dev->slot_name);
+                               r->flags &= ~PCI_ROM_ADDRESS_ENABLE;
+                               pci_read_config_dword(dev, dev->rom_base_reg, &reg);
+                               pci_write_config_dword(dev, dev->rom_base_reg, reg & ~PCI_ROM_ADDRESS_ENABLE);
+                       }
+               }
+       }
+}
+
+static void __init pcibios_assign_resources(void)
+{
+       struct pci_dev *dev;
+       u16 cmd, old_cmd;
+       int idx;
+       int fault = 0;
+       struct resource *r;
+
+       for(dev=pci_devices; dev; dev=dev->next) {
+               pci_read_config_word(dev, PCI_COMMAND, &cmd);
+               old_cmd = cmd;
+               for(idx=0; idx<6; idx++) {
+                       r = &dev->resource[idx];
+                       if (((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && idx < 4) ||
+                           ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO)))
+                               /*
+                                *  Don't touch IDE controllers and I/O ports of video cards!
+                                *  Neither enable anything in their command registers.
+                                */
+                               continue;
+                       if (!r->start && r->end) {
+                               /*
+                                *  We shall assign a new address to this resource, either because
+                                *  the BIOS forgot to do so or because we have decided the old
+                                *  address was unusable for some reason.
+                                */
+                               if (pcibios_assign_resource(dev, idx) < 0)
+                                       fault = 1;
+                       }
+                       if (r->flags & IORESOURCE_IO)
+                               cmd |= PCI_COMMAND_IO;
+                       if (r->flags & IORESOURCE_MEM)
+                               cmd |= PCI_COMMAND_MEMORY;
+               }
+
+               if (cmd != old_cmd) {
+                       if (fault)
+                               printk("PCI: Not enabling device %s because of resource collisions\n", dev->slot_name);
+                       else {
+                               printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->slot_name, old_cmd, cmd);
+                               pci_write_config_word(dev, PCI_COMMAND, cmd);
+                       }
+               }
+
+               if (pci_probe & PCI_ASSIGN_ROMS) {
+                       r = &dev->resource[PCI_ROM_RESOURCE];
+                       r->end -= r->start;
+                       r->start = 0;
+                       if (r->end)
+                               pcibios_assign_resource(dev, PCI_ROM_RESOURCE);
+               }
+       }
+}
+
+void __init pcibios_resource_survey(void)
+{
+       pcibios_allocate_bus_resources(pci_root);
+       pcibios_allocate_resources(0);
+       pcibios_allocate_resources(1);
+       pcibios_assign_resources();
+}
diff --git a/arch/i386/kernel/pci-i386.h b/arch/i386/kernel/pci-i386.h
new file mode 100644 (file)
index 0000000..41ac2b8
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ *     Low-Level PCI Access for i386 machines.
+ *
+ *     (c) 1999 Martin Mares <mj@ucw.cz>
+ */
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define DBG(x...) printk(x)
+#else
+#define DBG(x...)
+#endif
+
+#define PCI_PROBE_BIOS 1
+#define PCI_PROBE_CONF1 2
+#define PCI_PROBE_CONF2 4
+#define PCI_NO_SORT 0x100
+#define PCI_BIOS_SORT 0x200
+#define PCI_NO_CHECKS 0x400
+#define PCI_NO_PEER_FIXUP 0x800
+#define PCI_ASSIGN_ROMS 0x1000
+#define PCI_NO_IRQ_SCAN 0x2000
+
+extern unsigned int pci_probe;
+
+/* pci-i386.c */
+
+void pcibios_resource_survey(void);
diff --git a/arch/i386/kernel/pci-pc.c b/arch/i386/kernel/pci-pc.c
new file mode 100644 (file)
index 0000000..be3076f
--- /dev/null
@@ -0,0 +1,1225 @@
+/*
+ *     Low-Level PCI Support for PC
+ *
+ *     (c) 1999 Martin Mares <mj@ucw.cz>
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/malloc.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+
+#include <asm/segment.h>
+#include <asm/io.h>
+#include <asm/smp.h>
+
+#include "pci-i386.h"
+
+unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2;
+
+/*
+ * IRQ routing table provided by the BIOS
+ */
+
+struct irq_info {
+       u8 bus, devfn;                  /* Bus, device and function */
+       struct {
+               u8 link;                /* IRQ line ID, chipset dependent, 0=not routed */
+               u16 bitmap;             /* Available IRQs */
+       } __attribute__((packed)) irq[4];
+       u8 slot;                        /* Slot number, 0=onboard */
+       u8 rfu;
+} __attribute__((packed));
+
+struct irq_routing_table {
+       u32 signature;                  /* PIRQ_SIGNATURE should be here */
+       u16 version;                    /* PIRQ_VERSION */
+       u16 size;                       /* Table size in bytes */
+       u8 rtr_bus, rtr_devfn;          /* Where the interrupt router lies */
+       u16 exclusive_irqs;             /* IRQs devoted exclusively to PCI usage */
+       u16 rtr_vendor, rtr_device;     /* Vendor and device ID of interrupt router */
+       u32 miniport_data;              /* Crap */
+       u8 rfu[11];
+       u8 checksum;                    /* Modulo 256 checksum must give zero */
+       struct irq_info slots[0];
+} __attribute__((packed));
+
+/*
+ * Direct access to PCI hardware...
+ */
+
+#ifdef CONFIG_PCI_DIRECT
+
+/*
+ * Functions for accessing PCI configuration space with type 1 accesses
+ */
+
+#define CONFIG_CMD(dev, where)   (0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) | (where & ~3))
+
+static int pci_conf1_read_config_byte(struct pci_dev *dev, int where, u8 *value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       *value = inb(0xCFC + (where&3));
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);    
+       *value = inw(0xCFC + (where&2));
+       return PCIBIOS_SUCCESSFUL;    
+}
+
+static int pci_conf1_read_config_dword(struct pci_dev *dev, int where, u32 *value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       *value = inl(0xCFC);
+       return PCIBIOS_SUCCESSFUL;    
+}
+
+static int pci_conf1_write_config_byte(struct pci_dev *dev, int where, u8 value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);    
+       outb(value, 0xCFC + (where&3));
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf1_write_config_word(struct pci_dev *dev, int where, u16 value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       outw(value, 0xCFC + (where&2));
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf1_write_config_dword(struct pci_dev *dev, int where, u32 value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       outl(value, 0xCFC);
+       return PCIBIOS_SUCCESSFUL;
+}
+
+#undef CONFIG_CMD
+
+static struct pci_ops pci_direct_conf1 = {
+       pci_conf1_read_config_byte,
+       pci_conf1_read_config_word,
+       pci_conf1_read_config_dword,
+       pci_conf1_write_config_byte,
+       pci_conf1_write_config_word,
+       pci_conf1_write_config_dword
+};
+
+/*
+ * Functions for accessing PCI configuration space with type 2 accesses
+ */
+
+#define IOADDR(devfn, where)   ((0xC000 | ((devfn & 0x78) << 5)) + where)
+#define FUNC(devfn)            (((devfn & 7) << 1) | 0xf0)
+#define SET(dev)               if (dev->devfn) return PCIBIOS_DEVICE_NOT_FOUND;                \
+                               outb(FUNC(dev->devfn), 0xCF8);                                  \
+                               outb(dev->bus->number, 0xCFA);
+
+static int pci_conf2_read_config_byte(struct pci_dev *dev, int where, u8 *value)
+{
+       SET(dev);
+       *value = inb(IOADDR(dev->devfn,where));
+       outb (0, 0xCF8);
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf2_read_config_word(struct pci_dev *dev, int where, u16 *value)
+{
+       SET(dev);
+       *value = inw(IOADDR(dev->devfn,where));
+       outb (0, 0xCF8);
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf2_read_config_dword(struct pci_dev *dev, int where, u32 *value)
+{
+       SET(dev);
+       *value = inl (IOADDR(dev->devfn,where));    
+       outb (0, 0xCF8);    
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf2_write_config_byte(struct pci_dev *dev, int where, u8 value)
+{
+       SET(dev);
+       outb (value, IOADDR(dev->devfn,where));
+       outb (0, 0xCF8);    
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf2_write_config_word(struct pci_dev *dev, int where, u16 value)
+{
+       SET(dev);
+       outw (value, IOADDR(dev->devfn,where));
+       outb (0, 0xCF8);    
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf2_write_config_dword(struct pci_dev *dev, int where, u32 value)
+{
+       SET(dev);
+       outl (value, IOADDR(dev->devfn,where));    
+       outb (0, 0xCF8);    
+       return PCIBIOS_SUCCESSFUL;
+}
+
+#undef SET
+#undef IOADDR
+#undef FUNC
+
+static struct pci_ops pci_direct_conf2 = {
+       pci_conf2_read_config_byte,
+       pci_conf2_read_config_word,
+       pci_conf2_read_config_dword,
+       pci_conf2_write_config_byte,
+       pci_conf2_write_config_word,
+       pci_conf2_write_config_dword
+};
+
+/*
+ * Before we decide to use direct hardware access mechanisms, we try to do some
+ * trivial checks to ensure it at least _seems_ to be working -- we just test
+ * whether bus 00 contains a host bridge (this is similar to checking
+ * techniques used in XFree86, but ours should be more reliable since we
+ * attempt to make use of direct access hints provided by the PCI BIOS).
+ *
+ * This should be close to trivial, but it isn't, because there are buggy
+ * chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID.
+ */
+static int __init pci_sanity_check(struct pci_ops *o)
+{
+       u16 x;
+       struct pci_bus bus;             /* Fake bus and device */
+       struct pci_dev dev;
+
+       if (pci_probe & PCI_NO_CHECKS)
+               return 1;
+       bus.number = 0;
+       dev.bus = &bus;
+       for(dev.devfn=0; dev.devfn < 0x100; dev.devfn++)
+               if ((!o->read_word(&dev, PCI_CLASS_DEVICE, &x) &&
+                    (x == PCI_CLASS_BRIDGE_HOST || x == PCI_CLASS_DISPLAY_VGA)) ||
+                   (!o->read_word(&dev, PCI_VENDOR_ID, &x) &&
+                    (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ)))
+                       return 1;
+       DBG("PCI: Sanity check failed\n");
+       return 0;
+}
+
+static struct pci_ops * __init pci_check_direct(void)
+{
+       unsigned int tmp;
+       unsigned long flags;
+
+       __save_flags(flags); __cli();
+
+       /*
+        * Check if configuration type 1 works.
+        */
+       if (pci_probe & PCI_PROBE_CONF1) {
+               outb (0x01, 0xCFB);
+               tmp = inl (0xCF8);
+               outl (0x80000000, 0xCF8);
+               if (inl (0xCF8) == 0x80000000 &&
+                   pci_sanity_check(&pci_direct_conf1)) {
+                       outl (tmp, 0xCF8);
+                       __restore_flags(flags);
+                       printk("PCI: Using configuration type 1\n");
+                       return &pci_direct_conf1;
+               }
+               outl (tmp, 0xCF8);
+       }
+
+       /*
+        * Check if configuration type 2 works.
+        */
+       if (pci_probe & PCI_PROBE_CONF2) {
+               outb (0x00, 0xCFB);
+               outb (0x00, 0xCF8);
+               outb (0x00, 0xCFA);
+               if (inb (0xCF8) == 0x00 && inb (0xCFA) == 0x00 &&
+                   pci_sanity_check(&pci_direct_conf2)) {
+                       __restore_flags(flags);
+                       printk("PCI: Using configuration type 2\n");
+                       return &pci_direct_conf2;
+               }
+       }
+
+       __restore_flags(flags);
+       return NULL;
+}
+
+#endif
+
+/*
+ * BIOS32 and PCI BIOS handling.
+ */
+
+#ifdef CONFIG_PCI_BIOS
+
+#define PCIBIOS_PCI_FUNCTION_ID        0xb1XX
+#define PCIBIOS_PCI_BIOS_PRESENT       0xb101
+#define PCIBIOS_FIND_PCI_DEVICE                0xb102
+#define PCIBIOS_FIND_PCI_CLASS_CODE    0xb103
+#define PCIBIOS_GENERATE_SPECIAL_CYCLE 0xb106
+#define PCIBIOS_READ_CONFIG_BYTE       0xb108
+#define PCIBIOS_READ_CONFIG_WORD       0xb109
+#define PCIBIOS_READ_CONFIG_DWORD      0xb10a
+#define PCIBIOS_WRITE_CONFIG_BYTE      0xb10b
+#define PCIBIOS_WRITE_CONFIG_WORD      0xb10c
+#define PCIBIOS_WRITE_CONFIG_DWORD     0xb10d
+#define PCIBIOS_GET_ROUTING_OPTIONS    0xb10e
+#define PCIBIOS_SET_PCI_HW_INT         0xb10f
+
+/* BIOS32 signature: "_32_" */
+#define BIOS32_SIGNATURE       (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24))
+
+/* PCI signature: "PCI " */
+#define PCI_SIGNATURE          (('P' << 0) + ('C' << 8) + ('I' << 16) + (' ' << 24))
+
+/* PCI service signature: "$PCI" */
+#define PCI_SERVICE            (('$' << 0) + ('P' << 8) + ('C' << 16) + ('I' << 24))
+
+/* PCI BIOS hardware mechanism flags */
+#define PCIBIOS_HW_TYPE1               0x01
+#define PCIBIOS_HW_TYPE2               0x02
+#define PCIBIOS_HW_TYPE1_SPEC          0x10
+#define PCIBIOS_HW_TYPE2_SPEC          0x20
+
+/*
+ * This is the standard structure used to identify the entry point
+ * to the BIOS32 Service Directory, as documented in
+ *     Standard BIOS 32-bit Service Directory Proposal
+ *     Revision 0.4 May 24, 1993
+ *     Phoenix Technologies Ltd.
+ *     Norwood, MA
+ * and the PCI BIOS specification.
+ */
+
+union bios32 {
+       struct {
+               unsigned long signature;        /* _32_ */
+               unsigned long entry;            /* 32 bit physical address */
+               unsigned char revision;         /* Revision level, 0 */
+               unsigned char length;           /* Length in paragraphs should be 01 */
+               unsigned char checksum;         /* All bytes must add up to zero */
+               unsigned char reserved[5];      /* Must be zero */
+       } fields;
+       char chars[16];
+};
+
+/*
+ * Physical address of the service directory.  I don't know if we're
+ * allowed to have more than one of these or not, so just in case
+ * we'll make pcibios_present() take a memory start parameter and store
+ * the array there.
+ */
+
+static struct {
+       unsigned long address;
+       unsigned short segment;
+} bios32_indirect = { 0, __KERNEL_CS };
+
+/*
+ * Returns the entry point for the given service, NULL on error
+ */
+
+static unsigned long bios32_service(unsigned long service)
+{
+       unsigned char return_code;      /* %al */
+       unsigned long address;          /* %ebx */
+       unsigned long length;           /* %ecx */
+       unsigned long entry;            /* %edx */
+       unsigned long flags;
+
+       __save_flags(flags); __cli();
+       __asm__("lcall (%%edi)"
+               : "=a" (return_code),
+                 "=b" (address),
+                 "=c" (length),
+                 "=d" (entry)
+               : "0" (service),
+                 "1" (0),
+                 "D" (&bios32_indirect));
+       __restore_flags(flags);
+
+       switch (return_code) {
+               case 0:
+                       return address + entry;
+               case 0x80:      /* Not present */
+                       printk("bios32_service(0x%lx): not present\n", service);
+                       return 0;
+               default: /* Shouldn't happen */
+                       printk("bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n",
+                               service, return_code);
+                       return 0;
+       }
+}
+
+static struct {
+       unsigned long address;
+       unsigned short segment;
+} pci_indirect = { 0, __KERNEL_CS };
+
+static int pci_bios_present;
+
+static int __init check_pcibios(void)
+{
+       u32 signature, eax, ebx, ecx;
+       u8 status, major_ver, minor_ver, hw_mech, last_bus;
+       unsigned long flags, pcibios_entry;
+
+       if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
+               pci_indirect.address = pcibios_entry + PAGE_OFFSET;
+
+               __save_flags(flags); __cli();
+               __asm__(
+                       "lcall (%%edi)\n\t"
+                       "jc 1f\n\t"
+                       "xor %%ah, %%ah\n"
+                       "1:"
+                       : "=d" (signature),
+                         "=a" (eax),
+                         "=b" (ebx),
+                         "=c" (ecx)
+                       : "1" (PCIBIOS_PCI_BIOS_PRESENT),
+                         "D" (&pci_indirect)
+                       : "memory");
+               __restore_flags(flags);
+
+               status = (eax >> 8) & 0xff;
+               hw_mech = eax & 0xff;
+               major_ver = (ebx >> 8) & 0xff;
+               minor_ver = ebx & 0xff;
+               last_bus = ecx & 0xff;
+               DBG("PCI: BIOS probe returned s=%02x hw=%02x ver=%02x.%02x l=%02x\n",
+                       status, hw_mech, major_ver, minor_ver, last_bus);
+               if (status || signature != PCI_SIGNATURE) {
+                       printk (KERN_ERR "PCI: BIOS BUG #%x[%08x] found, report to <mj@ucw.cz>\n",
+                               status, signature);
+                       return 0;
+               }
+               printk("PCI: PCI BIOS revision %x.%02x entry at 0x%lx\n",
+                       major_ver, minor_ver, pcibios_entry);
+#ifdef CONFIG_PCI_DIRECT
+               if (!(hw_mech & PCIBIOS_HW_TYPE1))
+                       pci_probe &= ~PCI_PROBE_CONF1;
+               if (!(hw_mech & PCIBIOS_HW_TYPE2))
+                       pci_probe &= ~PCI_PROBE_CONF2;
+#endif
+               return 1;
+       }
+       return 0;
+}
+
+static int __init pci_bios_find_device (unsigned short vendor, unsigned short device_id,
+                                       unsigned short index, unsigned char *bus, unsigned char *device_fn)
+{
+       unsigned short bx;
+       unsigned short ret;
+
+       __asm__("lcall (%%edi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=b" (bx),
+                 "=a" (ret)
+               : "1" (PCIBIOS_FIND_PCI_DEVICE),
+                 "c" (device_id),
+                 "d" (vendor),
+                 "S" ((int) index),
+                 "D" (&pci_indirect));
+       *bus = (bx >> 8) & 0xff;
+       *device_fn = bx & 0xff;
+       return (int) (ret & 0xff00) >> 8;
+}
+
+static int pci_bios_read_config_byte(struct pci_dev *dev, int where, u8 *value)
+{
+       unsigned long ret;
+       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
+
+       __asm__("lcall (%%esi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=c" (*value),
+                 "=a" (ret)
+               : "1" (PCIBIOS_READ_CONFIG_BYTE),
+                 "b" (bx),
+                 "D" ((long) where),
+                 "S" (&pci_indirect));
+       return (int) (ret & 0xff00) >> 8;
+}
+
+static int pci_bios_read_config_word(struct pci_dev *dev, int where, u16 *value)
+{
+       unsigned long ret;
+       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
+
+       __asm__("lcall (%%esi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=c" (*value),
+                 "=a" (ret)
+               : "1" (PCIBIOS_READ_CONFIG_WORD),
+                 "b" (bx),
+                 "D" ((long) where),
+                 "S" (&pci_indirect));
+       return (int) (ret & 0xff00) >> 8;
+}
+
+static int pci_bios_read_config_dword(struct pci_dev *dev, int where, u32 *value)
+{
+       unsigned long ret;
+       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
+
+       __asm__("lcall (%%esi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=c" (*value),
+                 "=a" (ret)
+               : "1" (PCIBIOS_READ_CONFIG_DWORD),
+                 "b" (bx),
+                 "D" ((long) where),
+                 "S" (&pci_indirect));
+       return (int) (ret & 0xff00) >> 8;
+}
+
+static int pci_bios_write_config_byte(struct pci_dev *dev, int where, u8 value)
+{
+       unsigned long ret;
+       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
+
+       __asm__("lcall (%%esi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=a" (ret)
+               : "0" (PCIBIOS_WRITE_CONFIG_BYTE),
+                 "c" (value),
+                 "b" (bx),
+                 "D" ((long) where),
+                 "S" (&pci_indirect));
+       return (int) (ret & 0xff00) >> 8;
+}
+
+static int pci_bios_write_config_word(struct pci_dev *dev, int where, u16 value)
+{
+       unsigned long ret;
+       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
+
+       __asm__("lcall (%%esi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=a" (ret)
+               : "0" (PCIBIOS_WRITE_CONFIG_WORD),
+                 "c" (value),
+                 "b" (bx),
+                 "D" ((long) where),
+                 "S" (&pci_indirect));
+       return (int) (ret & 0xff00) >> 8;
+}
+
+static int pci_bios_write_config_dword(struct pci_dev *dev, int where, u32 value)
+{
+       unsigned long ret;
+       unsigned long bx = (dev->bus->number << 8) | dev->devfn;
+
+       __asm__("lcall (%%esi)\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=a" (ret)
+               : "0" (PCIBIOS_WRITE_CONFIG_DWORD),
+                 "c" (value),
+                 "b" (bx),
+                 "D" ((long) where),
+                 "S" (&pci_indirect));
+       return (int) (ret & 0xff00) >> 8;
+}
+
+/*
+ * Function table for BIOS32 access
+ */
+
+static struct pci_ops pci_bios_access = {
+      pci_bios_read_config_byte,
+      pci_bios_read_config_word,
+      pci_bios_read_config_dword,
+      pci_bios_write_config_byte,
+      pci_bios_write_config_word,
+      pci_bios_write_config_dword
+};
+
+/*
+ * Try to find PCI BIOS.
+ */
+
+static struct pci_ops * __init pci_find_bios(void)
+{
+       union bios32 *check;
+       unsigned char sum;
+       int i, length;
+
+       /*
+        * Follow the standard procedure for locating the BIOS32 Service
+        * directory by scanning the permissible address range from
+        * 0xe0000 through 0xfffff for a valid BIOS32 structure.
+        */
+
+       for (check = (union bios32 *) __va(0xe0000);
+            check <= (union bios32 *) __va(0xffff0);
+            ++check) {
+               if (check->fields.signature != BIOS32_SIGNATURE)
+                       continue;
+               length = check->fields.length * 16;
+               if (!length)
+                       continue;
+               sum = 0;
+               for (i = 0; i < length ; ++i)
+                       sum += check->chars[i];
+               if (sum != 0)
+                       continue;
+               if (check->fields.revision != 0) {
+                       printk("PCI: unsupported BIOS32 revision %d at 0x%p, report to <mj@ucw.cz>\n",
+                               check->fields.revision, check);
+                       continue;
+               }
+               DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check);
+               if (check->fields.entry >= 0x100000) {
+                       printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check);
+                       return NULL;
+               } else {
+                       unsigned long bios32_entry = check->fields.entry;
+                       DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry);
+                       bios32_indirect.address = bios32_entry + PAGE_OFFSET;
+                       if (check_pcibios())
+                               return &pci_bios_access;
+               }
+               break;  /* Hopefully more than one BIOS32 cannot happen... */
+       }
+
+       return NULL;
+}
+
+/*
+ * Sort the device list according to PCI BIOS. Nasty hack, but since some
+ * fool forgot to define the `correct' device order in the PCI BIOS specs
+ * and we want to be (possibly bug-to-bug ;-]) compatible with older kernels
+ * which used BIOS ordering, we are bound to do this...
+ */
+
+static void __init pcibios_sort(void)
+{
+       struct pci_dev *dev = pci_devices;
+       struct pci_dev **last = &pci_devices;
+       struct pci_dev *d, **dd, *e;
+       int idx;
+       unsigned char bus, devfn;
+
+       DBG("PCI: Sorting device list...\n");
+       while ((e = dev)) {
+               idx = 0;
+               while (pci_bios_find_device(e->vendor, e->device, idx, &bus, &devfn) == PCIBIOS_SUCCESSFUL) {
+                       idx++;
+                       for(dd=&dev; (d = *dd); dd = &d->next) {
+                               if (d->bus->number == bus && d->devfn == devfn) {
+                                       *dd = d->next;
+                                       *last = d;
+                                       last = &d->next;
+                                       break;
+                               }
+                       }
+                       if (!d) {
+                               printk("PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn);
+                               /*
+                                * We must not continue scanning as several buggy BIOSes
+                                * return garbage after the last device. Grr.
+                                */
+                               break;
+                       }
+               }
+               if (e == dev) {
+                       printk("PCI: Device %02x:%02x not found by BIOS\n",
+                               dev->bus->number, dev->devfn);
+                       d = dev;
+                       dev = dev->next;
+                       *last = d;
+                       last = &d->next;
+               }
+       }
+       *last = NULL;
+}
+
+/*
+ *  Ask BIOS for IRQ Routing Table
+ */
+
+struct irq_routing_options {
+       u16 size;
+       struct irq_info *table;
+       u16 segment;
+} __attribute__((packed));
+
+static unsigned long pcibios_irq_page __initdata = 0;
+
+static inline void __init pcibios_free_irq_routing_table(void)
+{
+       if (pcibios_irq_page)
+               free_page(pcibios_irq_page);
+}
+
+static struct irq_routing_table * __init pcibios_get_irq_routing_table(void)
+{
+       struct irq_routing_options opt;
+       struct irq_routing_table *rt;
+       int ret, map;
+
+       if (pci_probe & PCI_NO_IRQ_SCAN)
+               return NULL;
+       pcibios_irq_page = __get_free_page(GFP_KERNEL);
+       if (!pcibios_irq_page)
+               return 0;
+       rt = (void *) pcibios_irq_page;
+       opt.table = rt->slots;
+       opt.size = PAGE_SIZE - sizeof(struct irq_routing_table);
+       opt.segment = __KERNEL_DS;
+
+       DBG("PCI: Fetching IRQ routing table... ");
+       __asm__("push %%es\n\t"
+               "push %%ds\n\t"
+               "pop  %%es\n\t"
+               "lcall (%%esi)\n\t"
+               "pop %%es\n\t"
+               "jc 1f\n\t"
+               "xor %%ah, %%ah\n"
+               "1:"
+               : "=a" (ret),
+                 "=b" (map)
+               : "0" (PCIBIOS_GET_ROUTING_OPTIONS),
+                 "1" (0),
+                 "D" ((long) &opt),
+                 "S" (&pci_indirect));
+       DBG("OK  ret=%d, size=%d, map=%x\n", ret, opt.size, map);
+       if (ret & 0xff00) {
+               printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", (ret >> 8) & 0xff);
+               return 0;
+       }
+
+       memset(rt, 0, sizeof(struct irq_routing_table));
+       rt->size = opt.size + sizeof(struct irq_routing_table);
+       printk("PCI: Using BIOS Interrupt Routing Table\n");
+       return rt;
+}
+
+#endif
+
+/*
+ * Several buggy motherboards address only 16 devices and mirror
+ * them to next 16 IDs. We try to detect this `feature' on all
+ * primary buses (those containing host bridges as they are
+ * expected to be unique) and remove the ghost devices.
+ */
+
+static void __init pcibios_fixup_ghosts(struct pci_bus *b)
+{
+       struct pci_dev *d, *e, **z;
+       int mirror = PCI_DEVFN(16,0);
+       int seen_host_bridge = 0;
+       int i;
+
+       DBG("PCI: Scanning for ghost devices on bus %d\n", b->number);
+       for(d=b->devices; d && d->devfn < mirror; d=d->sibling) {
+               if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
+                       seen_host_bridge++;
+               for(e=d->next; e; e=e->sibling) {
+                       if (e->devfn != d->devfn + mirror ||
+                           e->vendor != d->vendor ||
+                           e->device != d->device ||
+                           e->class != d->class)
+                               continue;
+                       for(i=0; i<PCI_NUM_RESOURCES; i++)
+                               if (e->resource[i].start != d->resource[i].start ||
+                                   e->resource[i].end != d->resource[i].end ||
+                                   e->resource[i].flags != d->resource[i].flags)
+                                       continue;
+                       break;
+               }
+               if (!e)
+                       return;
+       }
+       if (!seen_host_bridge)
+               return;
+       printk("PCI: Ignoring ghost devices on bus %02x\n", b->number);
+       for(e=b->devices; e->sibling != d; e=e->sibling);
+       e->sibling = NULL;
+       for(z=&pci_devices; (d=*z);)
+               if (d->bus == b && d->devfn >= mirror) {
+                       *z = d->next;
+                       kfree_s(d, sizeof(*d));
+               } else
+                       z = &d->next;
+}
+
+/*
+ * In case there are peer host bridges, scan bus behind each of them.
+ * Although several sources claim that the host bridges should have
+ * header type 1 and be assigned a bus number as for PCI2PCI bridges,
+ * the reality doesn't pass this test and the bus number is usually
+ * set by BIOS to the first free value.
+ */
+static void __init pcibios_fixup_peer_bridges(void)
+{
+       struct pci_bus *b = pci_root;
+       int n, cnt=-1;
+       struct pci_dev *d;
+       struct pci_ops *ops = pci_root->ops;
+
+#ifdef CONFIG_PCI_DIRECT
+       /*
+        * Don't search for peer host bridges if we use config type 2
+        * since it reads bogus values for non-existent buses and
+        * chipsets supporting multiple primary buses use conf1 anyway.
+        */
+       if (ops == &pci_direct_conf2)
+               return;
+#endif
+
+       for(d=b->devices; d; d=d->sibling)
+               if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
+                       cnt++;
+       n = b->subordinate + 1;
+       while (n <= 0xff) {
+               int found = 0;
+               u16 l;
+               struct pci_bus bus;
+               struct pci_dev dev;
+               bus.number = n;
+               bus.ops = ops;
+               dev.bus = &bus;
+               for(dev.devfn=0; dev.devfn<256; dev.devfn += 8)
+                       if (!pci_read_config_word(&dev, PCI_VENDOR_ID, &l) &&
+                           l != 0x0000 && l != 0xffff) {
+#ifdef CONFIG_PCI_BIOS
+                               if (pci_bios_present) {
+                                       int err, idx = 0;
+                                       u8 bios_bus, bios_dfn;
+                                       u16 d;
+                                       pci_read_config_word(&dev, PCI_DEVICE_ID, &d);
+                                       DBG("BIOS test for %02x:%02x (%04x:%04x)\n", n, dev.devfn, l, d);
+                                       while (!(err = pci_bios_find_device(l, d, idx, &bios_bus, &bios_dfn)) &&
+                                              (bios_bus != n || bios_dfn != dev.devfn))
+                                               idx++;
+                                       if (err)
+                                               break;
+                               }
+#endif
+                               DBG("Found device at %02x:%02x\n", n, dev.devfn);
+                               found++;
+                               if (!pci_read_config_word(&dev, PCI_CLASS_DEVICE, &l) &&
+                                   l == PCI_CLASS_BRIDGE_HOST)
+                                       cnt++;
+                       }
+               if (cnt-- <= 0)
+                       break;
+               if (found) {
+                       printk("PCI: Discovered primary peer bus %02x\n", n);
+                       b = pci_scan_bus(n, ops, NULL);
+                       if (b)
+                               n = b->subordinate;
+               }
+               n++;
+       }
+}
+
+/*
+ * Exceptions for specific devices. Usually work-arounds for fatal design flaws.
+ */
+
+static void __init pci_fixup_i450nx(struct pci_dev *d)
+{
+       /*
+        * i450NX -- Find and scan all secondary buses on all PXB's.
+        */
+       int pxb, reg;
+       u8 busno, suba, subb;
+       printk("PCI: Searching for i450NX host bridges on %s\n", d->slot_name);
+       reg = 0xd0;
+       for(pxb=0; pxb<2; pxb++) {
+               pci_read_config_byte(d, reg++, &busno);
+               pci_read_config_byte(d, reg++, &suba);
+               pci_read_config_byte(d, reg++, &subb);
+               DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb);
+               if (busno)
+                       pci_scan_bus(busno, pci_root->ops, NULL);       /* Bus A */
+               if (suba < subb)
+                       pci_scan_bus(suba+1, pci_root->ops, NULL);      /* Bus B */
+       }
+       pci_probe |= PCI_NO_PEER_FIXUP;
+}
+
+static void __init pci_fixup_umc_ide(struct pci_dev *d)
+{
+       /*
+        * UM8886BF IDE controller sets region type bits incorrectly,
+        * therefore they look like memory despite of them being I/O.
+        */
+       int i;
+
+       printk("PCI: Fixing base address flags for device %s\n", d->slot_name);
+       for(i=0; i<4; i++)
+               d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
+}
+
+static void __init pci_fixup_ide_bases(struct pci_dev *d)
+{
+       int i;
+
+       /*
+        * PCI IDE controllers use non-standard I/O port decoding, respect it.
+        */
+       if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
+               return;
+       DBG("PCI: IDE base address fixup for %s\n", d->slot_name);
+       for(i=0; i<4; i++) {
+               struct resource *r = &d->resource[i];
+               if ((r->start & ~0x80) == 0x374) {
+                       r->start |= 2;
+                       r->end = r->start;
+               }
+       }
+}
+
+struct pci_fixup pcibios_fixups[] = {
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82451NX,    pci_fixup_i450nx },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_UMC,      PCI_DEVICE_ID_UMC_UM8886BF,     pci_fixup_umc_ide },
+       { PCI_FIXUP_HEADER,     PCI_ANY_ID,             PCI_ANY_ID,                     pci_fixup_ide_bases },
+       { 0 }
+};
+
+/*
+ *  Fix up IRQs of all PCI devices.
+ */
+
+extern int skip_ioapic_setup;
+
+#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
+#define PIRQ_VERSION 0x0100
+
+/*
+ *  Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table.
+ */
+
+static struct irq_routing_table * __init pcibios_find_irq_routing_table(void)
+{
+       u8 *addr;
+       struct irq_routing_table *rt;
+       int i;
+       u8 sum;
+
+       for(addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) {
+               rt = (struct irq_routing_table *) addr;
+               if (rt->signature != PIRQ_SIGNATURE ||
+                   rt->version != PIRQ_VERSION ||
+                   rt->size % 16 ||
+                   rt->size < sizeof(struct irq_routing_table))
+                       continue;
+               sum = 0;
+               for(i=0; i<rt->size; i++)
+                       sum += addr[i];
+               if (!sum) {
+                       printk("PCI: Interrupt Routing Table found at 0x%p [router type %04x/%04x]\n",
+                              rt, rt->rtr_vendor, rt->rtr_device);
+                       return rt;
+               }
+       }
+       return NULL;
+}
+
+/*
+ *  If we have a IRQ routing table, use it to search for peer host
+ *  bridges.  It's a gross hack, but since there are no other known
+ *  ways how to get a list of buses, we have to go this way.
+ */
+
+static void __init pcibios_irq_peer_trick(struct irq_routing_table *rt)
+{
+       u8 busmap[256];
+       int i;
+       struct irq_info *e;
+
+       memset(busmap, 0, sizeof(busmap));
+       for(i=0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
+               e = &rt->slots[i];
+               DBG("b=%02x d=%02x s=%02x\n", e->bus, e->devfn, e->slot);
+               busmap[e->bus] = 1;
+       }
+       for(i=1; i<256; i++)
+               /*
+                *  It might be a secondary bus, but in this case its parent is already
+                *  known (ascending bus order) and therefore pci_scan_bus returns immediately.
+                */
+               if (busmap[i] && pci_scan_bus(i, pci_root->ops, NULL))
+                       printk("PCI: Discovered primary peer bus %02x [IRQ]\n", i);
+       pci_probe |= PCI_NO_PEER_FIXUP;
+}
+
+/*
+ *  In case BIOS forgets to tell us about IRQ, we try to look it up in the routing
+ *  table, but unfortunately we have to know the interrupt router chip.
+ */
+
+static char * __init pcibios_lookup_irq(struct pci_dev *dev, struct irq_routing_table *rt, int pin)
+{
+       struct irq_info *q;
+       struct pci_dev *router;
+       int i, pirq, newirq;
+       u32 rtrid, mask;
+       u8 x;
+
+       pin--;
+       DBG("IRQ for %s(%d)", dev->slot_name, pin);
+       while (dev->bus->self) {
+               pin = (pin + PCI_SLOT(dev->devfn)) % 4;
+               dev = dev->bus->self;
+               DBG(" -> %s(%d)", dev->slot_name, pin);
+       }
+       for(q = rt->slots, i = rt->size - sizeof(struct irq_routing_table);
+           i && (q->bus != dev->bus->number || PCI_SLOT(q->devfn) != PCI_SLOT(dev->devfn));
+           i -= sizeof(struct irq_info), q++)
+               ;
+       if (!i) {
+               DBG(" -> not found in routing table\n");
+               return NULL;
+       }
+       pirq = q->irq[pin].link;
+       mask = q->irq[pin].bitmap;
+       if (!pirq) {
+               DBG(" -> not routed\n");
+               return NULL;
+       }
+       DBG(" -> PIRQ %02x, mask %04x", pirq, mask);
+       if ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
+               newirq = 0;
+       else for(newirq = 15; newirq && !(mask & (1 << newirq)); newirq--)
+               ;
+       if (!(router = pci_find_slot(rt->rtr_bus, rt->rtr_devfn))) {
+               DBG(" -> router not found\n");
+               return NULL;
+       }
+#define ID(x,y) ((x << 16) | y)
+       rtrid = ID(rt->rtr_vendor, rt->rtr_device);
+       if (!rtrid) {
+               /*
+                * Several BIOSes forget to set the router type. In such cases, we
+                * use chip vendor/device. This doesn't guarantee us semantics of
+                * PIRQ values, but was found to work in practice and it's still
+                * better than not trying.
+                */
+               DBG(" [%s]", router->slot_name);
+               rtrid = ID(router->vendor, router->device);
+       }
+       switch (rtrid) {
+       case ID(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0):
+       case ID(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0):
+       case ID(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0):
+               /* Intel PIIX: PIRQ holds configuration register address */
+               pci_read_config_byte(router, pirq, &x);
+               if (x < 16) {
+                       DBG(" -> [PIIX] %02x\n", x);
+                       dev->irq = x;
+                       return "PIIX";
+               } else if (newirq) {
+                       DBG(" -> [PIIX] set to %02x\n", newirq);
+                       pci_write_config_byte(router, pirq, newirq);
+                       dev->irq = newirq;
+                       return "PIIX-NEW";
+               }
+               DBG(" -> [PIIX] sink\n");
+               return NULL;
+       default:
+               DBG(" -> unknown router %04x/%04x\n", rt->rtr_vendor, rt->rtr_device);
+               if (newirq && mask == (1 << newirq)) {
+                       /* Only one IRQ available -> use it */
+                       dev->irq = newirq;
+                       return "guess";
+               }
+               return NULL;
+       }
+#undef ID
+}
+
+static void __init pcibios_fixup_irqs(void)
+{
+       struct irq_routing_table *rtable;
+       struct pci_dev *dev;
+       u8 pin;
+
+       rtable = pcibios_find_irq_routing_table();
+#ifdef CONFIG_PCI_BIOS
+       if (!rtable && pci_bios_present)
+               rtable = pcibios_get_irq_routing_table();
+#endif
+
+       if (rtable)
+               pcibios_irq_peer_trick(rtable);
+
+       for(dev=pci_devices; dev; dev=dev->next) {
+               pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
+#if defined(CONFIG_X86_IO_APIC)
+               /*
+                * Recalculate IRQ numbers if we use the I/O APIC.
+                */
+               if(!skip_ioapic_setup)
+               {
+                       int irq;
+
+                       if (pin) {
+                               pin--;          /* interrupt pins are numbered starting from 1 */
+                               irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
+                               if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
+                                       struct pci_dev * bridge = dev->bus->self;
+
+                                       pin = (pin + PCI_SLOT(dev->devfn)) % 4;
+                                       irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
+                                                       PCI_SLOT(bridge->devfn), pin);
+                                       if (irq >= 0)
+                                               printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", 
+                                                       bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
+                               }
+                               if (irq >= 0) {
+                                       printk("PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
+                                               dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
+                                       dev->irq = irq;
+                               }
+                       }
+                       rtable = NULL;  /* Avoid IRQ assignment below */
+               }
+#endif
+               /*
+                * Fix out-of-range IRQ numbers and missing IRQs.
+                */
+               if (dev->irq >= NR_IRQS)
+                       dev->irq = 0;
+               if (pin && !dev->irq && rtable && rtable->version) {
+                       char *msg = pcibios_lookup_irq(dev, rtable, pin);
+                       if (msg)
+                               printk("PCI: Assigned IRQ %d to device %s [%s]\n", dev->irq, dev->slot_name, msg);
+               }
+       }
+
+#ifdef CONFIG_PCI_BIOS
+       pcibios_free_irq_routing_table();
+#endif
+}
+
+/*
+ *  Called after each bus is probed, but before its children
+ *  are examined.
+ */
+
+void __init pcibios_fixup_bus(struct pci_bus *b)
+{
+       pcibios_fixup_ghosts(b);
+       pci_read_bridge_bases(b);
+}
+
+/*
+ * Initialization. Try all known PCI access methods. Note that we support
+ * using both PCI BIOS and direct access: in such cases, we use I/O ports
+ * to access config space, but we still keep BIOS order of cards to be
+ * compatible with 2.0.X. This should go away some day.
+ */
+
+void __init pcibios_init(void)
+{
+       struct pci_ops *bios = NULL;
+       struct pci_ops *dir = NULL;
+       struct pci_ops *ops;
+
+#ifdef CONFIG_PCI_BIOS
+       if ((pci_probe & PCI_PROBE_BIOS) && ((bios = pci_find_bios()))) {
+               pci_probe |= PCI_BIOS_SORT;
+               pci_bios_present = 1;
+       }
+#endif
+#ifdef CONFIG_PCI_DIRECT
+       if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
+               dir = pci_check_direct();
+#endif
+       if (dir)
+               ops = dir;
+       else if (bios)
+               ops = bios;
+       else {
+               printk("PCI: No PCI bus detected\n");
+               return;
+       }
+
+       printk("PCI: Probing PCI hardware\n");
+       pci_scan_bus(0, ops, NULL);
+
+       pcibios_fixup_irqs();
+       if (!(pci_probe & PCI_NO_PEER_FIXUP))
+               pcibios_fixup_peer_bridges();
+       pcibios_resource_survey();
+
+#ifdef CONFIG_PCI_BIOS
+       if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
+               pcibios_sort();
+#endif
+}
+
+char * __init pcibios_setup(char *str)
+{
+       if (!strcmp(str, "off")) {
+               pci_probe = 0;
+               return NULL;
+       }
+#ifdef CONFIG_PCI_BIOS
+       else if (!strcmp(str, "bios")) {
+               pci_probe = PCI_PROBE_BIOS;
+               return NULL;
+       } else if (!strcmp(str, "nobios")) {
+               pci_probe &= ~PCI_PROBE_BIOS;
+               return NULL;
+       } else if (!strcmp(str, "nosort")) {
+               pci_probe |= PCI_NO_SORT;
+               return NULL;
+       } else if (!strcmp(str, "noirq")) {
+               pci_probe |= PCI_NO_IRQ_SCAN;
+               return NULL;
+       }
+#endif
+#ifdef CONFIG_PCI_DIRECT
+       else if (!strcmp(str, "conf1")) {
+               pci_probe = PCI_PROBE_CONF1 | PCI_NO_CHECKS;
+               return NULL;
+       }
+       else if (!strcmp(str, "conf2")) {
+               pci_probe = PCI_PROBE_CONF2 | PCI_NO_CHECKS;
+               return NULL;
+       }
+#endif
+       else if (!strcmp(str, "nopeer")) {
+               pci_probe |= PCI_NO_PEER_FIXUP;
+               return NULL;
+       } else if (!strcmp(str, "rom")) {
+               pci_probe |= PCI_ASSIGN_ROMS;
+               return NULL;
+       }
+       return str;
+}
diff --git a/arch/i386/kernel/pci-visws.c b/arch/i386/kernel/pci-visws.c
new file mode 100644 (file)
index 0000000..31a767a
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ *     Low-Level PCI Support for SGI Visual Workstation
+ *
+ *     (c) 1999 Martin Mares <mj@ucw.cz>
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/irq.h>
+
+#include <asm/smp.h>
+#include <asm/lithium.h>
+
+#include "pci-i386.h"
+
+unsigned int pci_probe = 0;
+
+/*
+ *  The VISWS uses configuration access type 1 only.
+ */
+
+#define CONFIG_CMD(dev, where)   (0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) | (where & ~3))
+
+static int pci_conf1_read_config_byte(struct pci_dev *dev, int where, u8 *value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       *value = inb(0xCFC + (where&3));
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);    
+       *value = inw(0xCFC + (where&2));
+       return PCIBIOS_SUCCESSFUL;    
+}
+
+static int pci_conf1_read_config_dword(struct pci_dev *dev, int where, u32 *value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       *value = inl(0xCFC);
+       return PCIBIOS_SUCCESSFUL;    
+}
+
+static int pci_conf1_write_config_byte(struct pci_dev *dev, int where, u8 value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);    
+       outb(value, 0xCFC + (where&3));
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf1_write_config_word(struct pci_dev *dev, int where, u16 value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       outw(value, 0xCFC + (where&2));
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int pci_conf1_write_config_dword(struct pci_dev *dev, int where, u32 value)
+{
+       outl(CONFIG_CMD(dev,where), 0xCF8);
+       outl(value, 0xCFC);
+       return PCIBIOS_SUCCESSFUL;
+}
+
+#undef CONFIG_CMD
+
+static struct pci_ops visws_pci_ops = {
+       pci_conf1_read_config_byte,
+       pci_conf1_read_config_word,
+       pci_conf1_read_config_dword,
+       pci_conf1_write_config_byte,
+       pci_conf1_write_config_word,
+       pci_conf1_write_config_dword
+};
+
+static void __init pcibios_fixup_irqs(void)
+{
+       struct pci_dev *dev, *p;
+       u8 pin;
+       int irq;
+
+       for(dev=pci_devices; dev; dev=dev->next) {
+               pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
+               dev->irq = 0;
+               if (!pin)
+                       continue;
+               pin--;
+               if (dev->bus->parent) {
+                       p = dev->bus->parent->self;
+                       pin = (pin + PCI_SLOT(dev->devfn)) % 4;
+               } else
+                       p = dev;
+               irq = visws_get_PCI_irq_vector(p->bus->number, PCI_SLOT(p->devfn), pin+1);
+               if (irq >= 0)
+                       dev->irq = irq;
+               DBG("PCI IRQ: %s pin %d -> %d\n", dev->slot_name, pin, irq);
+       }
+}
+
+void __init pcibios_fixup_bus(struct pci_bus *b)
+{
+       pci_read_bridge_bases(b);
+}
+
+#if 0
+static struct resource visws_pci_bus_resources[2] = {
+       { "Host bus 1", 0xf4000000, 0xf7ffffff, 0 },
+       { "Host bus 2", 0xf0000000, 0xf3ffffff, 0 }
+};
+#endif
+
+void __init pcibios_init(void)
+{
+       unsigned int sec_bus = li_pcib_read16(LI_PCI_BUSNUM) & 0xff;
+
+       printk("PCI: Probing PCI hardware on host buses 00 and %02x\n", sec_bus);
+       pci_scan_bus(0, &visws_pci_ops, NULL);
+       pci_scan_bus(sec_bus, &visws_pci_ops, NULL);
+       pcibios_fixup_irqs();
+       pcibios_resource_survey();
+}
+
+char * __init pcibios_setup(char *str)
+{
+       return str;
+}
index 3ba39f600f3b3174a51ab3e08ee61bf1f8dbf1a0..311bd470bfac0574d415934be4f6be4bb362901e 100644 (file)
@@ -507,7 +507,7 @@ check_if_enabled:
                if ((hwif = ide_match_hwif(base, d->bootable, d->name)) == NULL)
                        continue;       /* no room in ide_hwifs[] */
                if (hwif->io_ports[IDE_DATA_OFFSET] != base) {
-                       ide_init_hwif_ports(&hwif->hw, base, (ctl + 2), NULL);
+                       ide_init_hwif_ports(&hwif->hw, base, (ctl | 2), NULL);
                        memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
                        hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
                }
index 02212033a3bc1b30c8bdcc5ef1b6712782ac2def..c96570b73d2d654d5d17f0d67af06535344c96dc 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/malloc.h>
 #include <linux/mm.h>
 #include <linux/ioport.h>
+#include <linux/init.h>
 #include <asm/io.h>
 #include <linux/sched.h>
 #include <linux/videodev.h>
index 1337ff8e8f06b6abfa1d52537c2f1c5fb56f390d..99911093b44226f717cb4f87a53b92358bd26252 100644 (file)
 static struct acpi_facp *acpi_facp = NULL;
 static unsigned long acpi_facp_addr = 0;
 static unsigned long acpi_dsdt_addr = 0;
+
+static volatile u32 acpi_pm1_status = 0;
+static volatile u32 acpi_gpe_status = 0;
+static volatile u32 acpi_gpe_level = 0;
 static DECLARE_WAIT_QUEUE_HEAD(acpi_wait_event);
 
 /*
@@ -77,6 +81,19 @@ static void acpi_write_pm1_status(struct acpi_facp *facp, u32 value)
        }
 }
 
+/*
+ * Get the value of the fixed event enable register
+ */
+static u32 acpi_read_pm1_enable(struct acpi_facp *facp)
+{
+       int offset = facp->pm1_evt_len >> 1;
+       u32 value = inw(facp->pm1a_evt + offset);
+       if (facp->pm1b_evt) {
+               value |= inw(facp->pm1b_evt + offset);
+       }
+       return value;
+}
+
 /*
  * Set the value of the fixed event enable register (enable events)
  */
@@ -132,6 +149,28 @@ static void acpi_write_gpe_status(struct acpi_facp *facp, u32 value)
        }
 }
 
+/*
+ * Get the value of the general-purpose event enable register
+ */
+static u32 acpi_read_gpe_enable(struct acpi_facp *facp)
+{
+       u32 value = 0;
+       int i, size, offset;
+       
+       offset = facp->gpe0_len >> 1;
+       if (facp->gpe1) {
+               size = facp->gpe1_len >> 1;
+               for (i = size - 1; i >= 0; i--) {
+                       value = (value << 8) | inb(facp->gpe1 + offset + i);
+               }
+       }
+       size = facp->gpe0_len >> 1;
+       for (i = size - 1; i >= 0; i--) {
+               value = (value << 8) | inb(facp->gpe0 + offset + i);
+       }
+       return value;
+}
+
 /*
  * Set the value of the general-purpose event enable register (enable events)
  */
@@ -162,7 +201,8 @@ static struct acpi_table *__init acpi_map_table(u32 addr)
        if (addr) {
                // map table header to determine size
                table = (struct acpi_table *)
-                   ioremap_nocache((unsigned long) addr, sizeof(struct acpi_table));
+                   ioremap_nocache((unsigned long) addr,
+                                   sizeof(struct acpi_table));
                if (table) {
                        unsigned long table_size = table->length;
                        iounmap(table);
@@ -206,10 +246,13 @@ static int __init acpi_map_tables(void)
                        // strip trailing space and print OEM identifier
                        memcpy_fromio(oem, rsdp->oem, 6);
                        oem[6] = '\0';
-                       for (j = 5; j > 0 && (oem[j] == '\0' || oem[j] == ' '); j--) {
+                       for (j = 5;
+                            j > 0 && (oem[j] == '\0' || oem[j] == ' ');
+                            j--) {
                                oem[j] = '\0';
                        }
-                       printk(KERN_INFO "ACPI: \"%s\" found at 0x%p\n", oem, (void *) i);
+                       printk(KERN_INFO "ACPI: \"%s\" found at 0x%p\n",
+                              oem, (void *) i);
 
                        break;
                }
@@ -269,17 +312,32 @@ static void acpi_unmap_tables(void)
  */
 static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
-       u32 status;
-
-       // detect and disable any fixed events
-       status = acpi_read_pm1_status(acpi_facp);
-       acpi_write_pm1_enable(acpi_facp, ~status);
-
-       // detect and disable any general-purpose events
-       status = acpi_read_gpe_status(acpi_facp);
-       acpi_write_gpe_enable(acpi_facp, ~status);
-
+       u32 pm1_status, gpe_status, gpe_level, gpe_edge;
+       // detect and clear fixed events
+       pm1_status = (acpi_read_pm1_status(acpi_facp)
+                     & acpi_read_pm1_enable(acpi_facp));
+       acpi_write_pm1_status(acpi_facp, pm1_status);
+       
+       // detect and handle general-purpose events
+       gpe_status = (acpi_read_gpe_status(acpi_facp)
+                     & acpi_read_gpe_enable(acpi_facp));
+       gpe_level = gpe_status & acpi_gpe_level;
+       if (gpe_level) {
+               // disable level-triggered events
+               acpi_write_gpe_enable(
+                       acpi_facp,
+                       acpi_read_gpe_enable(acpi_facp) & ~gpe_level);
+       }
+       gpe_edge = gpe_status & ~gpe_level;
+       if (gpe_edge) {
+               // clear edge-triggered events
+               while (acpi_read_gpe_status(acpi_facp) & gpe_edge)
+                       acpi_write_gpe_status(acpi_facp, gpe_edge);
+       }
+       
        // notify process reading /dev/acpi
+       acpi_pm1_status |= pm1_status;
+       acpi_gpe_status |= gpe_status;
        wake_up_interruptible(&acpi_wait_event);
 }
 
@@ -317,17 +375,79 @@ static int acpi_ioctl(struct inode *inode,
                                     (void *) arg,
                                     sizeof(struct acpi_find_tables));
                if (!status) {
-                       struct acpi_find_tables *rqst = (struct acpi_find_tables *) arg;
+                       struct acpi_find_tables *rqst
+                               = (struct acpi_find_tables *) arg;
                        put_user(acpi_facp_addr, &rqst->facp);
                        put_user(acpi_dsdt_addr, &rqst->dsdt);
                        status = 0;
                }
                break;
+       case ACPI_ENABLE_EVENT:
+               status = verify_area(VERIFY_READ,
+                                    (void *) arg,
+                                    sizeof(struct acpi_enable_event));
+               if (!status) {
+                       struct acpi_enable_event *rqst
+                               = (struct acpi_enable_event *) arg;
+                       u32 pm1_enable, gpe_enable, gpe_level;
+                       u32 pm1_enabling, gpe_enabling;
+                       
+                       get_user(pm1_enable, &rqst->pm1_enable);
+                       get_user(gpe_enable, &rqst->gpe_enable);
+                       get_user(gpe_level, &rqst->gpe_level);
+                       gpe_level &= gpe_enable;
+                       
+                       // clear previously disabled events before enabling
+                       pm1_enabling = (pm1_enable
+                                       & ~acpi_read_pm1_enable(acpi_facp));
+                       acpi_write_pm1_status(acpi_facp, pm1_enabling);
+                       gpe_enabling = (gpe_enable &
+                                       ~acpi_read_gpe_enable(acpi_facp));
+                       while (acpi_read_gpe_status(acpi_facp) & gpe_enabling)
+                               acpi_write_gpe_status(acpi_facp, gpe_enabling);
+                       
+                       acpi_write_pm1_enable(acpi_facp, pm1_enable);
+                       acpi_write_gpe_enable(acpi_facp, gpe_enable);
+                       acpi_gpe_level = gpe_level;
+                       
+                       status = 0;
+               }
+               break;
        case ACPI_WAIT_EVENT:
-               interruptible_sleep_on(&acpi_wait_event);
-               if (signal_pending(current))
-                       return -ERESTARTSYS;
-               status = 0;
+               status = verify_area(VERIFY_WRITE,
+                                    (void *) arg,
+                                    sizeof(struct acpi_wait_event));
+               if (!status) {
+                       struct acpi_wait_event *rqst
+                               = (struct acpi_wait_event *) arg;
+                       u32 pm1_status = 0;
+                       u32 gpe_status = 0;
+                       
+                       for (;;) {
+                               unsigned long flags;
+                               
+                               // we need an atomic exchange here
+                               save_flags(flags);
+                               cli();
+                               pm1_status = acpi_pm1_status;
+                               acpi_pm1_status = 0;
+                               gpe_status = acpi_gpe_status;
+                               acpi_gpe_status = 0;
+                               restore_flags(flags);
+
+                               if (pm1_status || gpe_status)
+                                       break;
+
+                               // wait for an event to arrive
+                               interruptible_sleep_on(&acpi_wait_event);
+                               if (signal_pending(current))
+                                       return -ERESTARTSYS;
+                       }
+
+                       put_user(pm1_status, &rqst->pm1_status);
+                       put_user(gpe_status, &rqst->gpe_status);
+                       status = 0;
+               }
                break;
        }
        return status;
@@ -448,7 +568,8 @@ static void __exit acpi_exit(void)
        // disable and clear any pending events
        acpi_write_gpe_enable(acpi_facp, 0);
        while (acpi_read_gpe_status(acpi_facp)) {
-               acpi_write_gpe_status(acpi_facp, acpi_read_gpe_status(acpi_facp));
+               acpi_write_gpe_status(acpi_facp,
+                                     acpi_read_gpe_status(acpi_facp));
        }
        acpi_write_pm1_enable(acpi_facp, 0);
        acpi_write_pm1_status(acpi_facp, acpi_read_pm1_status(acpi_facp));
@@ -464,6 +585,7 @@ static void __exit acpi_exit(void)
 
 module_init(acpi_init)
 module_exit(acpi_exit)
+
 #else
 
 __initcall(acpi_init);
index 1bc4b2db1afeaff9bfa4401b95006172710ae995..8acf46f588c7947087697f3d5e284336cb29a80b 100644 (file)
@@ -151,8 +151,6 @@ static void parport_ieee1284_terminate (struct parport *port)
 {
        port = port->physport;
 
-       port->ieee1284.phase = IEEE1284_PH_TERMINATE;
-
        /* EPP terminates differently. */
        switch (port->ieee1284.mode) {
        case IEEE1284_MODE_EPP:
@@ -171,7 +169,32 @@ static void parport_ieee1284_terminate (struct parport *port)
                                      PARPORT_CONTROL_SELECT
                                      | PARPORT_CONTROL_INIT);
                break;
-               
+
+       case IEEE1284_MODE_ECP:
+       case IEEE1284_MODE_ECPRLE:
+       case IEEE1284_MODE_ECPSWE:
+               /* In ECP we can only terminate from fwd idle phase. */
+               if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE) {
+                       /* Event 47: Set nInit high */
+                       parport_frob_control (port,
+                                             PARPORT_CONTROL_INIT
+                                             | PARPORT_CONTROL_AUTOFD,
+                                             PARPORT_CONTROL_INIT
+                                             | PARPORT_CONTROL_AUTOFD);
+
+                       /* Event 49: PError goes high */
+                       parport_wait_peripheral (port,
+                                                PARPORT_STATUS_PAPEROUT,
+                                                PARPORT_STATUS_PAPEROUT);
+
+                       parport_data_forward (port);
+                       DPRINTK (KERN_DEBUG "%s: ECP direction: forward\n",
+                                port->name);
+                       port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
+               }
+
+               /* fall-though.. */
+
        default:
                /* Terminate from all other modes. */
 
index 3dcf334cdddcfc78da47e3da509203aa5feb750b..a451d85b08d145ca3d8660fd9582f96fc19f9184 100644 (file)
@@ -1758,6 +1758,8 @@ static int __init parport_pc_init_pci (int irq, int dma)
                  { { 0, -1 }, } },
                { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_B, 1,
                  { { 0, -1 }, } },
+               { PCI_VENDOR_ID_EXSYS, PCI_DEVICE_ID_EXSYS_4014, 2,
+                 { { 2, -1 }, { 3, -1 }, } },
                { 0, }
        };
 
index f0a86af6dc2738eed4727738bb8d899e4ebd905a..3b4cce5ce83aee49ef4d955f2a59f218577ba006 100644 (file)
@@ -989,6 +989,10 @@ VENDOR( ATRONICS, "Atronics" )
        DEVICE( ATRONICS,       ATRONICS_2015,  "IDE-2015PL")
 ENDVENDOR()
 
+VENDOR( EXSYS, "Exsys" )
+       DEVICE( EXSYS,          EXSYS_4014,     "EX-4014")
+ENDVENDOR()
+
 VENDOR( TIGERJET, "TigerJet" )
        DEVICE( TIGERJET,       TIGERJET_300,   "Tiger300 ISDN")
 ENDVENDOR()
index dbd078299002ab7e01c5aeac9f92cfcf500e7396..d9abefc1b7a879f6d39b5f3ac6eec8e0693148ad 100644 (file)
@@ -176,10 +176,38 @@ static int ioctl_internal_command(Scsi_Device * dev, char *cmd,
 }
 
 /*
- * This interface is depreciated - users should use the scsi generics
+ * This interface is depreciated - users should use the scsi generic (sg)
  * interface instead, as this is a more flexible approach to performing
  * generic SCSI commands on a device.
+ *
+ * The structure that we are passed should look like:
+ *
+ * struct sdata {
+ *  unsigned int inlen;             [i] Length of data to be written to device 
+ *  unsigned int outlen;     [i] Length of data to be read from device 
+ *  unsigned char cmd[x];    [i] SCSI command (6 <= x <= 12).
+ *                          [o] Data read from device starts here.
+ *                          [o] On error, sense buffer starts here.
+ *  unsigned char wdata[y];  [i] Data written to device starts here.
+ * };
+ * Notes:
+ *   - The SCSI command length is determined by examining the 1st byte
+ *     of the given command. There is no way to override this.
+ *   - Data transfers are limited to PAGE_SIZE (4K on i386, 8K on alpha).
+ *   - The length (x + y) must be at least OMAX_SB_LEN bytes long to
+ *     accomodate the sense buffer when an error occurs.
+ *     The sense buffer is truncated to OMAX_SB_LEN (16) bytes so that
+ *     old code will not be surprised.
+ *   - If a Unix error occurs (e.g. ENOMEM) then the user will receive
+ *     a negative return and the Unix error code in 'errno'. 
+ *     If the SCSI command succeeds then 0 is returned.
+ *     Positive numbers returned are the compacted SCSI error codes (4 
+ *     bytes in one int) where the lowest byte is the SCSI status.
+ *     See the drivers/scsi/scsi.h file for more information on this.
+ *
  */
+#define OMAX_SB_LEN 16   /* Old sense buffer length */
+
 int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
 {
        unsigned long flags;
@@ -195,8 +223,6 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
 
        if (!sic)
                return -EINVAL;
-
-
        /*
         * Verify that we can read at least this much.
         */
@@ -204,23 +230,13 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
        if (result)
                return result;
 
-       /*
-        * The structure that we are passed should look like:
-        *
-        * struct sdata {
-        *  unsigned int inlen;
-        *  unsigned int outlen;
-        *  unsigned char  cmd[];  # However many bytes are used for cmd.
-        *  unsigned char  data[];
-        * };
-        */
        get_user(inlen, &sic->inlen);
        get_user(outlen, &sic->outlen);
 
        /*
         * We do not transfer more than MAX_BUF with this interface.
         * If the user needs to transfer more data than this, they
-        * should use scsi_generics instead.
+        * should use scsi_generics (sg) instead.
         */
        if (inlen > MAX_BUF)
                return -EINVAL;
@@ -249,19 +265,16 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
         */
        cmdlen = COMMAND_SIZE(opcode);
 
-       result = verify_area(VERIFY_READ, cmd_in,
-                   cmdlen + inlen > MAX_BUF ? MAX_BUF : cmdlen + inlen);
+       result = verify_area(VERIFY_READ, cmd_in, cmdlen + inlen);
        if (result)
                return result;
 
-       copy_from_user((void *) cmd, cmd_in, cmdlen);
+       copy_from_user(cmd, cmd_in, cmdlen);
 
        /*
         * Obtain the data to be sent to the device (if any).
         */
-       copy_from_user((void *) buf,
-                      (void *) (cmd_in + cmdlen),
-                      inlen);
+       copy_from_user(buf, cmd_in + cmdlen, inlen);
 
        /*
         * Set the lun field to the correct value.
@@ -311,19 +324,18 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
         * If there was an error condition, pass the info back to the user. 
         */
        if (SCpnt->result) {
-               result = verify_area(VERIFY_WRITE,
-                                    cmd_in,
-                                    sizeof(SCpnt->sense_buffer));
+               int sb_len = sizeof(SCpnt->sense_buffer);
+
+               sb_len = (sb_len > OMAX_SB_LEN) ? OMAX_SB_LEN : sb_len;
+               result = verify_area(VERIFY_WRITE, cmd_in, sb_len);
                if (result)
                        return result;
-               copy_to_user((void *) cmd_in,
-                            SCpnt->sense_buffer,
-                            sizeof(SCpnt->sense_buffer));
+               copy_to_user(cmd_in, SCpnt->sense_buffer, sb_len);
        } else {
                result = verify_area(VERIFY_WRITE, cmd_in, outlen);
                if (result)
                        return result;
-               copy_to_user((void *) cmd_in, buf, outlen);
+               copy_to_user(cmd_in, buf, outlen);
        }
        result = SCpnt->result;
 
index 4a2258cb53b1ad5a730af5726d26d469de88f692..74c3c9d222786bc693487b66db373f32a9125116 100644 (file)
@@ -815,7 +815,7 @@ static void sg_command_done(Scsi_Cmnd * SCpnt)
 /* Now wake up any sg_read() that is waiting for this packet. */
     wake_up_interruptible(&sfp->read_wait);
     if ((sfp->async_qp) && (! closed))
-        kill_fasync(sfp->async_qp, SIGPOLL, POLL_IN);
+        kill_fasync(sfp->async_qp, SIGPOLL);
 }
 
 static void sg_debug_all(const Sg_fd * sfp)
index a47a38111d8f5faece42582e7de7d16803d3be41..19a76c0bddda7868e553b54f3d698d45732bc981 100644 (file)
@@ -44,7 +44,7 @@ comment 'USB Devices'
    dep_tristate '  USB CPiA Camera support' CONFIG_USB_CPIA $CONFIG_USB
    dep_tristate '  USB SCSI Support' CONFIG_USB_SCSI $CONFIG_USB
    if [ "$CONFIG_USB_SCSI" != "n" ]; then
-      dep_tristate '    USB SCSI verbose debug' CONFIG_USB_SCSI_DEBUG $CONFIG_USB_SCSI
+      bool '    USB SCSI verbose debug' CONFIG_USB_SCSI_DEBUG
    fi
    dep_tristate '  USS720 parport driver' CONFIG_USB_USS720 $CONFIG_USB $CONFIG_PARPORT
 fi
index ff6326552caa5c32b64c6de1e8b4ff30933cd5e7..1d9acb1a4995e702804e1382a56b98f96c327132 100644 (file)
@@ -6,6 +6,8 @@ int usb_printer_init(void);
 void usb_hub_cleanup(void);
 void usb_mouse_cleanup(void);
 int usb_scsi_init(void);
+int usb_hp_scanner_init(void);
+void usb_hp_scanner_cleanup(void);
 int proc_usb_init (void);
 void proc_usb_cleanup (void);
 int usb_serial_init (void);
index da5ee515ef55380120b787ce7af099d5faa7581a..4384f07d3383dfd3ef7542006a04f2dc4953f995 100644 (file)
@@ -120,7 +120,7 @@ static int mouse_irq(int state, void *__buffer, int len, void *dev_id)
 
        wake_up_interruptible(&mouse->wait);
        if (mouse->fasync)
-               kill_fasync(mouse->fasync, SIGIO, POLL_IN);
+               kill_fasync(mouse->fasync, SIGIO);
 
        return 1;
 }
index 07ed44683d812a3bdf7829f5e3e3a243bab62182..53c5e87e0dff943087dff698c8e1c3d74c77f5ab 100644 (file)
@@ -286,9 +286,12 @@ static int usb_dump_desc (const struct usb_device *dev, char *buf, int *len)
 static int usb_hcd_bandwidth (const struct usb_device *dev, char *buf, int *len)
 {
        *len += sprintf (buf + *len, format_bandwidth,
-                       dev->bus->bandwidth_allocated, FRAME_TIME_MAX_USECS_ALLOC,
-                       100 * dev->bus->bandwidth_allocated / FRAME_TIME_MAX_USECS_ALLOC,
-                       dev->bus->bandwidth_int_reqs, dev->bus->bandwidth_isoc_reqs
+                       dev->bus->bandwidth_allocated,
+                       FRAME_TIME_MAX_USECS_ALLOC,
+                       (100 * dev->bus->bandwidth_allocated + FRAME_TIME_MAX_USECS_ALLOC / 2) /
+                               FRAME_TIME_MAX_USECS_ALLOC,
+                       dev->bus->bandwidth_int_reqs,
+                       dev->bus->bandwidth_isoc_reqs
                        );
 
        return (*len >= DUMP_LIMIT) ? -1 : 0;
@@ -360,12 +363,12 @@ static int usb_device_dump (char *buf, int *len,
        if (*len >= DUMP_LIMIT)
                return -1;
 
-       if (usbdev->devnum > 0) {       /* for any except root hub */
-               if (usb_dump_desc (usbdev, buf, len) < 0)
+       if ((level == 0) && (usbdev->devnum < 0)) {     /* for root hub */
+               if (usb_hcd_bandwidth (usbdev, buf, len) < 0)
                        return -1;
        }
-       else {          /* for a host controller */
-               if (usb_hcd_bandwidth (usbdev, buf, len) < 0)
+       else {  /* for anything but a root hub */
+               if (usb_dump_desc (usbdev, buf, len) < 0)
                        return -1;
        }
 
index 9de6dc283f717f6b003050be6c219d1179f1211b..b85f2b5c6cd36097d25531e262eb6e3d12c7e77b 100644 (file)
@@ -683,7 +683,7 @@ int init_module(void)
 
 void cleanup_module(void)
 {
-       tty_unregister_driver(&acm_tty_driver);
+       tty_unregister_driver(&serial_tty_driver);
        usb_deregister(&usb_serial_driver);
 }
 
index 4ae920c1ad933e74c2ec4fc530d28011df9f4bcb..2dee323a3eff8ffa5d590b289d0c663fb7f725b5 100644 (file)
@@ -2,16 +2,16 @@
  * driver/usb/usb-core.c
  *
  * (C) Copyright David Waite 1999
- * based on code from usb.c, by Linus Torvolds
+ * based on code from usb.c, by Linus Torvalds
  *
  * The purpose of this file is to pull any and all generic modular code from
  * usb.c and put it in a separate file. This way usb.c is kept as a generic
  * library, while this file handles starting drivers, etc.
  *
  */
+
 #include <linux/kernel.h>
 #include <linux/config.h>
-#include <linux/module.h>
 
 #include "inits.h"
 #include "usb.h"
@@ -28,7 +28,6 @@
 #      endif
 #endif
 
-
 int usb_init(void)
 {
 #ifdef CONFIG_USB_PROC
@@ -77,6 +76,7 @@ int usb_init(void)
 #endif
        return 0;
 }
+
 /*
  *  Clean up when unloading the module
  */
@@ -103,10 +103,9 @@ int init_module(void)
 {
        return usb_init();
 }
+
 void cleanup_module(void)
 {
        cleanup_drivers();
 }
 #endif
-
-
index 6927620f7d2b1f87743be49ecb0d4b3356481058..f6d901aa3470b0253c2c889139fdc576a720b8ab 100644 (file)
  * are evil.
  */
 
+#ifndef EXPORT_SYMTAB
+#define EXPORT_SYMTAB
+#endif
+
 #define USB_DEBUG      1
 
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/string.h>
 #include <linux/bitops.h>
 #include <linux/malloc.h>
@@ -177,7 +182,7 @@ static long calc_bus_time (int low_speed, int input_dir, int isoc, int bytecount
  * However, this first cut at USB bandwidth allocation does not
  * contain any frame allocation tracking.
  */
-int check_bandwidth_alloc (unsigned int old_alloc, long bustime)
+static int check_bandwidth_alloc (unsigned int old_alloc, long bustime)
 {
        unsigned int    new_alloc;
 
@@ -269,6 +274,7 @@ static void usb_check_support(struct usb_device *dev)
        if (!dev->driver && dev->devnum > 0)
                usb_find_driver(dev);
 }
+
 /*
  * This entrypoint gets called for each new device.
  *
@@ -996,7 +1002,6 @@ int usb_get_configuration(struct usb_device *dev)
        return 0;
 }
 
-
 char *usb_string(struct usb_device *dev, int index)
 {
        int len, i;
@@ -1153,9 +1158,10 @@ int usb_request_irq(struct usb_device *dev, unsigned int pipe, usb_device_irq ha
        if (!ret) {
                dev->bus->bandwidth_allocated += bustime;
                dev->bus->bandwidth_int_reqs++;
-               PRINTD ("bw_alloc bumped to %d for %d requesters\n",
+               PRINTD ("bw_alloc bumped to %d for %d requesters",
                        dev->bus->bandwidth_allocated,
-                       dev->bus->bandwidth_int_reqs);
+                       dev->bus->bandwidth_int_reqs +
+                       dev->bus->bandwidth_isoc_reqs);
        }
 
        return ret;
@@ -1185,9 +1191,10 @@ int usb_release_irq(struct usb_device *dev, void *handle, unsigned int pipe)
                bustime = NS_TO_US(bustime);
                dev->bus->bandwidth_allocated -= bustime;
                dev->bus->bandwidth_int_reqs--;
-               PRINTD ("bw_alloc reduced to %d for %d requesters\n",
+               PRINTD ("bw_alloc reduced to %d for %d requesters",
                        dev->bus->bandwidth_allocated,
-                       dev->bus->bandwidth_int_reqs);
+                       dev->bus->bandwidth_int_reqs +
+                       dev->bus->bandwidth_isoc_reqs);
        }
 
        return err;
@@ -1213,11 +1220,14 @@ int usb_init_isoc (struct usb_device *usb_dev,
        long    bustime;
        int     err;
 
+       if (frame_count <= 0)
+               return -EINVAL;
+
        /* Check host controller's bandwidth for this Isoc. request. */
        /* TBD: some way to factor in frame_spacing ??? */
        bustime = calc_bus_time (0, usb_pipein(pipe), 1,
                        usb_maxpacket(usb_dev, pipe, usb_pipeout(pipe)));
-       bustime = NS_TO_US(bustime);    /* work in microseconds */
+       bustime = NS_TO_US(bustime) / frame_count;      /* work in microseconds */
        if (check_bandwidth_alloc (usb_dev->bus->bandwidth_allocated, bustime))
                return USB_ST_BANDWIDTH_ERROR;
 
@@ -1227,8 +1237,9 @@ int usb_init_isoc (struct usb_device *usb_dev,
        if (!err) {
                usb_dev->bus->bandwidth_allocated += bustime;
                usb_dev->bus->bandwidth_isoc_reqs++;
-               PRINTD ("bw_alloc bumped to %d for %d requesters\n",
+               PRINTD ("bw_alloc bumped to %d for %d requesters",
                        usb_dev->bus->bandwidth_allocated,
+                       usb_dev->bus->bandwidth_int_reqs +
                        usb_dev->bus->bandwidth_isoc_reqs);
        }
 
@@ -1243,11 +1254,12 @@ void usb_free_isoc (struct usb_isoc_desc *isocdesc)
        bustime = calc_bus_time (0, usb_pipein(isocdesc->pipe), 1,
                        usb_maxpacket(isocdesc->usb_dev, isocdesc->pipe,
                        usb_pipeout(isocdesc->pipe)));
-       bustime = NS_TO_US(bustime);
+       bustime = NS_TO_US(bustime) / isocdesc->frame_count;
        isocdesc->usb_dev->bus->bandwidth_allocated -= bustime;
        isocdesc->usb_dev->bus->bandwidth_isoc_reqs--;
-       PRINTD ("bw_alloc reduced to %d for %d requesters\n",
+       PRINTD ("bw_alloc reduced to %d for %d requesters",
                isocdesc->usb_dev->bus->bandwidth_allocated,
+               isocdesc->usb_dev->bus->bandwidth_int_reqs +
                isocdesc->usb_dev->bus->bandwidth_isoc_reqs);
 
        isocdesc->usb_dev->bus->op->free_isoc (isocdesc);
@@ -1276,3 +1288,49 @@ struct list_head *usb_bus_get_list(void)
 }
 #endif
 
+/*
+ * USB may be built into the kernel or be built as modules.
+ * If the USB core [and maybe a host controller driver] is built
+ * into the kernel, and other device drivers are built as modules,
+ * then these symbols need to be exported for the modules to use.
+ */
+EXPORT_SYMBOL(usb_register);
+EXPORT_SYMBOL(usb_deregister);
+EXPORT_SYMBOL(usb_alloc_bus);
+EXPORT_SYMBOL(usb_free_bus);
+EXPORT_SYMBOL(usb_register_bus);
+EXPORT_SYMBOL(usb_deregister_bus);
+EXPORT_SYMBOL(usb_alloc_dev);
+EXPORT_SYMBOL(usb_free_dev);
+EXPORT_SYMBOL(usb_inc_dev_use);
+
+EXPORT_SYMBOL(usb_init_root_hub);
+EXPORT_SYMBOL(usb_new_device);
+EXPORT_SYMBOL(usb_connect);
+EXPORT_SYMBOL(usb_disconnect);
+
+EXPORT_SYMBOL(usb_set_address);
+EXPORT_SYMBOL(usb_get_descriptor);
+EXPORT_SYMBOL(usb_get_string);
+EXPORT_SYMBOL(usb_string);
+EXPORT_SYMBOL(usb_get_protocol);
+EXPORT_SYMBOL(usb_set_protocol);
+EXPORT_SYMBOL(usb_get_report);
+EXPORT_SYMBOL(usb_set_idle);
+EXPORT_SYMBOL(usb_clear_halt);
+EXPORT_SYMBOL(usb_set_interface);
+EXPORT_SYMBOL(usb_get_configuration);
+EXPORT_SYMBOL(usb_set_configuration);
+
+EXPORT_SYMBOL(usb_control_msg);
+EXPORT_SYMBOL(usb_request_irq);
+EXPORT_SYMBOL(usb_release_irq);
+/* EXPORT_SYMBOL(usb_bulk_msg); */
+EXPORT_SYMBOL(usb_request_bulk);
+EXPORT_SYMBOL(usb_terminate_bulk);
+
+EXPORT_SYMBOL(usb_get_current_frame_number);
+EXPORT_SYMBOL(usb_init_isoc);
+EXPORT_SYMBOL(usb_free_isoc);
+EXPORT_SYMBOL(usb_run_isoc);
+EXPORT_SYMBOL(usb_kill_isoc);
index 3f050b0cdcf3d9d84035f1a568f8d42f42601bad..4057536bb7a3552ca63d1e1c70679fa618f2fa1e 100644 (file)
 #define USB_DIR_OUT                    0
 #define USB_DIR_IN                     0x80
 
+#define USB_ENDPOINT_NUMBER_MASK       0x0f    /* in bEndpointAddress */
+#define USB_ENDPOINT_DIR_MASK          0x80
+
+#define USB_ENDPOINT_XFERTYPE_MASK     0x03    /* in bmAttributes */
+#define USB_ENDPOINT_XFER_CONTROL      0
+#define USB_ENDPOINT_XFER_ISOC         1
+#define USB_ENDPOINT_XFER_BULK         2
+#define USB_ENDPOINT_XFER_INT          3
+
 /*
  * USB Packet IDs (PIDs)
  */
@@ -706,7 +715,7 @@ void usb_show_string(struct usb_device *dev, char *id, int index);
 #ifdef USB_DEBUG
 #define PRINTD(format, args...) printk("usb: " format "\n" , ## args);
 #else /* NOT DEBUGGING */
-#define PRINTD(fmt, arg...) do {} while (0) /**/
+#define PRINTD(fmt, arg...) do {} while (0)
 #endif /* USB_DEBUG */
 /* A simple way to change one line from DEBUG to NOT DEBUG: */
 #define XPRINTD(fmt, arg...)   do {} while (0)
index 04ff501749d085feb4120d8eb98ad7cfefdf10b5..d29622cad44a08ec043ff7df956dde7f31c5705e 100644 (file)
@@ -5,7 +5,6 @@
  *
  */
 
-#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/signal.h>
index c4fefe5cc1bc3ead231f85cf89ed6b60d4061b81..5fa99a017146f3f8da685c0a2d39cd22cccd4305 100644 (file)
@@ -1512,8 +1512,8 @@ int block_write_cont_page(struct file *file, struct page *page, unsigned long of
        char * target_buf, *target_data;
        unsigned long data_offset = offset;
 
-       offset = page->offset-inode->i_size;
-       if (offset < 0) 
+       offset = inode->i_size - page->offset;
+       if (page->offset>inode->i_size)
                offset = 0;
        else if (offset >= data_offset)
                offset = data_offset;
index 19b91b74f6731ad095398af8ef43850bc0acfe5e..5baa51af456fa8103e92360e94fc160efc657609 100644 (file)
@@ -60,7 +60,7 @@ struct inode_operations fat_file_inode_operations = {
        fat_get_block,          /* get_block */
        block_read_full_page,   /* readpage */
        NULL,                   /* writepage */
-       NULL,                   /* flushpage */
+       block_flushpage,        /* flushpage */
        fat_truncate,           /* truncate */
        NULL,                   /* permission */
        NULL,                   /* smap */
@@ -118,7 +118,7 @@ static int fat_write_partial_page(struct file *file, struct page *page, unsigned
        unsigned long page_cache = 0;
        long status;
 
-       pgpos = inode->i_size & PAGE_CACHE_MASK;
+       pgpos = MSDOS_I(inode)->i_realsize & PAGE_CACHE_MASK;
        while (pgpos < page->offset) {
                hash = page_hash(inode, pgpos);
 repeat_find:   new_page = __find_lock_page(inode, pgpos, hash);
index 2ddbe62ac74aaa25af26145971129291398f0f04..594c996e3a83e6118bc62bea0f5026858c366095 100644 (file)
@@ -183,22 +183,6 @@ dentry->d_parent->d_name.name, dentry->d_name.name);
        }
 }
 
-/*
- * Generate a unique inode number.
- */
-ino_t ncp_invent_inos(unsigned long n)
-{
-       static ino_t ino = 2;
-
-       if (ino + 2*n < ino)
-       {
-               /* wrap around */
-               ino = 2;
-       }
-       ino += n;
-       return ino;
-}
-
 static inline int
 ncp_single_volume(struct ncp_server *server)
 {
@@ -449,7 +433,7 @@ ncp_do_simple_filldir(struct file *filp, char* name, int len,
        ino = find_inode_number(dentry, &qname);
 
        if (!ino)
-               ino = ncp_invent_inos(1);
+               ino = iunique(2);
 
        result = filldir(dirent, name, len, filp->f_pos, ino);
        if (!result)
@@ -494,7 +478,7 @@ ncp_do_filldir(struct file *filp, struct ncp_entry_info *entry, void *dirent,
 
                if (!newdent->d_inode) {
                        entry->opened = 0;
-                       entry->ino = ncp_invent_inos(1);
+                       entry->ino = iunique(2);
                        newino = ncp_iget(inode->i_sb, entry);
                        if (newino) {
                                newdent->d_op = &ncp_dentry_operations;
@@ -517,7 +501,7 @@ end_advance:
                ino = find_inode_number(dentry, &qname);
 
        if (!ino)
-               ino = ncp_invent_inos(1);
+               ino = iunique(2);
 
        result = filldir(dirent, entry->i.entryName, entry->i.nameLen,
                                filp->f_pos, ino);
@@ -810,7 +794,7 @@ dentry->d_parent->d_name.name, __name, res);
         * Create an inode for the entry.
         */
        finfo.opened = 0;
-       finfo.ino = ncp_invent_inos(1);
+       finfo.ino = iunique(2);
        error = -EACCES;
        inode = ncp_iget(dir->i_sb, &finfo);
 
@@ -838,7 +822,7 @@ static int ncp_instantiate(struct inode *dir, struct dentry *dentry,
        struct inode *inode;
        int error = -EINVAL;
 
-       finfo->ino = ncp_invent_inos(1);
+       finfo->ino = iunique(2);
        inode = ncp_iget(dir->i_sb, finfo);
        if (!inode)
                goto out_close;
index 6144d57479afd84dc46ab9673129ade268ebf0b4..e2d8a8a0fd9dced8556c88f75b407437ba8c6321 100644 (file)
@@ -31,7 +31,6 @@
 
 #include "ncplib_kernel.h"
 
-static void ncp_read_inode(struct inode *);
 static void ncp_put_inode(struct inode *);
 static void ncp_delete_inode(struct inode *);
 static void ncp_put_super(struct super_block *);
@@ -39,7 +38,7 @@ static int  ncp_statfs(struct super_block *, struct statfs *, int);
 
 static struct super_operations ncp_sops =
 {
-       ncp_read_inode,         /* read inode */
+       NULL,                   /* read inode */
        NULL,                   /* write inode */
        ncp_put_inode,          /* put inode */
        ncp_delete_inode,       /* delete inode */
@@ -56,9 +55,6 @@ extern struct inode_operations ncp_symlink_inode_operations;
 extern int ncp_symlink(struct inode*, struct dentry*, const char*);
 #endif
 
-static struct ncp_entry_info *read_nwinfo = NULL;
-static DECLARE_MUTEX(read_sem);
-
 /*
  * Fill in the ncpfs-specific information in the inode.
  */
@@ -216,33 +212,7 @@ static void ncp_set_attr(struct inode *inode, struct ncp_entry_info *nwinfo)
 }
 
 /*
- * This is called from iget() with the read semaphore held. 
- * The global ncp_entry_info structure has been set up by ncp_iget.
- */
-static void ncp_read_inode(struct inode *inode)
-{
-       if (read_nwinfo == NULL) {
-               printk(KERN_ERR "ncp_read_inode: invalid call\n");
-               return;
-       }
-
-       ncp_set_attr(inode, read_nwinfo);
-
-       if (S_ISREG(inode->i_mode)) {
-               inode->i_op = &ncp_file_inode_operations;
-       } else if (S_ISDIR(inode->i_mode)) {
-               inode->i_op = &ncp_dir_inode_operations;
-#ifdef CONFIG_NCPFS_EXTRAS
-       } else if (S_ISLNK(inode->i_mode)) {
-               inode->i_op = &ncp_symlink_inode_operations;
-#endif
-       } else {
-               inode->i_op = NULL;
-       }
-}
-
-/*
- * Set up the ncp_entry_info pointer and get a new inode.
+ * Get a new inode.
  */
 struct inode * 
 ncp_iget(struct super_block *sb, struct ncp_entry_info *info)
@@ -254,12 +224,23 @@ ncp_iget(struct super_block *sb, struct ncp_entry_info *info)
                return NULL;
        }
 
-       down(&read_sem);
-       read_nwinfo = info;
-       inode = iget(sb, info->ino);
-       read_nwinfo = NULL;
-       up(&read_sem);
-       if (!inode)
+       inode = get_empty_inode();
+       if (inode) {
+               inode->i_sb = sb;
+               inode->i_dev = sb->s_dev;
+               inode->i_ino = info->ino;
+               ncp_set_attr(inode, info);
+               if (S_ISREG(inode->i_mode)) {
+                       inode->i_op = &ncp_file_inode_operations;
+               } else if (S_ISDIR(inode->i_mode)) {
+                       inode->i_op = &ncp_dir_inode_operations;
+#ifdef CONFIG_NCPFS_EXTRAS
+               } else if (S_ISLNK(inode->i_mode)) {
+                       inode->i_op = &ncp_symlink_inode_operations;
+#endif
+               }
+               insert_inode_hash(inode);
+       } else
                printk(KERN_ERR "ncp_iget: iget failed!\n");
        return inode;
 }
@@ -710,9 +691,6 @@ int init_module(void)
 {
        DPRINTK(KERN_DEBUG "ncpfs: init_module called\n");
 
-       init_MUTEX(&read_sem);
-       read_nwinfo = NULL;
-
 #ifdef DEBUG_NCP_MALLOC
        ncp_malloced = 0;
        ncp_current_malloced = 0;
index 3682975d4df5299579224d1f6a21cc0add1c1e6d..d6521ab67b40697ba7254a1236b653c15dfc8d74 100644 (file)
 #define ACPI_FACP_SIG  0x50434146 /* 'FACP' */
 #define ACPI_DSDT_SIG  0x54445344 /* 'DSDT' */
 
-/* PM1_STS flags */
-#define ACPI_TMR_STS    0x0001
-#define ACPI_BM_STS     0x0010
-#define ACPI_GBL_STS    0x0020
-#define ACPI_PWRBTN_STS 0x0100
-#define ACPI_SLPBTN_STS 0x0200
-#define ACPI_RTC_STS    0x0400
-#define ACPI_WAK_STS    0x8000
-
-/* PM1_EN flags */
-#define ACPI_TMR_EN    0x0001
-#define ACPI_GBL_EN    0x0020
-#define ACPI_PWRBTN_EN 0x0100
-#define ACPI_SLPBTN_EN 0x0200
-#define ACPI_RTC_EN    0x0400
+/* PM1_STS/EN flags */
+#define ACPI_TMR    0x0001
+#define ACPI_BM     0x0010
+#define ACPI_GBL    0x0020
+#define ACPI_PWRBTN 0x0100
+#define ACPI_SLPBTN 0x0200
+#define ACPI_RTC    0x0400
+#define ACPI_WAK    0x8000
 
 /* PM1_CNT flags */
 #define ACPI_SCI_EN   0x0001
@@ -150,11 +143,23 @@ struct acpi_facp {
 };
 
 #define ACPI_FIND_TABLES       _IOR('A', 1, struct acpi_find_tables)
-#define ACPI_WAIT_EVENT                _IO('A', 2)
+#define ACPI_ENABLE_EVENT      _IOW('A', 2, struct acpi_enable_event)
+#define ACPI_WAIT_EVENT                _IOR('A', 3, struct acpi_wait_event)
 
 struct acpi_find_tables {
-       unsigned long facp;
-       unsigned long dsdt;
+       unsigned long facp; /* FACP physical address */
+       unsigned long dsdt; /* DSDT physical address */
+};
+
+struct acpi_enable_event {
+        __u32 pm1_enable; /* fixed events */
+        __u32 gpe_enable; /* general-purpose events (GPEs) */
+        __u32 gpe_level;  /* level-triggered GPEs */
+};
+
+struct acpi_wait_event {
+        __u32 pm1_status; /* fixed events */
+        __u32 gpe_status; /* general-purpose events */
 };
 
 #ifdef __KERNEL__
index 923516e5098b260f5bd72053256000f1955b3a9b..94b391282d6106de9d5ac126cb738e9cdbfb4ac3 100644 (file)
 #define PCI_VENDOR_ID_HOLTEK           0x9412
 #define PCI_DEVICE_ID_HOLTEK_6565      0x6565
 
+#define PCI_VENDOR_ID_EXSYS            0xd84d
+#define PCI_DEVICE_ID_EXSYS_4014               0x4014
+
 #define PCI_VENDOR_ID_TIGERJET         0xe159
 #define PCI_DEVICE_ID_TIGERJET_300     0x0001
 
index 94a8215afe89c08bc3d127be2fab085bc859a2c4..ca9275af18f6e8a7539a000a5fdca12dceaed215 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -7,6 +7,7 @@
  *
  * /proc/sysvipc/shm support (c) 1999 Dragos Acostachioaie <dragos@iname.com>
  * BIGMEM support, Andrea Arcangeli <andrea@suse.de>
+ * SMP thread shm, Jean-Luc Boyard <jean-luc.boyard@siemens.fr>
  */
 
 #include <linux/config.h>
@@ -41,11 +42,13 @@ static int shm_tot = 0; /* total number of shared memory pages */
 static int shm_rss = 0; /* number of shared memory pages that are in memory */
 static int shm_swp = 0; /* number of shared memory pages that are in swap */
 static int max_shmid = 0; /* every used id is <= max_shmid */
-static DECLARE_WAIT_QUEUE_HEAD(shm_lock); /* calling findkey() may need to wait */
+static DECLARE_WAIT_QUEUE_HEAD(shm_wait); /* calling findkey() may need to wait */
 static struct shmid_kernel *shm_segs[SHMMNI];
 
 static unsigned short shm_seq = 0; /* incremented, for recognizing stale ids */
 
+spinlock_t shm_lock = SPIN_LOCK_UNLOCKED;
+
 /* some statistics */
 static ulong swap_attempts = 0;
 static ulong swap_successes = 0;
@@ -61,7 +64,7 @@ void __init shm_init (void)
        for (id = 0; id < SHMMNI; id++)
                shm_segs[id] = (struct shmid_kernel *) IPC_UNUSED;
        shm_tot = shm_rss = shm_seq = max_shmid = used_segs = 0;
-       init_waitqueue_head(&shm_lock);
+       init_waitqueue_head(&shm_wait);
 #ifdef CONFIG_PROC_FS
        ent = create_proc_entry("sysvipc/shm", 0, 0);
        ent->read_proc = sysvipc_shm_read_proc;
@@ -75,8 +78,21 @@ static int findkey (key_t key)
        struct shmid_kernel *shp;
 
        for (id = 0; id <= max_shmid; id++) {
-               while ((shp = shm_segs[id]) == IPC_NOID)
-                       sleep_on (&shm_lock);
+               if ((shp = shm_segs[id]) == IPC_NOID) {
+                       DECLARE_WAITQUEUE(wait, current);
+
+                       add_wait_queue(&shm_wait, &wait);
+                       for(;;) {
+                               set_current_state(TASK_UNINTERRUPTIBLE);
+                               if ((shp = shm_segs[id]) != IPC_NOID)
+                                       break;
+                               spin_unlock(&shm_lock);
+                               schedule();
+                               spin_lock(&shm_lock);
+                       }
+                       __set_current_state(TASK_RUNNING);
+                       remove_wait_queue(&shm_wait, &wait);
+               }
                if (shp == IPC_UNUSED)
                        continue;
                if (key == shp->u.shm_perm.key)
@@ -106,28 +122,30 @@ static int newseg (key_t key, int shmflg, int size)
        return -ENOSPC;
 
 found:
+       spin_unlock(&shm_lock);
        shp = (struct shmid_kernel *) kmalloc (sizeof (*shp), GFP_KERNEL);
        if (!shp) {
+               spin_lock(&shm_lock);
                shm_segs[id] = (struct shmid_kernel *) IPC_UNUSED;
-               wake_up (&shm_lock);
+               wake_up (&shm_wait);
                return -ENOMEM;
        }
-
+       lock_kernel();
        shp->shm_pages = (ulong *) vmalloc (numpages*sizeof(ulong));
+       unlock_kernel();
        if (!shp->shm_pages) {
-               shm_segs[id] = (struct shmid_kernel *) IPC_UNUSED;
-               wake_up (&shm_lock);
                kfree(shp);
+               spin_lock(&shm_lock);
+               shm_segs[id] = (struct shmid_kernel *) IPC_UNUSED;
+               wake_up (&shm_wait);
                return -ENOMEM;
        }
 
        for (i = 0; i < numpages; shp->shm_pages[i++] = 0);
-       shm_tot += numpages;
        shp->u.shm_perm.key = key;
        shp->u.shm_perm.mode = (shmflg & S_IRWXUGO);
        shp->u.shm_perm.cuid = shp->u.shm_perm.uid = current->euid;
        shp->u.shm_perm.cgid = shp->u.shm_perm.gid = current->egid;
-       shp->u.shm_perm.seq = shm_seq;
        shp->u.shm_segsz = size;
        shp->u.shm_cpid = current->pid;
        shp->attaches = NULL;
@@ -136,11 +154,16 @@ found:
        shp->u.shm_ctime = CURRENT_TIME;
        shp->shm_npages = numpages;
 
+       spin_lock(&shm_lock);
+
+       shm_tot += numpages;
+       shp->u.shm_perm.seq = shm_seq;
+
        if (id > max_shmid)
                max_shmid = id;
        shm_segs[id] = shp;
        used_segs++;
-       wake_up (&shm_lock);
+       wake_up (&shm_wait);
        return (unsigned int) shp->u.shm_perm.seq * SHMMNI + id;
 }
 
@@ -152,7 +175,7 @@ asmlinkage long sys_shmget (key_t key, int size, int shmflg)
        int err, id = 0;
 
        down(&current->mm->mmap_sem);
-       lock_kernel();
+       spin_lock(&shm_lock);
        if (size < 0 || size > shmmax) {
                err = -EINVAL;
        } else if (key == IPC_PRIVATE) {
@@ -175,7 +198,7 @@ asmlinkage long sys_shmget (key_t key, int size, int shmflg)
                else
                        err = (int) shp->u.shm_perm.seq * SHMMNI + id;
        }
-       unlock_kernel();
+       spin_unlock(&shm_lock);
        up(&current->mm->mmap_sem);
        return err;
 }
@@ -188,6 +211,7 @@ static void killseg (int id)
 {
        struct shmid_kernel *shp;
        int i, numpages;
+       int rss, swp;
 
        shp = shm_segs[id];
        if (shp == IPC_NOID || shp == IPC_UNUSED) {
@@ -204,23 +228,31 @@ static void killseg (int id)
                printk ("shm nono: killseg shp->pages=NULL. id=%d\n", id);
                return;
        }
+       spin_unlock(&shm_lock);
        numpages = shp->shm_npages;
-       for (i = 0; i < numpages ; i++) {
+       for (i = 0, rss = 0, swp = 0; i < numpages ; i++) {
                pte_t pte;
                pte = __pte(shp->shm_pages[i]);
                if (pte_none(pte))
                        continue;
                if (pte_present(pte)) {
                        free_page (pte_page(pte));
-                       shm_rss--;
+                       rss++;
                } else {
+                       lock_kernel();
                        swap_free(pte_val(pte));
-                       shm_swp--;
+                       unlock_kernel();
+                       swp++;
                }
        }
+       lock_kernel();
        vfree(shp->shm_pages);
-       shm_tot -= numpages;
+       unlock_kernel();
        kfree(shp);
+       spin_lock(&shm_lock);
+       shm_rss -= rss;
+       shm_swp -= swp;
+       shm_tot -= numpages;
        return;
 }
 
@@ -231,14 +263,14 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
        struct ipc_perm *ipcp;
        int id, err = -EINVAL;
 
-       lock_kernel();
        if (cmd < 0 || shmid < 0)
-               goto out;
+               goto out_unlocked;
        if (cmd == IPC_SET) {
                err = -EFAULT;
                if(copy_from_user (&tbuf, buf, sizeof (*buf)))
-                       goto out;
+                       goto out_unlocked;
        }
+       spin_lock(&shm_lock);
 
        switch (cmd) { /* replace with proc interface ? */
        case IPC_INFO:
@@ -252,8 +284,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                shminfo.shmmin = SHMMIN;
                shminfo.shmall = SHMALL;
                shminfo.shmseg = SHMSEG;
+               spin_unlock(&shm_lock);
                if(copy_to_user (buf, &shminfo, sizeof(struct shminfo)))
-                       goto out;
+                       goto out_unlocked;
+               spin_lock(&shm_lock);
                err = max_shmid;
                goto out;
        }
@@ -267,8 +301,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                shm_info.shm_swp = shm_swp;
                shm_info.swap_attempts = swap_attempts;
                shm_info.swap_successes = swap_successes;
+               spin_unlock(&shm_lock);
                if(copy_to_user (buf, &shm_info, sizeof(shm_info)))
-                       goto out;
+                       goto out_unlocked;
+               spin_lock(&shm_lock);
                err = max_shmid;
                goto out;
        }
@@ -283,8 +319,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                        goto out;
                id = (unsigned int) shp->u.shm_perm.seq * SHMMNI + shmid;
                err = -EFAULT;
+               spin_unlock(&shm_lock);
                if(copy_to_user (buf, &shp->u, sizeof(*buf)))
-                       goto out;
+                       goto out_unlocked;
+               spin_lock(&shm_lock);
                err = id;
                goto out;
        }
@@ -325,8 +363,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                if (ipcperms (ipcp, S_IRUGO))
                        goto out;
                err = -EFAULT;
+               spin_unlock(&shm_lock);
                if(copy_to_user (buf, &shp->u, sizeof(shp->u)))
-                       goto out;
+                       goto out_unlocked;
+               spin_lock(&shm_lock);
                break;
        case IPC_SET:
                if (current->euid == shp->u.shm_perm.uid ||
@@ -358,7 +398,8 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
        }
        err = 0;
 out:
-       unlock_kernel();
+       spin_unlock(&shm_lock);
+out_unlocked:
        return err;
 }
 
@@ -440,7 +481,7 @@ asmlinkage long sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *raddr)
        unsigned long len;
 
        down(&current->mm->mmap_sem);
-       lock_kernel();
+       spin_lock(&shm_lock);
        if (shmid < 0) {
                /* printk("shmat() -> EINVAL because shmid = %d < 0\n",shmid); */
                goto out;
@@ -501,8 +542,10 @@ asmlinkage long sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *raddr)
        if (shp->u.shm_perm.seq != (unsigned int) shmid / SHMMNI)
                goto out;
 
+       spin_unlock(&shm_lock);
        err = -ENOMEM;
        shmd = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+       spin_lock(&shm_lock);
        if (!shmd)
                goto out;
        if ((shp != shm_segs[id]) || (shp->u.shm_perm.seq != (unsigned int) shmid / SHMMNI)) {
@@ -524,12 +567,11 @@ asmlinkage long sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *raddr)
        shmd->vm_ops = &shm_vm_ops;
 
        shp->u.shm_nattch++;            /* prevent destruction */
-       if ((err = shm_map (shmd))) {
-               if (--shp->u.shm_nattch <= 0 && shp->u.shm_perm.mode & SHM_DEST)
-                       killseg(id);
-               kmem_cache_free(vm_area_cachep, shmd);
-               goto out;
-       }
+       spin_unlock(&shm_lock);
+       err = shm_map (shmd);
+       spin_lock(&shm_lock);
+       if (err)
+               goto failed_shm_map;
 
        insert_attach(shp,shmd);  /* insert shmd into shp->attaches */
 
@@ -539,9 +581,17 @@ asmlinkage long sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *raddr)
        *raddr = addr;
        err = 0;
 out:
-       unlock_kernel();
+       spin_unlock(&shm_lock);
        up(&current->mm->mmap_sem);
        return err;
+
+failed_shm_map:
+       if (--shp->u.shm_nattch <= 0 && shp->u.shm_perm.mode & SHM_DEST)
+               killseg(id);
+       spin_unlock(&shm_lock);
+       up(&current->mm->mmap_sem);
+       kmem_cache_free(vm_area_cachep, shmd);
+       return err;
 }
 
 /* This is called by fork, once for every shm attach. */
@@ -549,13 +599,13 @@ static void shm_open (struct vm_area_struct *shmd)
 {
        struct shmid_kernel *shp;
 
-       lock_kernel();
+       spin_lock(&shm_lock);
        shp = *(struct shmid_kernel **) shmd->vm_private_data;
        insert_attach(shp,shmd);  /* insert shmd into shp->attaches */
        shp->u.shm_nattch++;
        shp->u.shm_atime = CURRENT_TIME;
        shp->u.shm_lpid = current->pid;
-       unlock_kernel();
+       spin_unlock(&shm_lock);
 }
 
 /*
@@ -568,7 +618,7 @@ static void shm_close (struct vm_area_struct *shmd)
 {
        struct shmid_kernel *shp;
 
-       lock_kernel();
+       spin_lock(&shm_lock);
        /* remove from the list of attaches of the shm segment */
        shp = *(struct shmid_kernel **) shmd->vm_private_data;
        remove_attach(shp,shmd);  /* remove from shp->attaches */
@@ -578,7 +628,7 @@ static void shm_close (struct vm_area_struct *shmd)
                unsigned int id = (struct shmid_kernel **)shmd->vm_private_data - shm_segs;
                killseg (id);
        }
-       unlock_kernel();
+       spin_unlock(&shm_lock);
 }
 
 /*
@@ -590,14 +640,12 @@ asmlinkage long sys_shmdt (char *shmaddr)
        struct vm_area_struct *shmd, *shmdnext;
 
        down(&current->mm->mmap_sem);
-       lock_kernel();
        for (shmd = current->mm->mmap; shmd; shmd = shmdnext) {
                shmdnext = shmd->vm_next;
                if (shmd->vm_ops == &shm_vm_ops
                    && shmd->vm_start - shmd->vm_offset == (ulong) shmaddr)
                        do_munmap(shmd->vm_start, shmd->vm_end - shmd->vm_start);
        }
-       unlock_kernel();
        up(&current->mm->mmap_sem);
        return 0;
 }
@@ -640,36 +688,43 @@ static unsigned long shm_nopage(struct vm_area_struct * shmd, unsigned long addr
        }
 #endif
 
-       lock_kernel();
+       spin_lock(&shm_lock);
  again:
        pte = __pte(shp->shm_pages[idx]);
        if (!pte_present(pte)) {
                if (pte_none(pte)) {
+                       spin_unlock(&shm_lock);
                        page = __get_free_page(GFP_BIGUSER);
                        if (!page)
                                goto oom;
                        clear_bigpage(page);
+                       spin_lock(&shm_lock);
                        if (pte_val(pte) != shp->shm_pages[idx])
                                goto changed;
                } else {
                        unsigned long entry = pte_val(pte);
 
+                       spin_unlock(&shm_lock);
                        page_map = lookup_swap_cache(entry);
                        if (!page_map) {
+                               lock_kernel();
                                swapin_readahead(entry);
                                page_map = read_swap_cache(entry);
+                               unlock_kernel();
+                               if (!page_map)
+                                       goto oom;
                        }
-                       pte = __pte(shp->shm_pages[idx]);
-                       page = page_address(page_map);
-                       if (pte_present(pte))
-                               goto present;
-                       if (!page_map)
-                               goto oom;
                        delete_from_swap_cache(page_map);
                        page_map = replace_with_bigmem(page_map);
                        page = page_address(page_map);
+                       lock_kernel();
                        swap_free(entry);
+                       unlock_kernel();
+                       spin_lock(&shm_lock);
                        shm_swp--;
+                       pte = __pte(shp->shm_pages[idx]);
+                       if (pte_present(pte))
+                               goto present;
                }
                shm_rss++;
                pte = pte_mkdirty(mk_pte(page, PAGE_SHARED));
@@ -679,7 +734,7 @@ static unsigned long shm_nopage(struct vm_area_struct * shmd, unsigned long addr
 
 done:  /* pte_val(pte) == shp->shm_pages[idx] */
        get_page(mem_map + MAP_NR(pte_page(pte)));
-       unlock_kernel();
+       spin_unlock(&shm_lock);
        current->min_flt++;
        return pte_page(pte);
 
@@ -687,11 +742,9 @@ changed:
        free_page(page);
        goto again;
 present:
-       if (page_map)
-               free_page_and_swap_cache(page);
+       free_page(page);
        goto done;
 oom:
-       unlock_kernel();
        return -1;
 }
 
@@ -710,17 +763,20 @@ int shm_swap (int prio, int gfp_mask)
        int loop = 0;
        int counter;
        struct page * page_map;
-       int ret = 0;
        
-       lock_kernel();
        counter = shm_rss >> prio;
-       if (!counter || !(swap_nr = get_swap_page()))
-               goto out_unlock;
+       lock_kernel();
+       if (!counter || !(swap_nr = get_swap_page())) {
+               unlock_kernel();
+               return 0;
+       }
+       unlock_kernel();
 
+       spin_lock(&shm_lock);
  check_id:
        shp = shm_segs[swap_id];
        if (shp == IPC_UNUSED || shp == IPC_NOID || shp->u.shm_perm.mode & SHM_LOCKED ) {
              next_id:
+ next_id:
                swap_idx = 0;
                if (++swap_id > max_shmid) {
                        swap_id = 0;
@@ -748,27 +804,30 @@ int shm_swap (int prio, int gfp_mask)
        swap_attempts++;
 
        if (--counter < 0) { /* failed */
-               failed:
+ failed:
+               spin_unlock(&shm_lock);
+               lock_kernel();
                swap_free (swap_nr);
-               goto out_unlock;
+               unlock_kernel();
+               return 0;
        }
        if (page_count(mem_map + MAP_NR(pte_page(page))) != 1)
                goto check_table;
        if (!(page_map = prepare_bigmem_swapout(page_map)))
                goto check_table;
        shp->shm_pages[idx] = swap_nr;
+       swap_successes++;
+       shm_swp++;
+       shm_rss--;
+       spin_unlock(&shm_lock);
+       lock_kernel();
        swap_duplicate(swap_nr);
        add_to_swap_cache(page_map, swap_nr);
        rw_swap_page(WRITE, page_map, 0);
+       unlock_kernel();
 
        __free_page(page_map);
-       swap_successes++;
-       shm_swp++;
-       shm_rss--;
-       ret = 1;
- out_unlock:
-       unlock_kernel();
-       return ret;
+       return 1;
 }
 
 /*
@@ -784,8 +843,12 @@ static void shm_unuse_page(struct shmid_kernel *shp, unsigned long idx,
        get_page(mem_map + MAP_NR(page));
        shm_rss++;
 
-       swap_free(entry);
        shm_swp--;
+       spin_unlock(&shm_lock);
+
+       lock_kernel();
+       swap_free(entry);
+       unlock_kernel();
 }
 
 /*
@@ -795,6 +858,7 @@ void shm_unuse(unsigned long entry, unsigned long page)
 {
        int i, n;
 
+       spin_lock(&shm_lock);
        for (i = 0; i < SHMMNI; i++)
                if (shm_segs[i] != IPC_UNUSED && shm_segs[i] != IPC_NOID)
                        for (n = 0; n < shm_segs[i]->shm_npages; n++)
@@ -804,6 +868,7 @@ void shm_unuse(unsigned long entry, unsigned long page)
                                                       page, entry);
                                        return;
                                }
+       spin_unlock(&shm_lock);
 }
 
 #ifdef CONFIG_PROC_FS
@@ -815,6 +880,7 @@ static int sysvipc_shm_read_proc(char *buffer, char **start, off_t offset, int l
 
        len += sprintf(buffer, "       key      shmid perms       size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime\n");
 
+       spin_lock(&shm_lock);
        for(i = 0; i < SHMMNI; i++)
                if(shm_segs[i] != IPC_UNUSED) {
                        len += sprintf(buffer + len, "%10d %10d  %4o %10d %5u %5u  %5d %5u %5u %5u %5u %10lu %10lu %10lu\n",
@@ -849,6 +915,7 @@ done:
                len = length;
        if(len < 0)
                len = 0;
+       spin_unlock(&shm_lock);
        return len;
 }
 #endif