Penguin
Diff: HowToPlugandPlayHOWTO
EditPageHistoryDiffInfoLikePages

Differences between version 3 and previous revision of HowToPlugandPlayHOWTO.

Other diffs: Previous Major Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Sunday, October 31, 2004 12:33:11 am by AristotlePagaltzis Revert
Older page: version 2 Last edited on Friday, June 7, 2002 1:07:18 am by perry Revert
@@ -1,2437 +1 @@
-  
-  
-  
-Plug-and-Play-HOWTO  
-  
-  
-  
-----  
-  
-!!! Plug-and-Play-HOWTO  
-  
-!!David S.Lawyer  
-  
-mailto:dave@lafn.org v1.04, March 2002  
-  
-  
-----  
-''Help with understanding and dealing with the complex Plug-and-Play  
-(PnP) issue. How to get PnP to work on your PC (if it doesn't already).  
-It doesn't cover what's called "Universal Plug and Play"  
-(UPnP). See  
-Universal Plug and Play (UPnP)''  
-----  
-  
-  
-  
-  
-!!1. Introduction  
-  
-  
-*1.1 Copyright, Trademarks, Disclaimer, & Credits  
-  
-*1.2 Future Plans; You Can Help  
-  
-*1.3 New Versions of this HOWTO  
-  
-*1.4 New in Recent Versions  
-  
-*1.5 General Introduction. Do you need this HOWTO?  
-  
-  
-  
-  
-  
-!!2. What PnP Should Do: Allocate "Bus-Resources"  
-  
-  
-*2.1 What is Plug-and-Play (PnP)?  
-  
-*2.2 How a Computer Finds Devices (and conversely)  
-  
-*2.3 Addresses  
-  
-*2.4 I/O Addresses and Allocating Them  
-  
-*2.5 Memory Ranges  
-  
-*2.6 IRQs --Overview  
-  
-*2.7 DMA Channels  
-  
-*2.8 "Resources" for both Device and Driver  
-  
-*2.9 The Problem  
-  
-*2.10 PnP Finds Devices Plugged Into Serial Ports  
-  
-  
-  
-  
-  
-!!3. The Plug-and-Play (PnP) Solution  
-  
-  
-*3.1 Introduction to PnP  
-  
-*3.2 How It Works (simplified)  
-  
-*3.3 Starting Up the PC  
-  
-*3.4 Buses  
-  
-*3.5 How Linux Does PnP  
-  
-  
-  
-  
-  
-!!4. Setting up a PnP BIOS  
-  
-  
-*4.1 Do you have a PnP operating system?  
-  
-*4.2 How are bus-resources to be controlled?  
-  
-*4.3 Reset the configuration?  
-  
-  
-  
-  
-  
-!!5. How to Deal with PnP Cards  
-  
-  
-*5.1 Introduction to Dealing with PnP Cards  
-  
-*5.2 Device Driver Configures  
-  
-*5.3 BIOS Configures PnP  
-  
-*5.4 Disable PnP ?  
-  
-*5.5 Isapnp (part of isapnptools)  
-  
-*5.6 PCI Utilities  
-  
-*5.7 Windows Configures  
-  
-*5.8 PnP Software/Documents  
-  
-  
-  
-  
-  
-!!6. Tell the Driver the Configuration  
-  
-  
-*6.1 Introduction  
-  
-*6.2 Serial Port Driver: setserial  
-  
-*6.3 Old ISA Sound Card Drivers  
-  
-  
-  
-  
-  
-!!7. What Is My Current Configuration?  
-  
-  
-*7.1 Boot-time Messages  
-  
-*7.2 How Are My Device Drivers Configured?  
-  
-*7.3 How Are My Hardware Devices Configured?  
-  
-  
-  
-  
-  
-!!8. Error Messages  
-  
-  
-*8.1 Unexpected Interrupt  
-  
-  
-  
-  
-  
-!!9. Appendix  
-  
-  
-*9.1 Universal Plug and Play (UPnP)  
-  
-*9.2 Address Details  
-  
-*9.3 ISA Bus Configuration Addresses (Read-Port etc.)  
-  
-*9.4 Interrupts --Details  
-  
-*9.5 PCI Interrupts  
-  
-*9.6 ISA Isolation  
-  
-----  
-  
-!!1. Introduction  
-  
-!!1.1 Copyright, Trademarks, Disclaimer, & Credits  
-  
-  
-!Copyright  
-  
-  
- Copyright (c) 1998-2001 by David S. Lawyer  
-mailto:dave@lafn.org  
-  
-Please freely copy and distribute (sell or give away) this document  
-in any format. Send any corrections and comments to the document  
-maintainer. You may create a derivative work and distribute it  
-provided that you:  
-  
-  
-  
-  
-  
-# If it's not a translation: Email a copy of your derivative work  
-(in a format LDP accepts) to the author(s) and maintainer (could be  
-the same person). If you don't get a response then email the LDP  
-(Linux Documentation Project): submit@linuxdoc.org.  
-#  
-  
-#License the derivative work in the spirit of this license or use  
-GPL. Include a copyright notice and at least a pointer to the  
-license used.  
-#  
-  
-#Give due credit to previous authors and major contributors.  
-#  
-  
-  
-  
-If you're considering making a derived work other than a  
-translation, it's requested that you discuss your plans with the  
-current maintainer.  
-  
-  
-  
-  
-!Disclaimer  
-  
-  
- While I haven't intentionally tried to mislead you, there are  
-likely a number of errors in this document. Please let me know about  
-them. Since this is free documentation, it should be obvious that I  
-cannot be held legally responsible for any errors.  
-  
-  
-  
-  
-!Trademarks.  
-  
-  
- Any brand names (starts with a capital letter) should be assumed to  
-be a trademark). Such trademarks belong to their respective owners.  
-  
-  
-  
-  
-  
-  
-  
-!Credits  
-  
-  
-  
-  
-  
-* Daniel Scott proofread this in March 2000 and found many  
-typos, etc.  
-*  
-  
-* Pete Barrett gave a workaround to prevent Windows from zeroing  
-PCI IRQs.  
-*  
-  
-  
-  
-  
-  
-!!1.2 Future Plans; You Can Help  
-  
-  
-  
- Please let me know of any errors in facts, opinions, logic,  
-spelling, grammar, clarity, links, etc. But first, if the date is  
-over a month old, check to see that you have the latest version.  
-Please send me any info that you think belongs in this document.  
-  
-  
-I haven't studied the code used by various Linux drivers to implement  
-Plug-and-Play. Nor do I fully understand how PnP is configured by the  
-BIOS (it depends on which BIOS) nor how Windows9x updates the ESCD.  
-Thus this HOWTO is still incomplete and may be inaccurate (let me know  
-where I'm wrong). In this HOWTO I've sometimes used ?? to indicate  
-that I don't really know the answer.  
-  
-  
-  
-  
-!!1.3 New Versions of this HOWTO  
-  
-  
-  
- New versions of the Plug-and-Play-HOWTO should appear every couple  
-of months or so and will be available to browse and/or download at LDP  
-mirror sites. For a list of mirror sites see:  
-http://linuxdoc.org/mirrors.html. Various formats are  
-available. If you only want to quickly check the date of the latest  
-version look at:  
-http://linuxdoc.org/HOWTO/Plug-and-Play-HOWTO.html. The  
-version you are now reading is: v1.04, March 2002 .  
-  
-  
-  
-  
-!!1.4 New in Recent Versions  
-  
-  
-  
-v1.04 March 2002 finding a device driver, PCI serial ports,  
-alias example in modules.conf, PnP needed for linmodems  
-v1.03 August 2001: error messages, boot-prompt parameters  
-v1.02 July 2001: PCI config regs. v1.01 April 2001: less shortage  
-today of bus-resources, clarity in sect. 2, Windows 2000 OK (even if  
-"not a PnP OS" in CMOS)  
-v1.01 April 2001: less shortage today of bus-resources, clarity in sect. 2,  
-Windows 2000 OK (even if "not a PnP OS" in CMOS)  
-  
-  
-The version 1.0 (Nov. 2000) was long overdue and recognized that the  
-kernel is doing more in helping device drivers set up PnP. Kernel 2.4  
-is significantly improved in this respect. There's still a lot of  
-improvement needed in both this HOWTO and the way that Linux does  
-PnP.  
-  
-  
-  
-  
-!!1.5 General Introduction. Do you need this HOWTO?  
-  
-  
-  
- Plug-and-play (PnP) is a system which automatically detects PC  
-devices such as disks, sound cards, ethernet cards, modems, etc. It  
-also does some low-level configuring of them. To be detected by PnP, the  
-device must be designed for PnP. Non-PnP devices (or PnP devices which  
-have been correctly PnP-configured), can often be detected by  
-non-PnP methods.  
-  
-  
-While the Linux kernel has no centralized plug-and-play system, it  
-does provide programs which various device drivers can use to do their  
-own plug-and-play. Many drivers take advantage of this and find your  
-PnP devices OK. The BIOS hardware of your PC likely may also do some  
-plug-and-play work. Thus if everything works OK PnP-wise, you can use  
-your computer without needing to know anything about plug-and-play.  
-But if some devices which are supported by Linux don't work (because  
-they not discovered or configured correctly by PnP) then you may need  
-to read some of this HOWTO. You'll learn not only about PnP but also  
-something about how communication takes place inside the computer.  
-  
-  
-If you're having problems with a device, first check to see that you  
-have the right driver for a device, and that the driver is being found  
-and used. If the driver is a module, type "lsmod" (as the root user)  
-to see it it's loaded (in use). If it's not a module then it should  
-be built into the kernel. There should be a file somewhere that tells  
-what drivers are built into the kernel: (such as: /boot/config-2.4-20  
-in Debian). Sometimes a device name (such as /dev/eth0) doesn't get a  
-driver assigned to it unless the assignment is found in the file:  
-/etc/modules.conf: For example, to assign the "tulip" driver to eth0  
-you add a line to this file:  
-alias eth0 tulip  
-  
-  
-This HOWTO doesn't cover the problem of finding and installing device  
-drivers. Perhaps it should. One problem is that a certain brand of a  
-card (or other physical device) may not say what kind of chips are  
-used in it. The driver name is often the same as the chip name and  
-not the brand name. One way to start to check on a driver is to see  
-if it is discussed in the kernel documentation, in another HOWTO, or  
-on the Internet. Warning: Such documentation may be out of date.  
-  
-  
-In this document I mention so many things that can go wrong that one  
-who believes in Murphy's Law (If something can go wrong it will) may  
-become quite alarmed. But for PnP for most people: If something can  
-go wrong it usually doesn't. Remember that sometimes problems which  
-seem to be PnP related are actually due to defective hardware or to  
-hardware that doesn't fully conform to PnP specs.  
-  
-  
-  
-----  
-  
-!!2. What PnP Should Do: Allocate "Bus-Resources"  
-  
-!!2.1 What is Plug-and-Play (PnP)?  
-  
-  
-  
- If you don't understand this section, read the next section  
-How a Computer Finds Devices (and conversely)  
-  
-  
-  
-  
- Oversimplified, Plug-and-Play automatically tells the software  
-(device drivers) where to find various pieces of hardware (devices)  
-such as modems, network cards, sound cards, etc. Plug-and-Play's task  
-is to match up physical devices with the software (device drivers)  
-that operates them and to establish channels of communication between  
-each physical device and its driver. In order to achieve this, PnP  
-allocates the following "bus-resources" to both drivers and hardware:  
-I/O addresses, IRQs, DMA channels (ISA bus only), and memory regions.  
-These 4 things are sometimes called 1st order resources. If you don't  
-understand what these 4 bus-resources are, read the following  
-subsections of this HOWTO: I/O Addresses, IRQs, DMA Channels, Memory  
-Regions. An article in Linux Gazette about 3 of these bus-resources  
-is  
-Introduction to IRQs, DMAs and Base Addresses. Once these  
-bus-resources have been assigned (and if the correct driver is  
-installed), the "files" for such devices in the /dev directory are  
-ready to use.  
-  
-  
-This PnP assignment of bus-resources is sometimes called "configuring"  
-but it is only a low level type of configuring. The /etc directory  
-has many configuration files. Most of their contents are not PnP  
-configuring. Much of the configuring of hardware devices has nothing  
-to do with PnP. For, example the initializing of a modem by an "init  
-string" or setting it's speed is not PnP. Thus when talking about  
-PnP, "configuring" means only a certain type of configuring. While  
-other documentation (such a for MS Windows) simply calls bus-resources  
-"resources", I have used the term "bus-resources" so as to  
-distinguish it from the multitude of other kinds of resources.  
-  
-  
-  
-  
-!! 2.2 How a Computer Finds Devices (and conversely)  
-  
-  
-  
- A computer consists of a CPU/processor to do the computing and RAM  
-memory to store programs and data (for fast access). In addition,  
-there are a number of devices such as various kinds of disk-drives, a  
-video card, a keyboard, network cards, modem cards, sound cards, the  
-USB bus, serial and parallel ports, etc. There is also a power supply  
-to provide electric energy, various buses on a motherboard to connect  
-the devices to the CPU, and a case to put all this into.  
-  
-  
-In olden days most all devices had their own plug-in cards (printed  
-circuit boards). Today, in addition to plug-in cards, many "devices"  
-are small chips permanently mounted on the "motherboard".  
-Furthermore, cards which plug into the motherboard may contain more  
-than one device. Memory chips are also sometimes considered to be  
-devices but are not plug-and-play in the sense used in this HOWTO.  
-  
-  
-For the computer system to work right, each device must be under the  
-control of its "device driver". This is software which is a part of  
-the operating system (perhaps loaded as a module) and runs on the CPU.  
-Device drivers are associated with "special files" in the /dev  
-directory although they are not really files. They have names such as  
-hda3 (third partition on hard drive a), ttyS1 (the second serial port),  
-eth0 (the first ethernet card), etc.  
-  
-  
-To make matters more complicated, the particular device driver  
-selected, say for example eth0, will depend on the type of ethernet  
-card you have. Thus eth0 can't just be assigned to any ethernet  
-driver. It must be assigned to a certain driver that will work for  
-the type of ethernet card you have installed. If the driver is a  
-module, some of these assignments might be found in /etc/modules.conf  
-(called "alias") while others may reside in an internal kernel table.  
-For example, if you have an ethernet card that uses the "tulip" chip  
-put "alias eth0 tulip" into /etc/modules.conf so that when your  
-computer asks for eth0 it finds the tulip driver.  
-  
-  
-To control a device, the CPU (under the control of the device driver)  
-sends commands (and data) to and reads info from the various devices.  
-In order to do this each device driver must know the address of the  
-device it controls. Knowing such an address is equivalent to setting  
-up a communication channel, even though the physical "channel" is  
-actually the data bus inside the PC which is shared with almost  
-everything else.  
-  
-  
-This communication channel is actually a little more complex than  
-described above. An "address" is actually a range of addresses so  
-that sometimes the word "range" is used instead of "address". There  
-could even be more that one range (with no overlapping) for a single  
-device. Also, there is a reverse part of the channel (known as  
-interrupts) which allows devices to send an urgent "help" request to  
-their device driver.  
-  
-  
-  
-  
-!!2.3 Addresses  
-  
-  
-  
- PCs have 3 address spaces: I/O, main memory (IO memory), and  
-configuration (except that the old ISA bus lacks a "configuration"  
-address space). All of these 3 types of addresses share the same bus  
-inside the PC. But the voltage on certain dedicated wires on the PC's  
-bus tells which "space" an address is in: I/O, main memory, (see  
-Memory Ranges), or configuration. See  
-Address Details for more details. Only  
-two of these 3 address spaces are used for device I/O: I/0 and main  
-memory.  
-  
-  
-  
-  
-!!2.4 I/O Addresses and Allocating Them  
-  
-  
-  
- Devices were originally located in I/O address space but today  
-they may use space in main memory. An I/0 address is sometimes just  
-called "I/O", "IO", "i/o" or "io". The terms "I/O port" or "I/O  
-range" are also used. Don't confuse these IO ports with "IO memory"  
-located in main memory. There are two main steps to allocate the I/O  
-addresses (or other bus-resources such as interrupts):  
-  
-  
-  
-  
-  
-# Set the I/O address, etc. on the card (in one of its registers)  
-#  
-  
-# Let its device driver know what this I/O address, etc. is  
-#  
-  
-  
-  
-The two step process above is something like the two part problem of  
-finding someone's house number on a street. Someone must install a  
-number on the front of the house so that it may be found and then you  
-must obtain (and write down) this house number. In computers the  
-device hardware must first set the address it will use in a special  
-register and then the device driver must obtain this address. Both of  
-these must be done, either automatically by software or by entering  
-the data manually into files. Problems occur when only one of them  
-gets done (or is attempted).  
-  
-  
-For manual PnP configuration some people make the mistake of doing  
-only one of these and then wonder why the computer can't find the  
-device. For example, they may use "setserial" to assign an address  
-to a serial port without realizing that this only tells the driver an  
-address. It doesn't set the address in the serial port hardware  
-itself. If the serial port hardware doesn't have the address you told  
-setserial (or doesn't have any address set in it) then you're in  
-trouble.  
-  
-  
-An obvious requirement is that before the device driver can use an  
-address it must be first set on the physical device (such as a card).  
-Since device drivers often start up soon after you start the computer,  
-they sometimes try to access a card (to see if it's there, etc.)  
-before the address has been set in the card by a PnP configuration  
-program. Then you see an error message that they can't find the card  
-even though it's there (but doesn't yet have an address).  
-  
-  
-What was said in the last few paragraphs regarding I/O addresses applies  
-with equal force to other bus-resources:  
-Memory Ranges,  
-IRQs --Overview and  
-DMA Channels. What these are will be explained in  
-the next 3 sections.  
-  
-  
-  
-  
-!! 2.5 Memory Ranges  
-  
-  
-  
- Many devices are assigned address space in main memory. It's  
-sometimes called "shared memory" or "memory-mapped IO" or "IO memory".  
-This memory is physically located on the device. When discussing  
-bus-resources it's often just called "memory". In addition to using  
-such "memory", such a device might also use conventional IO address  
-space.  
-  
-  
-When you plug in such a card, you are in effect also plugging in a  
-memory module for main memory. A high address is selected for it by  
-PnP so that it doesn't conflict with main memory chips. This memory  
-can either be ROM (Read Only Memory) or shared memory. Shared memory  
-is shared between the device and the CPU (running the device driver)  
-just as IO address space is shared between the device and the CPU.  
-This shared memory serves as a means of data "transfer" between the  
-device and main memory. It's IO but it's not done in IO space. Both  
-the card and the device driver need to know where it is.  
-  
-  
-ROM is different. It is likely a program (perhaps a device driver)  
-which will be used with the device. It could be initialization code  
-so that a device driver is still required. Hopefully, it will work  
-with Linux and not just MS Windows ?? It may need to be shadowed  
-which means that it is copied to your main memory chips in order to  
-run faster. Once it's shadowed it's no longer "read only".  
-  
-!! 2.6 IRQs --Overview  
-  
-  
-  
- After reading this you may read  
-Interrupts --Details for some more details. The following is  
-intentionally oversimplified: Besides the address, there is also an  
-interrupt number to deal with (such as IRQ 5). It's called an IRQ  
-(Interrupt !ReQuest) number. We already mentioned above that the  
-device driver must know the address of a card in order to be able to  
-communicate with it. But what about communication in the opposite  
-direction? Suppose the device needs to tell its device driver  
-something immediately? For example, the device may have just received  
-a lot of bytes destined for main memory and the device needs to tell  
-its driver to fetch these bytes at once and transfer them from the  
-device's nearly full buffer into main memory. Another example is to  
-signal the driver that the device has finished sending out a bunch of  
-bytes and is now waiting for some more bytes from the driver so it can  
-send them too.  
-  
-  
-How should the device rapidly signal its driver? It may not be able  
-to use the main data bus since it's likely already in use. Instead it  
-puts a voltage on a dedicated interrupt wire (part of the bus) which  
-is often reserved for that device alone. This voltage signal is  
-called an Interrupt !ReQuest (IRQ) or just an "interrupt" for short.  
-There are the equivalent of 16 such wires in a PC and each wire leads  
-(indirectly) to a certain device driver. Each wire has a unique IRQ  
-(Interrupt !ReQuest) number. The device must put its interrupt on the  
-correct wire and the device driver must listen for the interrupt on  
-the correct wire. Which wire the device sends help requests on is  
-determined by the IRQ number stored in the device. This same IRQ  
-number must be known to the device driver so that the device driver  
-knows which IRQ line to listen on.  
-  
-  
-Once the device driver gets the interrupt from the device it must find  
-out why the interrupt was issued and take appropriate action to  
-service the interrupt. On the ISA bus each device usually needs its  
-own unique IRQ number. For the PCI bus and other special cases the  
-sharing of IRQs is allowed.  
-  
-  
-  
-  
-!! 2.7 DMA Channels  
-  
-  
-  
- DMA channels are only for the ISA bus. DMA stands for "Direct Memory  
-Access". This is where a device is allowed to take over the main  
-computer bus from the CPU and transfer bytes directly to main memory.  
-Normally the CPU would make such a transfer in a two step process:  
-  
-  
-#reading from the I/O memory space of the device and putting these  
-bytes into the CPU itself  
-#  
-  
-# writing these bytes from the CPU to main memory  
-#  
-  
-  
-  
-# With DMA it's usually a one step process of sending the bytes  
-directly from the device to memory  
-#  
-  
-The device must have such capabilities built into its hardware and  
-thus not all devices can do DMA. While DMA is going on the CPU can't  
-do too much since the main bus is being used by the DMA transfer.  
-  
-  
-The PCI bus doesn't really have any DMA but instead it has something  
-even better: bus mastering. It works something like DMA and is  
-sometimes called DMA (for example, hard disk drives that call  
-themselves "UltraDMA"). It allows devices to temporarily become bus  
-masters and to transfer bytes almost like the bus master was the CPU.  
-It doesn't use any channel numbers since the organization of the PCI  
-bus is such that the PCI hardware knows which device is currently the  
-bus master and which device is requesting to become a bus master.  
-Thus there is no allocation of DMA channels for the PCI bus.  
-  
-  
-When a device on the ISA bus wants to do DMA it issues a DMA-request  
-using dedicated DMA request wires much like an interrupt request. DMA  
-actually could have been handled by using interrupts but this would  
-introduce some delays so it's faster to do it by having a special type  
-of interrupt known as a DMA-request. Like interrupts, DMA-requests  
-are numbered so as to identify which device is making the request.  
-This number is called a DMA-channel. Since DMA transfers all use the  
-main bus (and only one can run at a time) they all actually use the  
-same channel but the "DMA channel" number serves to identify who is  
-using the "channel". Hardware registers exist on the motherboard  
-which store the current status of each "channel". Thus in order to  
-issue a DMA-request, the device must know its DMA-channel number which  
-must be stored in a special register on the physical device.  
-  
-  
-  
-  
-  
-  
-  
-!!2.8 "Resources" for both Device and Driver  
-  
-  
-  
- Thus device drivers must be "attached" in some way to the hardware  
-they control. This is done by allocating bus-resources (I/O, Memory,  
-IRQ's, DMA's) to both the physical device and the device driver  
-software. For example, a serial port uses only 2 (out of 4 possible)  
-resources: an IRQ and an I/O address. Both of these values must be  
-supplied to the device driver and the physical device. The driver  
-(and its device) is also given a name in the /dev directory (such as  
-ttyS1). The address and IRQ number is stored by the physical device  
-in configuration registers on its card (or in a chip on the  
-motherboard). For the case of jumpers, it's the location of the  
-jumpers themselves that store the bus-resource configuration in the  
-device hardware (on the card, etc.). For the case of PnP, the  
-configuration register data is usually lost when the PC is powered  
-down (turned off) so that the bus-resource data must be supplied to  
-each device anew each time the PC is powered on.  
-  
-  
-  
-  
-!!2.9 The Problem  
-  
-  
-  
- The architecture of the PC provides only a limited number of  
-IRQ's, DMA channels, I/O address, and memory regions. If there were  
-only several devices and they all had standardized bus-resource (such  
-as unique I/O addresses and IRQ numbers) there would be no problem of  
-attaching device drivers to devices. Each device would have a fixed  
-resources which would not conflict with any other device on your  
-computer. No two devices would have the same addresses, there would  
-be no IRQ conflicts, etc. Each driver would be programmed with the  
-unique addresses, IRQ, etc. hard-coded into the program. Life would  
-be simple.  
-  
-  
-But it's not. Not only are there so many different devices today that  
-conflicts are frequent, but one sometimes needs to have more than one of  
-the same type of device. For example, one may want to have a few  
-different disk-drives, a few network cards, etc. For these reasons  
-devices need to have some flexibility so that they can be set to  
-whatever address, IRQ, etc. is needed to avoid conflicts. But some  
-IRQ's and addresses are pretty standard such as the ones for the clock  
-and keyboard. These don't need such flexibility.  
-  
-  
-Besides the problem of conflicting allocation of bus-resources, there  
-is a problem of making a mistake in telling the device driver what the  
-bus-resources are. For example, suppose that you enter IRQ 4 in a  
-configuration file when the device is actually set at IRQ 5. This is  
-another type of bus-resource allocation error.  
-  
-  
-The allocation of bus-resources, if done correctly, establishes  
-channels of communication between physical hardware and their device  
-drivers. For example, if a certain I/O address range (resource) is  
-allocated to both a device driver and a piece of hardware, then this  
-has established a one-way communication channel between them. The  
-driver may send commands and info to the device. It's actually a  
-little more than one-way since the driver may get information from the  
-device by reading its registers. But the device can't initiate any  
-communication this way. To initiate communication the device needs an  
-IRQ so it can send interrupts to its driver. This creates a two-way  
-communication channel where both the driver and the physical device  
-can initiate communication.  
-  
-  
-  
-  
-!!2.10 PnP Finds Devices Plugged Into Serial Ports  
-  
-  
-  
- External devices that connect to the serial port via a cable (such  
-as external modems) can also be called Plug-and-Play. Since only the  
-serial port itself needs bus-resources (an IRQ and I/O address) there are  
-no bus-resources to allocate to such plug-in devices. In this case,  
-PnP is used only to identify the modem (read it's model code number).  
-This could be important if the modem is a software modem (linmodem)  
-and requires a special driver. There is a special PnP specification  
-for such external serial devices (something connected to the serial  
-port).  
-  
-  
-Linux doesn't support this yet ?? For a hardware modem, the ordinary  
-serial driver will work OK so there's little need for using the  
-special serial PnP to find a driver. You still need to tell the  
-communications program what port (such as /dev/ttyS1) the modem is on.  
-With PnP you wouldn't need to even do this. With the advent of  
-software modems that have Linux drivers (linmodems), it would be nice  
-to have the appropriate driver install itself automatically via PnP.  
-  
-  
-  
-----  
-  
-!!3. The Plug-and-Play (PnP) Solution  
-  
-!!3.1 Introduction to PnP  
-  
-  
-  
- The term Plug-and-Play (PnP) has various meanings. In the broad  
-sense it is just auto-configuration where one just plugs in a device  
-and it configures itself. In the sense used in this HOWTO, the  
-configuration is only that of configuring PnP bus-resources and letting  
-the device drivers know about it. In a narrower sense it is just  
-setting bus-resources in the hardware devices. For the case of Linux,  
-it is often just a driver detecting how the bus-resources have been  
-set in its device by the BIOS, etc. "PnP' may just mean the PnP  
-specifications which (among other things). There are long specs for  
-PnP on the resource the ISA bus. The standard PCI specifications  
-(which are not called "PnP") do the same for the PCI bus.  
-  
-  
-PnP matches up devices with their device drivers and specifies their  
-communication channels. On the ISA bus before Plug-and-Play the  
-bus-resources were formerly set in hardware devices by jumpers.  
-Software drivers were assigned bus-resources by configuration files  
-(or the like) or by probing the for the device at addresses where it's  
-expected to reside. The PCI bus was PnP-like from the beginning but  
-at first it wasn't called PnP. While the PCI bus specifications don't  
-use the term PnP it supports in hardware what today is called PnP.  
-  
-  
-  
-  
-!!3.2 How It Works (simplified)  
-  
-  
-  
- Here's an oversimplified view of how PnP should work. The PnP  
-configuration program (in Linux only the BIOS does this) finds all PnP  
-devices and asks each what bus-resources it needs. Then it checks what  
-bus-resources (IRQs, etc.) it has to give away. Of course, if it has  
-reserved bus-resources used by non-PnP (legacy) devices (if it knows about  
-them) it doesn't give these away. Then it uses some criteria (not  
-specified by PnP specifications) to give out the bus-resources so that  
-there are no conflicts and so that all devices get what they need (if  
-possible). It then tells each physical device what bus-resources are  
-assigned to it and the devices set themselves up to use only the  
-assigned bus-resources. Then the device drivers somehow find out what  
-bus-resources their devices use and are thus able to communicate  
-effectively with the devices they control.  
-  
-  
-For example, suppose a card needs one interrupt (IRQ number) and 1 MB  
-of shared memory. The PnP program reads this request from the card.  
-It then assigns the card IRQ5 and 1 MB of memory addresses space,  
-starting at address 0xe9000000. It's not always this simple as the  
-card may specify that it can only use certain IRQ numbers (ISA only)  
-or that the 1 MB of memory must lie within a certain range of  
-addresses. The details are different for the PCI and ISA buses with  
-more complexity on the ISA bus.  
-  
-  
-There are some shortcuts that PnP software may use. One is to keep  
-track of how it assigned bus-resources at the last configuration (when the  
-computer was last used) and reuse this. Windows9x and PnP BIOSs do  
-this but standard Linux doesn't. Windows9x stores this info in its  
-"Registry" on the hard disk and a PnP BIOS stores it in non-volatile  
-memory in your PC (known as ESCD; see  
-The BIOS's ESCD Database).  
-  
-  
-While MS Windows (starting with Windows 95) is a PnP OS, Linux isn't.  
-But PnP still often works in Linux due to the BIOS doing the  
-configuring of bus-resources and the device drivers finding out (using  
-programs supplied by the Linux kernel) what the BIOS has done.  
-Drivers can also change bus-resource assignments using such programs  
-(but they might take a bus-resource needed by another device). Some  
-device drivers store the last configuration they used and use it the  
-next time the computer is powered on.  
-  
-  
-If the device hardware remembered their previous configuration, then  
-there wouldn't be any hardware to configure at the next boot-time, but  
-they seem to forget their configuration when the power is turned off.  
-Some devices contain a default configuration (but not necessarily the  
-last one used). Thus a PnP configuration program needs to be run each  
-time the PC is powered on. Also, if a new device has been added, then  
-it too needs to be configured. Allocating bus-resources to this new  
-device might involve taking some bus-resources away from an existing  
-device and assigning the existing device alternative bus-resources  
-that it can use instead. At present, Linux can't do this.  
-  
-  
-  
-  
-!!3.3 Starting Up the PC  
-  
-  
-  
- When the PC is first turned on the BIOS chip runs its program to  
-get the computer started (the first step is to check out the  
-hardware). If the operating system is stored on the hard-drive (as it  
-normally is) then the BIOS must know about the hard-drive. If the  
-hard-drive is PnP then the BIOS may use PnP methods to find it. Also,  
-in order to permit the user to manually configure the BIOS's CMOS and  
-respond to error messages when the computer starts up, a screen (video  
-card) and keyboard are also required. Thus the BIOS must always  
-PnP-configure these devices on its own.  
-  
-  
-Once the BIOS has identified the hard-drive, the video card, and the  
-keyboard it is ready to start booting (loading the operating system  
-into memory from the hard-disk). If you've told the BIOS that you  
-have a PnP operating system (PnP OS), it should start booting the PC  
-as above and let the operating system finish the PnP configuring.  
-Otherwise, a PnP-BIOS will (prior to booting) likely try to do the  
-rest of the PnP configuring of devices (but not informing their  
-drivers). This is what usually happens when running Linux.  
-  
-  
-  
-  
-!!3.4 Buses  
-  
-  
-  
- ISA is the old bus of the old IBM PCs while PCI is a newer and  
-faster bus from Intel. The PCI bus was designed for what is today  
-called PnP. It makes it easy (as compared to the ISA bus) to find out  
-how PnP bus-resources have been assigned to hardware devices. To see  
-what has happened use the commands lspci or scanpci (Xwindows)  
-and/or look at /proc/pci or /proc/bus/pci. The  
-boot-up messages on your display are useful (use shift-!PageUp to back  
-up thru them). See  
-Boot-time Messages  
-  
-For the ISA bus there was a real problem with implementing PnP since no  
-one had PnP in mind when the ISA bus was designed and there are almost  
-no I/O addresses available for PnP to use for sending configuration info  
-to physical device. As a result, the way PnP was shoehorned onto the  
-ISA bus is very complicated. Whole books have been written about it.  
-See  
-PnP Book. Among other things, it  
-requires that each PnP device be assigned a temporary "handle" by the  
-PnP program so that one may address it for PnP configuring. Assigning  
-these "handles" is call "isolation". See  
-ISA Isolation for the complex details.  
-  
-  
-Eventually, the ISA bus should become extinct. When it does, PnP will  
-be easier since it will be easy to find out how the BIOS has  
-configured the hardware. There will still be the need to match up  
-device drivers with devices and also a need to configure devices that  
-are added when the PC is up and running. These needs would be better  
-satisfied if Linux was a PnP operating system.  
-  
-  
-  
-  
-!! 3.5 How Linux Does PnP  
-  
-  
-  
- Linux has had a serious problem dealing with PnP and still has a  
-problem but it's not as severe as it once was. Linux still is not  
-really a PnP operating system and seems to mainly rely on and device  
-drivers and the PnP BIOS to configure bus-resources for devices. But  
-the kernel provides help for the drivers in the form of PnP programs  
-they may call on. In many cases the device driver does all the needed  
-configuring. In other cases the BIOS may configure and then the device  
-driver may find out how the BIOS has configured it. The kernel  
-provides the drivers with some functions (program code) that the  
-drivers may use to find out if their device exists, how it's been  
-configured, and functions to modify the configuration. Kernel 2.2  
-could do this only for the PCI bus but Kernel 2.4 has this feature for  
-both the ISA and PCI buses (provided that the PNP options have been  
-selected when compiling the kernel). This by no means guarantees that  
-all drivers will fully and correctly use these features.  
-  
-  
-In addition, the kernel helps avoid resource conflicts by not allowing  
-two devices to use the same bus-resources at the same time.  
-Originally this was only for IRQs, and DMAs but now it's for address  
-resources as well.  
-  
-  
-Prior to Kernel 2.4, the standalone program: isapnp was often run to  
-configure and/or get info from PnP devices on the ISA bus. isapnp is  
-still needed for cases where the device driver is not fully PnP for  
-the ISA bus.. There was at least one attempt to make Linux a true PnP  
-operating system. See  
-http://www.astarte.free-online.co.uk. But it never was put  
-into the kernel.  
-  
-  
-To see what help the kernel may provide to device drivers see the  
-kernel documentation. This documentation (if you have it) is a  
-directory /usr/.../.../Documentation where one of the ... contains the  
-word "kernel". Use the "locate" command to find it. In this  
-documentation directory see pci.txt ("How to Write Linux PCI Drivers")  
-and the file: /usr/include/linux/pci.h. Unless you are a driver guru  
-and know C Programming, these files are written so tersely that they  
-will not actually teach you how to write a driver. But it will give  
-you some idea of what PnP type functions are available for drivers to  
-use. For the ISA bus see isapnp.txt and possibly (for kernel 2.4)  
-/usr/include/linux/isapnp.h.  
-  
-  
-When the PC starts up you may note from the messages on the screen  
-that some Linux device drivers often find their hardware devices (and  
-the bus-resources the BIOS has assigned them). But there are a number  
-of things that a real PnP operating system could handle better:  
-  
-  
-  
-  
-  
-*A Allocate bus-resources when they are in short supply  
-*  
-  
-*Deal with more than one driver for a physical device  
-*  
-  
-*Find a driver for a detected device (instead of making  
-drivers do the searching)  
-*  
-  
-*Save a lot of work for the programmers of device drivers  
-*  
-  
-  
-  
-The "shortage of bus-resources" problem is becoming less of a problem  
-for two reasons: One reason is that the PCI bus is replacing the ISA  
-bus. Under PCI there is no shortage of IRQs since IRQs may be shared  
-(even though sharing is less efficient). Also, PCI doesn't use DMA  
-resources (although it does the equivalent of DMA without needing such  
-resources).  
-  
-  
-The second reason is that more and more physical devices  
-are using main memory addresses instead of IO address space. On  
-32-bit PCs there is 4GB of main memory address space and much of this  
-bus-resource is available for device IO (unless you had 4GB of main  
-memory installed). Compare this to the IO address space which is  
-limited to 64KB. So the memory space for device IO is not (yet ?) in  
-short supply.  
-  
-  
-  
-----  
-  
-!! 4. Setting up a PnP BIOS  
-  
-  
- When the computer is first turned on, the BIOS runs before the  
-operating system is loaded. Modern BIOSs are PnP and can configure  
-some or all of the PnP devices. Here are some of the choices  
-which may exist in your BIOS's CMOS menu:  
-  
-  
-  
-  
-  
-*  
-Do you have a PnP operating system?  
-*  
-  
-*  
-How are bus-resources to be controlled?  
-*  
-  
-*  
-Reset the configuration?  
-*  
-  
-  
-  
-  
-  
-!! 4.1 Do you have a PnP operating system?  
-  
-  
-  
- In any case the PnP BIOS will PnP-configure the hard-drive, video  
-card, and keyboard to make the system bootable. If you said you had a  
-PnP OS it will leave it up to the operating system (or device drivers)  
-to finish the configuration job. If you said no PnP OS then the BIOS  
-should configure everything. If you only run Linux on your PC, you  
-should probably tell it truthfully that you don't have a PnP operating  
-system If you also run MS Windows on your PC and said it was a PnP OS  
-when you installed Windows, then you might try saying that you have a  
-PnP OS to keep Windows 95/98 happy (but it might cause problems for  
-Linux. For Windows 2000 it's claimed that Windows worked OK even if you  
-say you don't have a PnP OS. In this case Windows 2000 will report  
-finding new hardware (even though it already knew about the hardware  
-but didn't know how the BIOS Pnp-configured it).  
-  
-  
-If you say you have a PnP OS then you rely on the Linux device drivers  
-and possibly the program isapnp to take care of the bus-resource  
-configuring. This often works OK but sometimes doesn't. Fibbing to  
-Linux this way has sometimes actually fixed problems. This could be  
-because the BIOS didn't do it's job right but Linux alone did.  
-  
-  
-If you tell the BIOS you don't have a PnP OS, then the BIOS will do  
-the configuring itself. Unless you have added new PnP devices, it  
-should use the configuration which it has stored in its non-volatile  
-memory (ESCD). See  
-The BIOS's ESCD Database.  
-If the last session on your computer was with Linux, then there should  
-be no change in configuration. See  
-BIOS Configures PnP. But if the last session was with Windows9x (which  
-is PnP) then Windows could have modified the ESCD. It supposedly does  
-this only if you "force" a configuration or install a legacy device.  
-See  
-Using Windows to set ESCD. Device  
-drivers that do configuring may modify what the BIOS has done. So  
-will the isapnp or PCI Utilities programs.  
-  
-  
-  
-  
-!Interoperability with Windows  
-  
-  
- If you are running both Linux and Windows on the same PC, how do  
-you answer the BIOS's question: Do you have a PnP OS? Normally (and  
-truthfully) you would say no for Linux and yes for Windows. If you're  
-truthful, everything should work OK. But it's a lot of bother to have  
-to set up the BIOS's CMOS menu manually each time you want to switch  
-OSs. To fix this you need to fib about either Linux or Windows. If  
-you fib there may be problems. But there are ways to solve these  
-problems.  
-  
-  
-If you intend on fibbing, should you tell the truth about Windows or  
-Linux? This depends on how good your Linux or Windows is about  
-configuring itself if you fib about it. Both Windows 2000 and Linux  
-seem to be getting better about coping with such fibs.  
-  
-  
-  
-  
-!Fibbing to Linux  
-  
-  
-If you say that you have a PnP OS, then Linux may work OK if all  
-the drivers and isapnp (if you use it) are able to configure OK.  
-Perhaps updating of the Linux OS and/or drivers will help.  
-  
-  
-  
-  
-!Fibbing to Windows9x  
-  
-  
-Another solution is to set the CMOS for no PnP OS, including when  
-you start Windows. Now you are fibbing to Windows and since Windows  
-is seemingly much more sophisticated in handling PnP. One would  
-expect Windows9x to be able to cope with with hardware that has been  
-fully configured by the BIOS but it can't. But it's reported that  
-Windows 2000 can cope with this. One might expect that even if  
-Windows9x didn't realize that the hardware was already configured, it  
-would set the configuration of the physical devices per it's registry  
-and then then everything would work OK.  
-  
-  
-But it doesn't seem to happen this way. It seems that Windows9x may  
-just tell its device drivers what has been stored in the Windows'  
-Registry. But the actual hardware configuration (done by the BIOS) is  
-what was stored in the ESCD and may not be the same as the Registry =>  
-trouble. So for Windows to work OK you need to get the Registry to  
-contain the bus-resource configuration which the BIOS creates from the  
-ESCD.  
-  
-  
-One way to try to get the Registry and the ESCD the same is to install  
-(or reinstall) Windows when the BIOS is set for "not a PnP OS". This  
-should present Windows with hardware configured by the BIOS. If this  
-configuration is without conflicts, Windows will hopefully leave it  
-alone and save it in it's Registry. Then the ESCD and the registry  
-are in sync.  
-  
-  
-Another method is to remove devices that are causing problems in  
-Windows by clicking on "remove" in the Device Manager. Then reboot with  
-"Not a PnP OS" (set it in the CMOS as you start to boot). Windows  
-will then reinstall the devices, hopefully using the bus-resource  
-settings configured by the BIOS. Be warned that Windows will likely  
-ask you to insert the Window installation CD since it sometimes can't  
-find the driver files (and the like) even though they are still  
-there. A workaround for this is to select "skip file" and continue.  
-  
-  
-As a test I "removed" a NIC card which used a Novell compatible  
-driver. Upon rebooting, Windows reinstalled it with Microsoft  
-Networking instead of Novell. This meant that the Novell Client  
-needed to be reinstalled --a lot of unnecessary work.  
-  
-  
-  
-  
-!Fibbing to Windows 2000  
-  
-  
-If you have Windows 2000, it's claimed that fibbing to it will work  
-out OK (even if you said it was a PnP-OS when you first installed Windows  
-2000). When you change to "not a PnP-OS", Windows 2000 is reported to  
-automatically PnP-reconfigure it's devices and tell you that it's  
-finding new hardware and installing new devices. What it really means  
-is that it's finding hardware which is already configured by the BIOS  
-whereas before it found hardware that wasn't configured by the BIOS.  
-Perhaps it considers the hardware to be "new" since Windows 2000 may  
-be finding it at a different address/irq (as set by the BIOS).  
-  
-  
-  
-  
-!! 4.2 How are bus-resources to be controlled?  
-  
-  
-  
- This may involve just deciding how to  
-allocate IRQ and DMA bus-resources. If set to "auto", the BIOS will  
-do the allocation. If set to manual, you manually reserve some IRQ's  
-for use on "legacy" (non-pnp) ISA cards. The BIOS may or may not  
-otherwise know about such legacy cards. The BIOS will only know about  
-these legacy cards if you ran ICU (or the like) under Windows to tell  
-the BIOS about them. If the BIOS knows about them, then try using  
-"auto". If it doesn't know about them, then manually reserve the  
-IRQ's needed for the legacy ISA cards and let the rest be for the BIOS  
-PnP to allocate.  
-  
-  
-  
-  
-!! 4.3 Reset the configuration?  
-  
-  
-  
- This will erase the BIOSs ESCD data-base of how your PnP devices  
-should be configured as well as the list of how legacy (non-PnP)  
-devices are configured. Never do this unless you are convinced that  
-this data-base is wrong and needs to be remade. It was stated  
-somewhere that you should do this only if you can't get your computer  
-to boot. If the BIOS loses the data on legacy devices, then you'll  
-need to run ICA again under DOS/Windows to reestablish this data.  
-  
-  
-  
-----  
-  
-!!5. How to Deal with PnP Cards  
-  
-!!5.1 Introduction to Dealing with PnP Cards  
-  
-  
-  
- Today most all new internal boards (cards) are Plug-and-Play  
-(PnP). There are 5 different methods listed below to cope with PnP  
-(but some may not be feasible in your situation). If the device  
-driver configures it, then you don't need to do anything. If the BIOS  
-configures it, you hope that the driver can find out what the BIOS did  
-(you may need to tell it this in a configuration file or the like).  
-  
-  
-  
-  
-  
-*  
-Device Driver Configures  
-*  
-  
-*  
-BIOS Configures PnP (For the PCI bus  
-you only need a PCI BIOS, otherwise you need a PnP BIOS)  
-*  
-  
-*  
-Disable PnP by jumpers or  
-DOS/Windows software (but many cards can't do this)  
-*  
-  
-*  
-Isapnp is a program you can always  
-use to configure PnP devices on the ISA bus only  
-*  
-  
-*  
-PCI Utilities is for configuring the PCI  
-bus but the device driver should handle it  
-*  
-  
-*  
-Windows Configures and then you  
-boot Linux from within Windows/DOS. Use as a last resort  
-*  
-  
-  
-  
-Any of the above will set the bus-resources in the hardware but only  
-the first one tells the driver what has been done. How the driver gets  
-informed depends on the driver. You may need to do something to  
-inform it. See  
-Tell the Driver the Configuration  
-  
-  
-  
-!! 5.2 Device Driver Configures  
-  
-  
-  
- Many device drivers (with the help of code provided by the kernel)  
-will use PnP methods to set the bus-resources in the hardware but only  
-for the device that they control. Since the driver has done the  
-configuring, it obviously knows the configuration and there is no need  
-for you to tell it this info. This is obviously the easiest way to do  
-it since you don't have to do anything if the driver does it all.  
-  
-  
-For PCI devices, most drivers will configure PnP but for ISA devices  
-it's problematical. This is because PCI has always been inherently  
-PnP even though PnP for PCI was called "PCI Configuration" (and still  
-is). For ISA, the kernel provided no functions for PnP configuring  
-until version 2.4. So if you have a late version of both the kernel  
-and the driver then the driver is more likely to configure PnP  
-(bus-resources). But if you have older versions (or if the driver  
-maintainer didn't add PnP to it) then the driver will likely not  
-configure PnP.  
-  
-  
-Unfortunately, a driver may grab bus-resources that are needed by other  
-devices (but not yet allocated to them by the kernel). Thus a true  
-PnP Linux kernel would be better where the kernel did the allocation  
-after all requests were in. See  
-How Linux Does PnP.  
-  
-  
-  
-  
-!! 5.3 BIOS Configures PnP  
-  
-  
-!Intro to Using the BIOS to Configure PnP  
-  
-  
- If you have a PnP BIOS, it can configure the hardware. This means  
-that your BIOS reads the resource requirements of all devices and  
-configures them (allocates bus-resources to them). It is a substitute  
-for a PnP OS except that the BIOS doesn't match up the drivers with  
-their devices nor tell the drivers how it has done the configuring.  
-It should normally use the configuration it has stored in its  
-non-volatile memory (ESCD). If it finds a new device or if there's a  
-conflict, the BIOS should make the necessary changes to the  
-configuration and may not use the same configuration as was in the  
-ESCD. In this case it should update the ESCD to reflect the new  
-situation.  
-  
-  
-Your BIOS must support such configuring and there have been cases  
-where it doesn't do it correctly or completely. An advantage of using  
-the BIOS is that it's simple since in most cases there is nothing to  
-set up (except to tell the BIOS's CMOS menu it's not a PnP OS). While  
-many device drivers will be able to automatically detect what the  
-BIOS has done, in some cases you may need to determine it (not always  
-easy). See  
-What Is My Current Configuration? Another possible advantage is that the BIOS does its  
-work before Linux starts so that all the bus-resources are ready to be  
-used (and found) by the device drivers that start up later.  
-  
-  
-According to MS it's only optional (not required) that a PnP BIOS be  
-able to PnP-configure the devices (without help from MS Windows). But  
-it seems that most of the ones made after 1996 ?? or so can do it. We  
-should send them thank-you notes if they do it right. They configure  
-both the PCI and ISA buses, but it has been claimed that some older  
-BIOSs can only do the PCI. To try to find out more about your BIOS,  
-look on the Web. Please don't ask me as I don't have data on this.  
-The details of the BIOS that you would like to know about may be hard  
-to find (or not available). Some BIOSs may have minimal PnP  
-capabilities and seemingly expect the operating system to do it  
-right. If this happens you'll either have to find another method or  
-try to set up the ESCD database if the BIOS has one. See the next  
-section.  
-  
-  
-  
-  
-! The BIOS's ESCD Database  
-  
-  
- The BIOS maintains a non-volatile database containing a  
-PnP-configuration that it will try to use. It's called the ESCD  
-(Extended System Configuration Data). Again, the provision of ESCD is  
-optional but most PnP-BIOSs have it. The ESCD not only stores the  
-resource-configuration of PnP devices but also stores configuration  
-information of non-PnP devices (and marks them as such) so as to avoid  
-conflicts. The ESCD data is usually saved on a chip and remains  
-intact when the power is off, but sometimes it's kept on a hard-drive??  
-  
-  
-The ESCD is intended to hold the last used configuration, but if you  
-use a program such as Linux's isapnp or pci utilities (which doesn't  
-update the ESCD) then the ESCD will not know about this and will not  
-save this configuration in the ESCD. A good PnP OS might update the  
-ESCD so you can use it later on for a non-PnP OS (like standard  
-Linux). MS Windows does this only in special cases. See  
-Using Windows to set ESCD.  
-  
-  
-To use what's set in ESCD be sure you've set "Not a PnP OS" or the  
-like in the BIOS's CMOS. Then each time the BIOS starts up (before  
-the Linux OS is loaded) it should configure things this way. If the  
-BIOS detects a new PnP card which is not in the ESCD, then it must  
-allocate bus-resources to the card and update the ESCD. It may even  
-have to change the bus-resources assigned to existing PnP cards and  
-modify the ESCD accordingly.  
-  
-  
-If each device saved its last configuration in its hardware, hardware  
-configuring wouldn't be needed each time you start your PC. But it  
-doesn't work this way. So all the ESCD data needs to be kept correct  
-if you use the BIOS for PnP. There are some BIOSs that don't have an  
-ESCD but do have some non-volatile memory to store info regarding  
-which bus-resources have been reserved for use by non-PnP cards. Many  
-BIOSs have both.  
-  
-  
-  
-  
-! Using Windows to set the ESCD  
-  
-  
- If the BIOS doesn't set up the ESCD the way you want it (or the  
-way it should be) then it would be nice to have a Linux utility to  
-set the ESCD. As of early 1999 there wasn't any and now in 2001  
-no one has told me about any. Thus one may resort to attempting to  
-use Windows (if you have it on the same PC) to do this.  
-  
-  
-There are three ways to use Windows to try to set/modify the ESCD. One  
-way is to use the ICU utility designed for DOS or Windows 3.x. It  
-should also work OK for Windows 9x/2k ?? Another way is to set up  
-devices manually ("forced") under Windows 9x/2k so that Windows will  
-put this info into the ESCD when Windows is shut down normally. The  
-third way is only for legacy devices that are not plug-and-play. If  
-Windows knows about them and what bus-resources they use, then Windows  
-should put this info into the ESCD.  
-  
-  
-If PnP devices are configured automatically by Windows without the  
-user "forcing" it to change settings, then such settings probably will  
-not make it into the ESCD. Of course Windows may well decide on its  
-own to configure the same as what is set in the ESCD so they could  
-wind up being the same by coincidence.  
-  
-  
-Windows 9x are PnP operating systems and automatically PnP-configure  
-devices. They maintain their own PnP-database deep down in the  
-Registry (stored in binary Windows files). There is also a lot of  
-other configuration stuff in the Registry besides PnP-bus-resources.  
-There is both a current PnP resource configuration in memory and  
-another (perhaps about the same) stored on the hard disk. To look at  
-this in Windows98 or to force changes to it you use the Device Manager.  
-  
-  
-In Windows98 there are 2 ways to get to the Device Manager: 1. My  
-Computer --> Control Panel --> System Properties --> Device Manager.  
-2. (right-click) My Computer --> Properties --> Device Manager. Then  
-in Device Manager you select a device (sometimes a multi-step process  
-if there are a few devices of the same class). Then click on  
-"Properties" and then on "Resources". To attempt to change the  
-resource configuration manually, uncheck "Use automatic settings" and  
-then click on "Change Settings". Now try to change the setting, but  
-it may not let you change it. If it does let you, you have "forced" a  
-change. A message should inform you that it's being forced. If you  
-want to keep the existing setting shown by Windows but make it  
-"forced" then you will have to force a change to something else and  
-then force it back to its original setting.  
-  
-  
-To see what has been "forced" under Windows98 look at the "forced  
-hardware" list: Start --> Programs --> Accessories --> System Tools  
---> System Information --> Hardware Resources --> Forced Hardware.  
-When you "force" a change of bus-resources in Windows, it should put  
-your change into the ESCD (provided you exit Windows normally).  
->From the "System Information" window you may also inspect how IRQs and  
-IO ports have been allocated under Windows.  
-  
-  
-Even if Windows shows no conflict of bus-resources, there may be a  
-conflict under Linux. That's because Windows may assign bus-resources  
-differently than the ESCD does. In the the rare case where all  
-devices under Windows are either legacy devices or have been "forced",  
-then Windows and the ESCD configurations should be identical.  
-  
-  
-  
-  
-!Adding a New Device (under Linux or Windows)  
-  
-  
- If you add a new PnP device and have the BIOS set to "not a PnP  
-OS", then the BIOS should automatically configure it and store the  
-configuration in ESCD. If it's a non-PnP legacy device (or one made  
-that way by jumpers, etc.) then here are a few options to handle it:  
-  
-  
-You may be able to tell the BIOS directly (via the CMOS setup menus)  
-that certain bus-resources it uses (such as IRQs) are reserved and are  
-not to be allocated by PnP. This does not put this info into the  
-ESCD. But there may be a BIOS menu selection as to whether or not to  
-have these CMOS choices override what may be in the ESCD in case of  
-conflict. Another method is to run ICU under DOS/Windows. Still  
-another is to install it manually under Windows 9x/2k and then make  
-sure its configuration is "forced" (see the previous section). If  
-it's "forced" Windows should update the ESCD when you shut down the  
-PC.  
-  
-  
-  
-  
-!! 5.4 Disable PnP ?  
-  
-  
-  
- Many devices are PnP only with no option for disabling PnP. But  
-for some, you may be able to disable PnP by jumpers or by running a  
-Windows program that comes with the device (jumperless configuration).  
-If the device driver can't configure it this will avoid the possibly  
-complicated task of doing PnP configuring. Don't forget to tell the  
-BIOS that these bus-resources are reserved. There are also some  
-reasons why you might not want to disable PnP:  
-  
-  
-  
-  
-  
-# If you have MS Windows on the same machine, then you may want  
-to allow PnP to configure devices differently under Windows from what  
-it does under Linux.  
-#  
-  
-# The range of selection for IRQ numbers (or port addresses) etc.  
-may be quite limited unless you use PnP.  
-#  
-  
-# You might have a Linux device driver that uses PnP methods to  
-search for the device it controls.  
-#  
-  
-# If you need to change the configuration in the future, it may  
-be easier to do this if it's PnP (no setting of jumpers or running a  
-Dos/Windows program).  
-#  
-  
-# You may have (or will have) other PnP devices that need  
-configuring so that you'll need to provide for (or learn about) PnP  
-anyway.  
-#  
-  
-Once configured as non-PnP devices, they can't be configured by PnP  
-software or a PnP-BIOS (until you move jumpers and/or use the  
-Dos/Windows configuration software again).  
-  
-  
-  
-  
-!! 5.5 Isapnp (part of isapnptools)  
-  
-  
-  
- Unfortunately, much of the documentation for isapnp is still  
-difficult to understand unless you know the basics of PnP. This HOWTO  
-should help you understand it as well the FAQ that comes with it.  
-isapnp is only for PnP devices on the ISA bus (non-PCI). Running  
-the Linux program "isapnp" at boot-time will configure such devices to  
-the resource values specified in /etc/isapnp.conf. Its possible to  
-create this configuration file automatically but you then must edit it  
-manually to choose between various options.  
-  
-  
-With isapnp there's a danger that a device driver which is built into  
-the kernel may run too early before isapnp has set the address, etc.  
-in the hardware. This results in the device driver not being able to  
-find the device. The driver tries the right address but the address  
-hasn't been set yet in the hardware.  
-  
-  
-If your Linux distribution automatically installed isapnptools, isapnp  
-may already be running at startup. In this case, all you need to do  
-is to edit /etc/isapnp.conf per "man isapnp.conf". Note that  
-this is like manually configuring PnP since you make the decisions as  
-to how to configure as you edit the configuration file. You can use  
-the program "pnpdump" to help create the configuration file. It  
-almost creates a configuration file for you but you must skillfully  
-edit it a little before using it. It contains some comments to help  
-you edit it. If you use "isapnp" for configuring and have a PnP BIOS,  
-you may want to tell the BIOS (when you set it up) that you don't  
-have a PnP OS since you may want the BIOS to configure the PCI  
-devices. While the BIOS may also configure the ISA devices, isapnp  
-will redo it.  
-  
-  
-The terminology used in the /etc/isapnp.conf file may seem odd at  
-first. For example for an I0 address of 0x3e8 you might see "(IO  
-(BASE 0x3e8))" instead. The "IO " means this is the first (0th) IO  
-address-range that this device uses. Another way to express all this  
-would be: "IO [[ ] = 0x3e8" but isapnp doesn't do it this way. "IO 1"  
-would mean that this is the second IO address range used by this  
-device, etc. "INT " has a similar meaning but for IRQs (interrupts).  
-A single card may contain several physical devices but the above  
-explanation was for just one of these devices.  
-  
-  
-  
-  
-!! 5.6 PCI Utilities  
-  
-  
-  
- The package PCI Utilities (= pciutils, incorrectly called  
-"pcitools"), should let you manually PnP-configure the PCI bus.  
-"lspci" or "scanpci" (Xwindows) lists bus-resources while "setpci"  
-sets resource allocations in the hardware devices. It appears that  
-setpci is mainly intended for use in scripts and presently one needs to  
-know the details of the PCI configuration registers in order to use it.  
-That's a topic not explained here nor in the manual page for setpci.  
-  
-  
-  
-  
-!! 5.7 Windows Configures  
-  
-  
-  
- If you have Windows9x (or 2k) on the same PC, then just start  
-Windows and let it configure PnP. Then start Linux from Windows (or  
-DOS). But there may be a problem with IRQs for PCI devices. As  
-Windows shuts down to make way for Linux, it may erase (zero) the IRQ  
-which is stored in one of the PCI device's configuration registers.  
-Linux will complain that it has found an IRQ of zero.  
-  
-  
-The above is reported to happen if you start Linux using a shortcut  
-(PIF file). But a workaround is reported where you still use the  
-shortcut PIF. A shortcut is something like a symbolic link in Linux  
-but it's more than that since it may be "configured". To start Linux  
-(from DOS you create a batch file (script) which starts Linux. (The  
-program that starts Linux is in the package called "loadlin"). Then  
-create a PIF shortcut to that batch file and get to the "Properties"  
-dialog box for the shortcut. Select "Advanced" and then check "MS-DOS  
-mode" to get it to start in genuine MS-DOS.  
-  
-  
-Now here's the trick to prevent zeroing the PCI IRQs. Check "Specify  
-a new MS-DOS configuration". Then either accept the default  
-configuration presented to you or click on "Configuration" to change  
-it. Now when you start Linux by clicking on the shortcut, new  
-configuration files (Config.sys and Autoexec.bat) will be created per  
-your new configuration.  
-  
-  
-The old files are stored as "Config.wos and Autoexec.wos". After you  
-are done using Linux and shut down your PC then you'll need these  
-files again so that you can run DOS the next time you start your PC.  
-You need to ensure that the names get restored to *.sys and *.bat.  
-When you leave Windows/DOS to enter Linux, Windows is expecting that  
-when you are done using Linux you will return to Windows so that  
-Windows can automatically restore these files to their original names.  
-But this doesn't happen since when you exit Linux you shut down your  
-PC and don't get back to Windows. So how do you get these files  
-renamed? It's easy, just put commands into your "start-Linux" batch  
-file to rename these files to their *.bat and *.sys names. Put these  
-renaming commands into your batch file just before the line that loads  
-Linux.  
-  
-  
-Also it's reported that you should click on the "General" tab (of the  
-"Properties" dialog of your shortcut) and check "Read-only".  
-Otherwise Windows may reset the "Advanced Settings" to "Use current  
-MS-DOS configuration" and PCI IRQs get zeroed. Thus Windows erases  
-the IRQs when you use the current MS-DOS configuration but doesn't  
-erase when you use a new configuration (which may actually configure  
-things identical to the old configuration). Windows does not seem to  
-be very consistent.  
-  
-  
-  
-  
-  
-  
-  
-!! 5.8 PnP Software/Documents  
-  
-  
-  
-  
-  
-  
-*  
-Isapnptools homepage  
-*  
-  
-*  
-Patch to make the Linux kernel PnP  
-*  
-  
-*  
-PnP driver project  
-*  
-  
-*  
-PnP Specs. from Microsoft  
-*  
-  
-* Book: PCI System Architecture, 3rd ed. by Tom Shanley +,  
-!MindShare 1995. Covers PnP-like features on the PCI bus.  
-*  
-  
-*  
- Book: Plug and Play System Architecture,  
-by Tom Shanley, Mind Share 1995. Details of PnP on the ISA bus. Only  
-a terse overview of PnP on the PCI bus.  
-*  
-  
-* Book: Programming Plug and Play, by James Kelsey, Sams 1995.  
-Details of programming to communicate with a PnP BIOS. Covers ISA,  
-PCI, and PCMCIA buses.  
-*  
-  
-  
-  
-  
-----  
-  
-!! 6. Tell the Driver the Configuration  
-  
-!!6.1 Introduction  
-  
-  
-  
- Just how this is done depends upon the driver. Some drivers have  
-more than one way to find out how their physical device is configured.  
-At one extreme is the case where you must hard-code the bus-resources  
-into the kernel (or a module) and recompile. At the other extreme,  
-the driver does everything automatically and you have nothing to do.  
-It may even set the bus-resources in the hardware using PnP methods.  
-  
-  
-In the middle are cases where you run a program to give the resource  
-info to the driver or put the info in a file. In some cases the  
-driver may probe for the device at addresses where it suspects the  
-device resides. It may then try to test various IRQs to see which one  
-works. It may or may not automatically do this. In other cases the  
-driver may use PnP methods to find the device and how the bus-resources  
-have been set, but will not actually set them. It may also look in  
-some of the "files" in the /proc directory.  
-  
-  
-One may need to "manually" tell a driver what bus-resources it should  
-use. You give such bus-resources as a parameter to the kernel or to a  
-loadable module. If the driver is built into the kernel, you pass the  
-parameters to the kernel via the "boot-prompt". See The  
-Boot-Prompt-HOWTO which describes some of the bus-resource and other  
-parameters. Once you know what parameters to give to the kernel, one  
-may put them into lilo.conf file as append="...". Then the lilo  
-program must be run to get this info into the kernel loader.  
-  
-  
-If the driver is loaded as a module, in many cases the module will  
-find the bus-resources it needs and set them in the device. In other  
-cases (mostly for older PCs) you may need to give bus-resources as  
-parameters to the module. In some versions of Linux  
-/usr/lib/modules_help/descr.gz shows a list of possible module  
-parameters. Parameters to a module (including ones that automatically  
-load) may be specified in /etc/modules.conf. There are usually tools  
-used to modify this file which are distribution-dependent. A comment  
-in this file should help regarding how to modify it. Also, any module  
-your put in /etc/modules will get loaded along with its parameters.  
-  
-  
-While there is great non-uniformity about how drivers find out about  
-bus-resources, the end goal is the same. If you're having problems  
-with a driver you may need to look at driver documentation (check the  
-kernel documentation tree). Some brief info on a few drivers is  
-presented in the following sections:  
-  
-  
-  
-  
-!!6.2 Serial Port Driver: setserial  
-  
-  
-  
- For PCI serial ports (and for newer 2.4 kernels for ISA), the  
-serial driver detects the type of serial port and PnP configures it.  
-Unfortunately, there may be some PCI serial ports that are not  
-supported yet.  
-  
-  
-For the standard ISA serial port with older versions of the kernel and  
-serial driver (not for multiport cards) you use setserial to configure  
-the driver. Using setserial is also a must for non-pnp serial ports.  
-Setserial is often run from a start-up file. In newer versions there  
-is a /etc/serial.conf file that you "edit" by simply using the  
-setserial command in the normal way and what you set using  
-setserial is saved in the serial.conf configuration  
-file. The serial.conf file should be consulted when the  
-setserial command runs from a start-up file. Your distribution  
-may or may not set this up for you.  
-  
-  
-There are two different ways to use setserial depending on the  
-options you give it. One way is used to manually tell the driver the  
-configuration. The other way is to probe at a given address and  
-report if a serial port exists there. It can also probe this address  
-and try to detect what IRQ is used for this port. The driver runs  
-something like setserial at start-up but it doesn't probe for  
-IRQs, it just assigns the "standard" IRQ which may be wrong. It does  
-probe for the existence of a port. See Serial-HOWTO for more details.  
-  
-  
-For PCI serial, the serial driver may detect certain modems and  
-configure the bus-resources.  
-  
-  
-  
-  
-!!6.3 Old ISA Sound Card Drivers  
-  
-  
-!OSS-Lite  
-  
-  
- You must give the IO, IRQ, and DMA as parameters to a module  
-or compile them into the kernel. But some PCI cards will get  
-automatically detected (likely by using the lspci command or the like).  
-!RedHat supplies a program "sndconfig" which detects ISA PnP cards and  
-automatically sets up the modules for loading with the detected  
-bus-resources.  
-  
-  
-  
-  
-!OSS (Open Sound System) and ALSA  
-  
-  
- These will detect the card by PnP methods and then select the  
-appropriate driver and load it. It will also set the bus-resources on an  
-ISA-PnP card. You may need to manually intervene to avoid conflicts.  
-For the ALSA driver, support for ISA-PnP is optional and you may use  
-isapnp tools if you want to.  
-  
-  
-  
-----  
-  
-!! 7. What Is My Current Configuration?  
-  
-  
- Here "configuration" means the assignment of PnP bus-resources  
-(addresses, IRQs, and DMAs). There are two parts to this question for  
-each device. Each part should have the same answer.  
-  
-  
-# What is the configuration of the device driver software?  
-I.e.: What does the driver think the hardware configuration is?  
-#  
-  
-# What configuration (if any) is set in the device hardware?  
-#  
-  
-  
-  
-Of course the configuration of the device hardware and its driver  
-should be the same (and it normally is). But if things are not  
-working right, it could be because there's a difference. This means  
-the the driver has incorrect information about the actual  
-configuration of the hardware. This spells trouble. If the software  
-you use doesn't adequately tell you what's wrong (or automatically  
-configure it correctly) then you need to investigate how your hardware  
-devices and their drivers are configured. While Linux device drivers  
-should "tell all" in some cases it's not easy to determine what has  
-been set in the hardware.  
-  
-  
-Another problem is that when you view configuration messages on the  
-screen, it's sometimes not clear whether the reported configuration is  
-that of the device driver, the device hardware, or both. If the  
-device driver has either set the configuration in the hardware or has  
-otherwise checked the hardware then the driver should have the correct  
-information.  
-  
-  
-But sometimes the driver has been provided incorrect resources by a  
-script, by incorrect resource parameters given to a module, or perhaps  
-just hasn't been told what the resources are and tries to use  
-incorrect default resources. For example, one can uses "setserial"  
-to tell the driver an incorrect resource configuration and the driver  
-accepts it without question.  
-  
-  
-  
-  
-!! 7.1 Boot-time Messages  
-  
-  
-  
- Some info on configuration may be obtained by reading the messages  
-from the BIOS and Linux that appear on the screen when you first start  
-the computer. These messages often flash by too fast to read but once  
-they stop type Shift-!PageUp a few times to scroll back to them. To  
-scroll forward thru them type Shift-!PageDown. Typing "dmesg" at any  
-time to the shell prompt will show only the Linux kernel messages and  
-miss some of the most important ones (including ones from the BIOS).  
-The messages from Linux may sometimes only show what the device driver  
-thinks the configuration is, perhaps as told it via an incorrect  
-configuration file.  
-  
-  
-The BIOS messages will show the actual hardware configuration at that  
-time, but isapnp, or pci utilities, or device drivers may change it  
-later. The BIOS messages are displayed first before the ones from  
-Linux. As an alternative to eventually using Shift-!PageUp to read  
-them, try freezing them by hitting the "Pause" key. Press any key to  
-resume. But once the messages from Linux start to appear, it's too  
-late to use "Pause" since it will not freeze the messages from Linux.  
-  
-  
-  
-  
-!!7.2 How Are My Device Drivers Configured?  
-  
-  
-  
- There may be a programs you can run from the command line (such as  
-"setserial" for serial ports) to determine this. The /proc directory  
-tree is useful. It seems that there are many files buried deep in  
-this tree that contain bus-resource info. Only a couple of them will  
-be mentioned here. /proc/ioports shows the I/O addresses that the  
-drivers use (or try if it's wrong). They might not be set this way in  
-hardware.  
-  
-  
-/proc/interrupts shows only interrupts currently in use. Many  
-interrupts that have been allocated to drivers don't show at all since  
-they're not currently being used. For example, even though your  
-floppy drive has a floppy disk in it and is ready to use, the  
-interrupt for it will not show unless its in use. Again, just because  
-an interrupt shows up here doesn't mean that it exists in the  
-hardware. A clue that it doesn't exist in hardware will be if it  
-shows that 0 interrupts have been issued by this interrupt. Even if  
-it shows some interrupts have been issued there is no guarantee that  
-they came from the device shown. It could be that some other device  
-which is not currently in use has issued them. A device not in use (per  
-the kernel) may still issue some interrupts for various reasons.  
-  
-  
-  
-  
-!!7.3 How Are My Hardware Devices Configured?  
-  
-  
-  
- It's easy to find out what bus-resources have been assigned to  
-devices on the PCI bus with the "lspci" or "scanpci" commands. For  
-for kernels < 2.2: see /proc/pci or /proc/bus/pci  
-for later kernels. Note that IRQs for /proc/pci are in  
-hexadecimal. Don't bother trying to decipher  
-/proc/bus/pci/devices since "lspci" will do that for you.  
-  
-  
-In most cases for PCI you will only see how the hardware is now  
-configured and not what resources are required. In some cases you  
-only see the base addresses (the starting addresses of the range) but  
-not the ending addresses. If you see the entire range then you can  
-determine how many bytes of address resource is needed. So in some  
-cases you could calculate the needed resources and possibly set (with  
-setpci --hard to use) a different address range (of the same length)  
-if needed. You only need to tell the device what the new base address  
-is since it internally has a knowledge of the length.  
-  
-  
-For the ISA bus you may try running pnpdump --dumpregs  
-but it's not a sure thing. The results may be seem cryptic but they  
-can be deciphered. Don't confuse the read-port address which  
-pnpdump "tries" (and finds something there) with the I/O address  
-of the found device. They are not the same. To try to find missing  
-hardware on the ISA bus (both PnP and legacy) try the program  
-"scanport" but be warned that it might hang your PC. It will not show  
-the IRQ nor will it positively identify the hardware.  
-  
-  
-Messages from the BIOS at boot-time tell you how the hardware  
-configuration was then. If only the BIOS does the configuring, then  
-it should still be the same. Messages from Linux may be from drivers  
-that used kernel PnP functions to inspect and/or set bus-resources.  
-These should be correct, but beware of messages that only show what is  
-in some configuration file (what the driver thinks). Of course, if  
-the device works fine, then it's likely configured the same as the  
-driver.  
-  
-  
-Some people use Windows to see how bus-resources have been set up.  
-Unfortunately, since the hardware forgets its bus-resource  
-configuration when powered down, the configuration may not be the same  
-under Linux. It sometimes turns out to be the same because in many  
-cases both Windows and Linux simply accept what the BIOS has set. But  
-where Windows and/or Linux do the configuring, they may do it  
-differently. So don't count on devices being configured the same.  
-  
-  
-  
-----  
-  
-!!8. Error Messages  
-  
-!!8.1 Unexpected Interrupt  
-  
-  
-  
- This means that an interrupt happened that no driver expected.  
-It's unlikely that the hardware issued an interrupt by mistake. It's  
-more likely that the software has a minor bug and doesn't realize that  
-some software did something to cause the interrupt. In many cases you  
-can safely ignore this error message, especially if it only happens  
-once or twice at boot-time. For boot-time messages, look at the  
-messages which are nearby for a clue as to what is going on. For  
-example, if probing is going on, perhaps a probe for a physical device  
-caused that device to issue an interrupt that the driver didn't  
-expect. Perhaps the driver wasn't listening for the correct IRQ  
-number.  
-  
-  
-  
-----  
-  
-!!9. Appendix  
-  
-!! 9.1 Universal Plug and Play (UPnP)  
-  
-  
-  
- This is actually a sort of network plug-and-play developed by  
-Microsoft but usable by Linux. You plug something into a network and  
-that something doesn't need to be configured provided it will only  
-communicate with other UPnP enabled devices on the network. Here  
-"configure" is used in the broad sense and doesn't mean just  
-configuring bus-resources. One objective is to allow people who know  
-little about networks or configuring to install routers, gateways,  
-network printers, etc. A major use for UPnP would be in wireless  
-networking.  
-  
-  
-UPnP uses:  
-  
-  
-* Simple Service Discovery Protocol to find devices  
-*  
-  
-* General Event Notification Architecture  
-*  
-  
-* Simple Object Access Protocol for controlling devices  
-*  
-  
-  
-  
-This HOWTO doesn't cover UPnP. UPnP for Linux is supported by Intel  
-which has developed software for it. There are other programs which  
-do about the same thing as UPnP. A comparison of some of them is at  
-http://www.cs.umbc.edu/~dchakr1/papers/mcommerce.html  
-  
-  
-  
-!! 9.2 Address Details  
-  
-  
-  
- There are three types of addresses: main memory addresses, I/O  
-addresses and configuration addresses. On the PCI bus, configuration  
-addresses constitute a separate address space just like I/O addresses  
-do. Except for the complicated case of ISA configuration addresses  
-whether or not an address on the bus is a memory address, I/O address,  
-or configuration address depends only on the voltage on other wires  
-(traces) of the bus. For the ISA configuration addresses see  
-ISA Bus Configuration Addresses (Read-Port etc.) for details  
-  
-  
-  
-  
-!Address ranges  
-  
-  
- The term "address" is sometimes used in this document to mean a  
-contiguous range of addresses. Since addresses are in units of bytes,  
-a single address is only the location of a single byte but I/O (and  
-main memory) addresses need more than this. So a range of say 8 bytes  
-is often used for I/O address while the range for main memory  
-addresses allocated to a device is much larger. For a serial port (an  
-I/O device) it's sufficient to give the starting I/O address of the  
-device (such as 3F8) since it's well known that the range of addresses  
-for serial port is only 8 bytes. The starting address is known as the  
-"base address". Sometimes just the word "range" is used to mean  
-"address range".  
-  
-  
-  
-  
-!Address space  
-  
-  
- For ISA, to access both I/O and (main) memory address "spaces"  
-the same address bus is used (the wires used for the address are  
-shared). How does the device know whether or not an address which  
-appears on the address bus is a memory address or I/O address? Well,  
-there are 4 dedicated wires on the bus that convey this information  
-and more. If a certain one of these 4 wires is asserted, it says that  
-the CPU wants to read from an I/O address, and the main memory ignores  
-the address on the bus. The other 3 wires serve similar purposes.  
-Thus read and write wires exist for both main memory and I/O addresses  
-(4 wires in all).  
-  
-  
-For the PCI bus it's the same basic idea (also using 4 wires) but it's  
-done a little differently. Instead of only one or the four wires  
-being asserted, a binary number is put on the wires (16 different  
-possibilities). Thus more info may be conveyed. Four of these 16  
-numbers serve the I/O and memory spaces as in the above paragraph. In  
-addition there is also configuration address space which uses up two  
-more numbers. Ten extra numbers are left over for other purposes.  
-  
-  
-  
-  
-!Range Check (ISA Testing for IO Address Conflicts)  
-  
-  
- On the ISA bus, there's a method built into each PnP card for  
-checking that there are no other cards that use the same I/O address.  
-If two or more cards use the same IO address, neither card is likely  
-to work right (if at all). Good PnP software should assign  
-bus-resources so as to avoid this conflict, but even in this case a  
-legacy card might be lurking somewhere with the same address.  
-  
-  
-The test works by a card putting a test number in its own IO  
-registers. Then the PnP software reads it and verifies that it reads  
-the same test number. If not, something is wrong (such as another  
-card with the same address. It repeats the same test with another  
-test number. Since it actually checks the range of IO addresses  
-assigned to the card, it's called a "range check". It could be better  
-called an address-conflict test. If there is an address conflict you  
-get an error message and need to resolve it yourself.  
-  
-  
-  
-  
-!Communicating Directly via Memory  
-  
-  
- Traditionally, most I/O devices used only I/O memory to  
-communicate with the CPU. For example, the serial port does this.  
-The device driver, running on the CPU would read and write data  
-to/from the I/O address space and main memory. A faster way would be  
-for the device itself to put the data directly into main memory. One  
-way to do this is by using  
-DMA Channels or bus  
-mastering. Another way is to allocate some space in main memory to  
-the device. This way the device reads and writes directly to main  
-memory without having to bother with DMA or bus mastering. Such  
-a device may also use IO addresses.  
-  
-  
-  
-  
-!! 9.3 ISA Bus Configuration Addresses (Read-Port etc.)  
-  
-  
-  
- These addresses are also known as the "Auto-configuration Ports".  
-For the ISA bus, there is technically no configuration address space,  
-but there is a special way for the CPU to access PnP configuration  
-registers on the PnP cards. For this purpose 3 @ I/O addresses are  
-allocated and each addresses only a single byte (there is no "range").  
-This is not 3 addresses for each card but 3 addresses shared by all  
-ISA-PnP cards.  
-  
-  
-These 3 addresses are named read-port, write-port, and address-port.  
-Each port is just one byte in size. Each PnP card has many  
-configuration registers so that just 3 addresses are not even  
-sufficient for the configuration registers on a single card. To solve  
-this problem, each card is assigned a card number (handle) using a  
-technique called "isolation". See  
-ISA Isolation for the complex details.  
-  
-  
-Then to configure a certain card, its card number (handle) is sent  
-out via the write-port address to tell that card that it is to listen  
-at its address port. All other cards note that this isn't their card  
-number and thus don't listen. Then the address of a configuration  
-register (for that card) is sent to the address-port (for all cards  
---but only one is listening). Next, data transfer takes place with  
-that configuration register on that card by either doing a read on the  
-read-port or a write on the write-port.  
-  
-  
-The write-port is always at A79 and the address-port is always at 279  
-(hex). The read-port is not fixed but is set by the configuration  
-software at some address (in the range 203-3FF) that will hopefully  
-not conflict with any other ISA card. If there is a conflict, it will  
-change the address. All PnP cards get "programmed" with this address.  
-Thus if you use say isapnp to set or check configuration data it must  
-determine this read-port address.  
-  
-  
-  
-  
-!! 9.4 Interrupts --Details  
-  
-  
-  
- Interrupts convey a lot of information but only indirectly. The  
-interrupt request signal (a voltage on a wire) just tells a chip  
-called the interrupt controller that a certain device needs attention.  
-The interrupt controller then signals the CPU. The CPU then  
-interrupts whatever it was doing, finds the driver for this device and  
-runs a part of it known as an "interrupt service routine" (or  
-"interrupt handler"). This "routine" tries to find out what has  
-happened and then deals with the problem. For example, bytes may need  
-to be transferred from/to the device. This program (routine) can  
-easily find out what has happened since the device has registers at  
-addresses known to the the driver software (provided the IRQ number  
-and the I/O address of the device has been set correctly). These  
-registers contain status information about the device . The software  
-reads the contents of these registers and by inspecting the contents,  
-finds out what happened and takes appropriate action.  
-  
-  
-Thus each device driver needs to know what interrupt number (IRQ) to  
-listen to. On the PCI bus (and for some special cases on the ISA bus)  
-it's possible for two (or more) devices to share the same IRQ number.  
-When such an interrupt is issued, the CPU runs all interrupt service  
-routines for all devices using that interrupt. The first thing the  
-first service routine does is to check its device registers to see if  
-an interrupt actually happened for its device. If it finds that its  
-device didn't issue an interrupt (a false alarm) it likely will  
-immediately exit and the service routine begins for the second device  
-using that same interrupt, etc, etc.  
-  
-  
-The putting of a voltage on the IRQ line is only a request that the  
-CPU be interrupted so it can run a device driver. In almost all cases  
-the CPU is interrupted per the request. But interrupts may be  
-temporarily disabled or prioritized so that in rare cases the actual  
-interrupt doesn't happen (or gets delayed). Thus what was above  
-called an "interrupt" is more precisely only an interrupt request  
-and explains why IRQ stands for Interrupt !ReQuest.  
-  
-  
-  
-  
-!!9.5 PCI Interrupts  
-  
-  
-  
- There are two newer developments in PCI interrupts that are not  
-covered here. They are especially important for cases of more than  
-one CPU per computer. One is the Advanced Programmable Interrupt  
-Controller (APIC). Another is Message Signalled Interrupts (MSI)  
-where the interrupt is just a message sent to a special address over  
-the main computer bus (no interrupt lines needed). But the device  
-that sends such a message must first gain control of the main bus so  
-that it can send the interrupt message. Such a message contains more  
-info than just "I'm sending an interrupt".  
-  
-  
-Ordinary PCI interrupts are different than ISA interrupts, but since  
-they are normally mapped to IRQ's they behave in about the same way.  
-One major difference is that the BIOS does this mapping. Under Linux  
-it's not feasible to change it ?? unless the CMOS menu will let you do  
-it. Another major difference is that PCI interrupts may be shared.  
-For example IRQ5 may be shared between two PCI devices. This sharing  
-ability is built into the hardware and all device drivers are supposed  
-to support it. Note that you can't share the same interrupt between  
-the PCI and ISA bus. However, illegal sharing will work provided the  
-devices which are in conflict are not in use at the same time. "In  
-use" here means that a program is running which "opened" the device in  
-its C programming code.  
-  
-  
-Here are some of the details of the PCI interrupt system. Each PCI  
-card (and device mounted on the motherboard) has 4 possible  
-interrupts: INTA#, INTB#, INTC#, INTD#. From now on we may call them  
-just A, B, C, and D. Each has its own pin on the edge connector of a  
-card. Thus for a 7-slot system there could be 7 x 4 = 28 different  
-interrupt lines for the cards. But the specs permit a fewer number of  
-interrupt lines so many PCI buses seem to be made with only 4  
-interrupt lines. This is not too restrictive since interrupts may be  
-shared. Call these lines (wires or traces) W, X, Y, Z. Suppose we  
-designate the B interrupt from slot 3 as interrupt 3B.  
-  
-  
-One simple method of connecting these lines to the interrupts would be  
-to connect all A interrupts (INTA#) to line W, all B's to X,  
-etc. This method was used several years ago but it is not a  
-good solution. Here's why. If a card only needs one interrupt, it's  
-required that it use A. If it needs two interrupts, it must use both  
-A and B, etc. Thus INTA# is used much more often than INTD#. So one  
-winds up with an excessive number of interrupts sharing the first line  
-(W connected to all the INTA#). To overcome this problem one may  
-connect them in a more complicated way so that each of the 4 interrupt  
-lines (W, X, Y, Z) will share about the same number of interrupts.  
-  
-  
-One method of doing this would be to have wire W share interrupts 1A,  
-2B, 3C, 4D, 5A, 6B, 7C. This is done by physically connecting wire W  
-to wires 1A, 2B, etc. Likewise wire X could be connected to wires 1B,  
-2C, 3D, 4A, 5B, 6C, 7D, etc. Then on startup, the BIOS maps the X, W,  
-Y, Z to IRQs. After that it writes the IRQ that each device uses into  
-a hardware configuration register in each device. From then on any  
-program interrogating this register can find out what IRQ the device  
-uses.  
-  
-  
-A card in a slot may have up to 8 devices on it but there are only 4  
-PCI interrupts for it (A, B, C, D). This is OK since interrupts may  
-be shared so that each of the 8 devices (if they exist) can have an  
-interrupt. The PCI interrupt letter of a device is often fixed and  
-hardwired into the device. The assignment of interrupts is done by  
-the BIOS mapping the ISA interrupts to the PCI interrupts as mentioned  
-above. If there are only 4 lines (W, X, Y, and Z) as in the above  
-example, the choices the PCI BIOS has are limited. Some motherboards  
-may use more lines and thus have more choices. The BIOS knows about  
-how this is wired.  
-  
-  
-On the PCI bus, the BIOS assigns IRQs (interrupts) so as to avoid  
-conflicts with the IRQs it knows about on the ISA bus. Sometimes in  
-the CMOS BIOS menu one may allow one to assign IRQs to PCI cards.  
-Also, a PnP operating system (for example MS Windows) could attempt to  
-assign these IRQs after first finding out what the BIOS has done. The  
-assignments are known as a "routing table". If MS Windows makes such  
-IRQ assignment dynamically (such as a docking event) it's called  
-"IRQ steering". The BIOS may support it's own IRQ steering (which  
-Linux could use). If you use Linux after Windows without turning off  
-your PC, the IRQs may be different than what the BIOS set.  
-  
-  
-You might think that since the PCI is using IRQ's (ISA bus) it might  
-be slow since the ISA bus is slow. Not really. The ISA Interrupt  
-Controller Chip(s) has a direct interrupt wire going to the CPU so it  
-can get immediate attention. While signals on the ISA address and  
-data buses may be slow to get to the CPU, the IRQ interrupt signals  
-get there almost instantly.  
-  
-  
-  
-  
-!! 9.6 ISA Isolation  
-  
-  
-  
- This is only for the ISA bus. Isolation is a complex method of  
-assigning a temporary handle (id number or Card Select Number = CSN)  
-to each PnP device on the ISA bus. Since there are more efficient  
-(but more complex) ways to do this, some might claim that it's a  
-simple method. Only one write address is used for PnP writes to all  
-PnP devices so that writing to this address goes to all PnP device  
-that are listening. This write address is used to send (assign) a  
-unique handle to each PnP device. To assign this handle requires that  
-only one device be listening when the handle is sent (written) to this  
-common address. All PnP devices have a unique serial number which  
-they use for the process of isolation. Doing isolation is something  
-like a game. It's done using the equivalent of just one common bus  
-wire connecting all PnP devices to the isolation program.  
-  
-  
-For the first round of the "game" all PnP devices listen on this wire  
-and send out simultaneously a sequence of bits to the wire. The  
-allowed bits are either a 1 (positive voltage) or an "open " of no  
-voltage (open circuit or tri-state). To do this, each PnP device just  
-starts to sequentially send out its serial number on this wire,  
-bit-by-bit, starting with the high-order bit. If any device sends a  
-1, a 1 will be heard on the wire by all other devices. If all devices  
-send an "open " nothing will be heard on the wire. The object is to  
-eliminate (by the end of this first round) all but highest serial  
-number device. "Eliminate" means to drop out of this round of the  
-game and thus temporarily cease to listen anymore to the wire. (Note  
-that all serial numbers are of the same length.) When there remains  
-only one device still listening, it will be given a handle (card  
-number).  
-  
-  
-First consider only the high-order bit of the serial number which is  
-put on the wire first by all devices which have no handle yet. If any  
-PnP device sends out a 0 (open ) but hears a 1, this means that some  
-other PnP device has a higher serial number, so it temporarily drops  
-out of this round. Now the devices remaining in the game (for this  
-round) all have the same leading digit (a 1) so we may strip off this  
-digit and consider only the resulting "stripped serial number" for  
-future participation in this round. Then go to the start of this  
-paragraph and repeat until the entire serial number has been examined  
-for each device (see below for the all-0 case).  
-  
-  
-Thus it's clear that only cards with the lower serial number get  
-eliminated during a round. But what happens if all devices in the  
-game all send out a 0 as their high-order bit? In this case an "open  
-" is sent on the line and all participants stay in the game. If they  
-all have a leading 0 then this is a tie and the 's are stripped off  
-just like the 1's were in the above paragraph. The game then  
-continues as the next digit (of the serial number) is sent out.  
-  
-  
-At the end of the round (after the low-order bit of the serial number  
-has been sent out) only one PnP device with the highest serial number  
-remains in the game. It then gets assigned a handle and drops out of  
-the game permanently. Then all the dropouts from the previous round  
-(that don't have a handle yet) reenter the game and a new round begins  
-with one less participant. Eventually, all PnP devices are assigned  
-handles. It's easy to prove that this algorithm works. The actual  
-algorithm is a little more complex than that presented above since  
-each step is repeated twice to ensure reliability and the repeats are  
-done somewhat differently (but use the same basic idea).  
-  
-  
-Once all handles are assigned, they are used to address each PnP  
-device for sending/reading configuration data. Note that these  
-handles are only used for PnP configuration and are not used for  
-normal communication with the PnP device. When the computer starts  
-up a PnP BIOS will often do such an isolation and then a PnP  
-configuration. After that, all the handles are "lost" so that if one  
-wants to change (or inspect) the configuration again, the isolation  
-must be done over again .  
-  
-  
-END OF Plug-and-Play-HOWTO  
-----  
+Describe [HowToPlugandPlayHOWTO ] here.