| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |  | 
|  | 2 | Linux and parallel port IDE devices | 
|  | 3 |  | 
|  | 4 | PARIDE v1.03   (c) 1997-8  Grant Guenther <grant@torque.net> | 
|  | 5 |  | 
|  | 6 | 1. Introduction | 
|  | 7 |  | 
|  | 8 | Owing to the simplicity and near universality of the parallel port interface | 
|  | 9 | to personal computers, many external devices such as portable hard-disk, | 
|  | 10 | CD-ROM, LS-120 and tape drives use the parallel port to connect to their | 
|  | 11 | host computer.  While some devices (notably scanners) use ad-hoc methods | 
|  | 12 | to pass commands and data through the parallel port interface, most | 
|  | 13 | external devices are actually identical to an internal model, but with | 
|  | 14 | a parallel-port adapter chip added in.  Some of the original parallel port | 
|  | 15 | adapters were little more than mechanisms for multiplexing a SCSI bus. | 
|  | 16 | (The Iomega PPA-3 adapter used in the ZIP drives is an example of this | 
|  | 17 | approach).  Most current designs, however, take a different approach. | 
|  | 18 | The adapter chip reproduces a small ISA or IDE bus in the external device | 
|  | 19 | and the communication protocol provides operations for reading and writing | 
|  | 20 | device registers, as well as data block transfer functions.  Sometimes, | 
|  | 21 | the device being addressed via the parallel cable is a standard SCSI | 
|  | 22 | controller like an NCR 5380.  The "ditto" family of external tape | 
|  | 23 | drives use the ISA replicator to interface a floppy disk controller, | 
|  | 24 | which is then connected to a floppy-tape mechanism.  The vast majority | 
|  | 25 | of external parallel port devices, however, are now based on standard | 
|  | 26 | IDE type devices, which require no intermediate controller.  If one | 
|  | 27 | were to open up a parallel port CD-ROM drive, for instance, one would | 
|  | 28 | find a standard ATAPI CD-ROM drive, a power supply, and a single adapter | 
|  | 29 | that interconnected a standard PC parallel port cable and a standard | 
|  | 30 | IDE cable.  It is usually possible to exchange the CD-ROM device with | 
|  | 31 | any other device using the IDE interface. | 
|  | 32 |  | 
|  | 33 | The document describes the support in Linux for parallel port IDE | 
|  | 34 | devices.  It does not cover parallel port SCSI devices, "ditto" tape | 
|  | 35 | drives or scanners.  Many different devices are supported by the | 
|  | 36 | parallel port IDE subsystem, including: | 
|  | 37 |  | 
|  | 38 | MicroSolutions backpack CD-ROM | 
|  | 39 | MicroSolutions backpack PD/CD | 
|  | 40 | MicroSolutions backpack hard-drives | 
|  | 41 | MicroSolutions backpack 8000t tape drive | 
|  | 42 | SyQuest EZ-135, EZ-230 & SparQ drives | 
|  | 43 | Avatar Shark | 
|  | 44 | Imation Superdisk LS-120 | 
|  | 45 | Maxell Superdisk LS-120 | 
|  | 46 | FreeCom Power CD | 
|  | 47 | Hewlett-Packard 5GB and 8GB tape drives | 
|  | 48 | Hewlett-Packard 7100 and 7200 CD-RW drives | 
|  | 49 |  | 
|  | 50 | as well as most of the clone and no-name products on the market. | 
|  | 51 |  | 
|  | 52 | To support such a wide range of devices, PARIDE, the parallel port IDE | 
|  | 53 | subsystem, is actually structured in three parts.   There is a base | 
|  | 54 | paride module which provides a registry and some common methods for | 
|  | 55 | accessing the parallel ports.  The second component is a set of | 
|  | 56 | high-level drivers for each of the different types of supported devices: | 
|  | 57 |  | 
|  | 58 | pd	IDE disk | 
|  | 59 | pcd	ATAPI CD-ROM | 
|  | 60 | pf	ATAPI disk | 
|  | 61 | pt	ATAPI tape | 
|  | 62 | pg	ATAPI generic | 
|  | 63 |  | 
|  | 64 | (Currently, the pg driver is only used with CD-R drives). | 
|  | 65 |  | 
|  | 66 | The high-level drivers function according to the relevant standards. | 
|  | 67 | The third component of PARIDE is a set of low-level protocol drivers | 
|  | 68 | for each of the parallel port IDE adapter chips.  Thanks to the interest | 
|  | 69 | and encouragement of Linux users from many parts of the world, | 
|  | 70 | support is available for almost all known adapter protocols: | 
|  | 71 |  | 
|  | 72 | aten    ATEN EH-100                            (HK) | 
|  | 73 | bpck    Microsolutions backpack                (US) | 
|  | 74 | comm    DataStor (old-type) "commuter" adapter (TW) | 
|  | 75 | dstr    DataStor EP-2000                       (TW) | 
|  | 76 | epat    Shuttle EPAT                           (UK) | 
|  | 77 | epia    Shuttle EPIA                           (UK) | 
|  | 78 | fit2    FIT TD-2000			       (US) | 
|  | 79 | fit3    FIT TD-3000			       (US) | 
|  | 80 | friq    Freecom IQ cable                       (DE) | 
|  | 81 | frpw    Freecom Power                          (DE) | 
|  | 82 | kbic    KingByte KBIC-951A and KBIC-971A       (TW) | 
|  | 83 | ktti    KT Technology PHd adapter              (SG) | 
|  | 84 | on20    OnSpec 90c20                           (US) | 
|  | 85 | on26    OnSpec 90c26                           (US) | 
|  | 86 |  | 
|  | 87 |  | 
|  | 88 | 2. Using the PARIDE subsystem | 
|  | 89 |  | 
|  | 90 | While configuring the Linux kernel, you may choose either to build | 
|  | 91 | the PARIDE drivers into your kernel, or to build them as modules. | 
|  | 92 |  | 
|  | 93 | In either case, you will need to select "Parallel port IDE device support" | 
|  | 94 | as well as at least one of the high-level drivers and at least one | 
|  | 95 | of the parallel port communication protocols.  If you do not know | 
|  | 96 | what kind of parallel port adapter is used in your drive, you could | 
|  | 97 | begin by checking the file names and any text files on your DOS | 
|  | 98 | installation floppy.  Alternatively, you can look at the markings on | 
|  | 99 | the adapter chip itself.  That's usually sufficient to identify the | 
|  | 100 | correct device. | 
|  | 101 |  | 
|  | 102 | You can actually select all the protocol modules, and allow the PARIDE | 
|  | 103 | subsystem to try them all for you. | 
|  | 104 |  | 
|  | 105 | For the "brand-name" products listed above, here are the protocol | 
|  | 106 | and high-level drivers that you would use: | 
|  | 107 |  | 
|  | 108 | Manufacturer		Model		Driver	Protocol | 
|  | 109 |  | 
|  | 110 | MicroSolutions		CD-ROM		pcd	bpck | 
|  | 111 | MicroSolutions		PD drive	pf	bpck | 
|  | 112 | MicroSolutions		hard-drive	pd	bpck | 
|  | 113 | MicroSolutions          8000t tape      pt      bpck | 
|  | 114 | SyQuest			EZ, SparQ	pd	epat | 
|  | 115 | Imation			Superdisk	pf	epat | 
|  | 116 | Maxell                  Superdisk       pf      friq | 
|  | 117 | Avatar			Shark		pd	epat | 
|  | 118 | FreeCom			CD-ROM		pcd	frpw | 
|  | 119 | Hewlett-Packard		5GB Tape	pt	epat | 
|  | 120 | Hewlett-Packard		7200e (CD)	pcd	epat | 
|  | 121 | Hewlett-Packard		7200e (CD-R)	pg	epat | 
|  | 122 |  | 
|  | 123 | 2.1  Configuring built-in drivers | 
|  | 124 |  | 
|  | 125 | We recommend that you get to know how the drivers work and how to | 
|  | 126 | configure them as loadable modules, before attempting to compile a | 
|  | 127 | kernel with the drivers built-in. | 
|  | 128 |  | 
|  | 129 | If you built all of your PARIDE support directly into your kernel, | 
|  | 130 | and you have just a single parallel port IDE device, your kernel should | 
|  | 131 | locate it automatically for you.  If you have more than one device, | 
|  | 132 | you may need to give some command line options to your bootloader | 
|  | 133 | (eg: LILO), how to do that is beyond the scope of this document. | 
|  | 134 |  | 
|  | 135 | The high-level drivers accept a number of command line parameters, all | 
|  | 136 | of which are documented in the source files in linux/drivers/block/paride. | 
|  | 137 | By default, each driver will automatically try all parallel ports it | 
|  | 138 | can find, and all protocol types that have been installed, until it finds | 
|  | 139 | a parallel port IDE adapter.  Once it finds one, the probe stops.  So, | 
|  | 140 | if you have more than one device, you will need to tell the drivers | 
|  | 141 | how to identify them.  This requires specifying the port address, the | 
|  | 142 | protocol identification number and, for some devices, the drive's | 
|  | 143 | chain ID.  While your system is booting, a number of messages are | 
|  | 144 | displayed on the console.  Like all such messages, they can be | 
|  | 145 | reviewed with the 'dmesg' command.  Among those messages will be | 
|  | 146 | some lines like: | 
|  | 147 |  | 
|  | 148 | paride: bpck registered as protocol 0 | 
|  | 149 | paride: epat registered as protocol 1 | 
|  | 150 |  | 
|  | 151 | The numbers will always be the same until you build a new kernel with | 
|  | 152 | different protocol selections.  You should note these numbers as you | 
|  | 153 | will need them to identify the devices. | 
|  | 154 |  | 
|  | 155 | If you happen to be using a MicroSolutions backpack device, you will | 
|  | 156 | also need to know the unit ID number for each drive.  This is usually | 
|  | 157 | the last two digits of the drive's serial number (but read MicroSolutions' | 
|  | 158 | documentation about this). | 
|  | 159 |  | 
|  | 160 | As an example, let's assume that you have a MicroSolutions PD/CD drive | 
|  | 161 | with unit ID number 36 connected to the parallel port at 0x378, a SyQuest | 
|  | 162 | EZ-135 connected to the chained port on the PD/CD drive and also an | 
|  | 163 | Imation Superdisk connected to port 0x278.  You could give the following | 
|  | 164 | options on your boot command: | 
|  | 165 |  | 
|  | 166 | pd.drive0=0x378,1 pf.drive0=0x278,1 pf.drive1=0x378,0,36 | 
|  | 167 |  | 
|  | 168 | In the last option, pf.drive1 configures device /dev/pf1, the 0x378 | 
|  | 169 | is the parallel port base address, the 0 is the protocol registration | 
|  | 170 | number and 36 is the chain ID. | 
|  | 171 |  | 
|  | 172 | Please note:  while PARIDE will work both with and without the | 
|  | 173 | PARPORT parallel port sharing system that is included by the | 
|  | 174 | "Parallel port support" option, PARPORT must be included and enabled | 
|  | 175 | if you want to use chains of devices on the same parallel port. | 
|  | 176 |  | 
|  | 177 | 2.2  Loading and configuring PARIDE as modules | 
|  | 178 |  | 
|  | 179 | It is much faster and simpler to get to understand the PARIDE drivers | 
|  | 180 | if you use them as loadable kernel modules. | 
|  | 181 |  | 
|  | 182 | Note 1:  using these drivers with the "kerneld" automatic module loading | 
|  | 183 | system is not recommended for beginners, and is not documented here. | 
|  | 184 |  | 
|  | 185 | Note 2:  if you build PARPORT support as a loadable module, PARIDE must | 
|  | 186 | also be built as loadable modules, and PARPORT must be loaded before the | 
|  | 187 | PARIDE modules. | 
|  | 188 |  | 
|  | 189 | To use PARIDE, you must begin by | 
|  | 190 |  | 
|  | 191 | insmod paride | 
|  | 192 |  | 
|  | 193 | this loads a base module which provides a registry for the protocols, | 
|  | 194 | among other tasks. | 
|  | 195 |  | 
|  | 196 | Then, load as many of the protocol modules as you think you might need. | 
|  | 197 | As you load each module, it will register the protocols that it supports, | 
|  | 198 | and print a log message to your kernel log file and your console. For | 
|  | 199 | example: | 
|  | 200 |  | 
|  | 201 | # insmod epat | 
|  | 202 | paride: epat registered as protocol 0 | 
|  | 203 | # insmod kbic | 
|  | 204 | paride: k951 registered as protocol 1 | 
|  | 205 | paride: k971 registered as protocol 2 | 
|  | 206 |  | 
|  | 207 | Finally, you can load high-level drivers for each kind of device that | 
|  | 208 | you have connected.  By default, each driver will autoprobe for a single | 
|  | 209 | device, but you can support up to four similar devices by giving their | 
|  | 210 | individual co-ordinates when you load the driver. | 
|  | 211 |  | 
|  | 212 | For example, if you had two no-name CD-ROM drives both using the | 
|  | 213 | KingByte KBIC-951A adapter, one on port 0x378 and the other on 0x3bc | 
|  | 214 | you could give the following command: | 
|  | 215 |  | 
|  | 216 | # insmod pcd drive0=0x378,1 drive1=0x3bc,1 | 
|  | 217 |  | 
|  | 218 | For most adapters, giving a port address and protocol number is sufficient, | 
|  | 219 | but check the source files in linux/drivers/block/paride for more | 
|  | 220 | information.  (Hopefully someone will write some man pages one day !). | 
|  | 221 |  | 
|  | 222 | As another example, here's what happens when PARPORT is installed, and | 
|  | 223 | a SyQuest EZ-135 is attached to port 0x378: | 
|  | 224 |  | 
|  | 225 | # insmod paride | 
|  | 226 | paride: version 1.0 installed | 
|  | 227 | # insmod epat | 
|  | 228 | paride: epat registered as protocol 0 | 
|  | 229 | # insmod pd | 
|  | 230 | pd: pd version 1.0, major 45, cluster 64, nice 0 | 
|  | 231 | pda: Sharing parport1 at 0x378 | 
|  | 232 | pda: epat 1.0, Shuttle EPAT chip c3 at 0x378, mode 5 (EPP-32), delay 1 | 
|  | 233 | pda: SyQuest EZ135A, 262144 blocks [128M], (512/16/32), removable media | 
|  | 234 | pda: pda1 | 
|  | 235 |  | 
|  | 236 | Note that the last line is the output from the generic partition table | 
|  | 237 | scanner - in this case it reports that it has found a disk with one partition. | 
|  | 238 |  | 
|  | 239 | 2.3  Using a PARIDE device | 
|  | 240 |  | 
|  | 241 | Once the drivers have been loaded, you can access PARIDE devices in the | 
|  | 242 | same way as their traditional counterparts.  You will probably need to | 
|  | 243 | create the device "special files".  Here is a simple script that you can | 
|  | 244 | cut to a file and execute: | 
|  | 245 |  | 
|  | 246 | #!/bin/bash | 
|  | 247 | # | 
|  | 248 | # mkd -- a script to create the device special files for the PARIDE subsystem | 
|  | 249 | # | 
|  | 250 | function mkdev { | 
|  | 251 | mknod $1 $2 $3 $4 ; chmod 0660 $1 ; chown root:disk $1 | 
|  | 252 | } | 
|  | 253 | # | 
|  | 254 | function pd { | 
|  | 255 | D=$( printf \\$( printf "x%03x" $[ $1 + 97 ] ) ) | 
|  | 256 | mkdev pd$D b 45 $[ $1 * 16 ] | 
|  | 257 | for P in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 
|  | 258 | do mkdev pd$D$P b 45 $[ $1 * 16 + $P ] | 
|  | 259 | done | 
|  | 260 | } | 
|  | 261 | # | 
|  | 262 | cd /dev | 
|  | 263 | # | 
|  | 264 | for u in 0 1 2 3 ; do pd $u ; done | 
|  | 265 | for u in 0 1 2 3 ; do mkdev pcd$u b 46 $u ; done | 
|  | 266 | for u in 0 1 2 3 ; do mkdev pf$u  b 47 $u ; done | 
|  | 267 | for u in 0 1 2 3 ; do mkdev pt$u  c 96 $u ; done | 
|  | 268 | for u in 0 1 2 3 ; do mkdev npt$u c 96 $[ $u + 128 ] ; done | 
|  | 269 | for u in 0 1 2 3 ; do mkdev pg$u  c 97 $u ; done | 
|  | 270 | # | 
|  | 271 | # end of mkd | 
|  | 272 |  | 
|  | 273 | With the device files and drivers in place, you can access PARIDE devices | 
|  | 274 | like any other Linux device.   For example, to mount a CD-ROM in pcd0, use: | 
|  | 275 |  | 
|  | 276 | mount /dev/pcd0 /cdrom | 
|  | 277 |  | 
|  | 278 | If you have a fresh Avatar Shark cartridge, and the drive is pda, you | 
|  | 279 | might do something like: | 
|  | 280 |  | 
|  | 281 | fdisk /dev/pda		-- make a new partition table with | 
|  | 282 | partition 1 of type 83 | 
|  | 283 |  | 
|  | 284 | mke2fs /dev/pda1	-- to build the file system | 
|  | 285 |  | 
|  | 286 | mkdir /shark		-- make a place to mount the disk | 
|  | 287 |  | 
|  | 288 | mount /dev/pda1 /shark | 
|  | 289 |  | 
|  | 290 | Devices like the Imation superdisk work in the same way, except that | 
|  | 291 | they do not have a partition table.  For example to make a 120MB | 
|  | 292 | floppy that you could share with a DOS system: | 
|  | 293 |  | 
|  | 294 | mkdosfs /dev/pf0 | 
|  | 295 | mount /dev/pf0 /mnt | 
|  | 296 |  | 
|  | 297 |  | 
|  | 298 | 2.4  The pf driver | 
|  | 299 |  | 
|  | 300 | The pf driver is intended for use with parallel port ATAPI disk | 
|  | 301 | devices.  The most common devices in this category are PD drives | 
|  | 302 | and LS-120 drives.  Traditionally, media for these devices are not | 
|  | 303 | partitioned.  Consequently, the pf driver does not support partitioned | 
|  | 304 | media.  This may be changed in a future version of the driver. | 
|  | 305 |  | 
|  | 306 | 2.5  Using the pt driver | 
|  | 307 |  | 
|  | 308 | The pt driver for parallel port ATAPI tape drives is a minimal driver. | 
|  | 309 | It does not yet support many of the standard tape ioctl operations. | 
|  | 310 | For best performance, a block size of 32KB should be used.  You will | 
|  | 311 | probably want to set the parallel port delay to 0, if you can. | 
|  | 312 |  | 
|  | 313 | 2.6  Using the pg driver | 
|  | 314 |  | 
|  | 315 | The pg driver can be used in conjunction with the cdrecord program | 
|  | 316 | to create CD-ROMs.  Please get cdrecord version 1.6.1 or later | 
|  | 317 | from ftp://ftp.fokus.gmd.de/pub/unix/cdrecord/ .  To record CD-R media | 
|  | 318 | your parallel port should ideally be set to EPP mode, and the "port delay" | 
|  | 319 | should be set to 0.  With those settings it is possible to record at 2x | 
|  | 320 | speed without any buffer underruns.  If you cannot get the driver to work | 
|  | 321 | in EPP mode, try to use "bidirectional" or "PS/2" mode and 1x speeds only. | 
|  | 322 |  | 
|  | 323 |  | 
|  | 324 | 3. Troubleshooting | 
|  | 325 |  | 
|  | 326 | 3.1  Use EPP mode if you can | 
|  | 327 |  | 
|  | 328 | The most common problems that people report with the PARIDE drivers | 
|  | 329 | concern the parallel port CMOS settings.  At this time, none of the | 
|  | 330 | PARIDE protocol modules support ECP mode, or any ECP combination modes. | 
|  | 331 | If you are able to do so, please set your parallel port into EPP mode | 
|  | 332 | using your CMOS setup procedure. | 
|  | 333 |  | 
|  | 334 | 3.2  Check the port delay | 
|  | 335 |  | 
|  | 336 | Some parallel ports cannot reliably transfer data at full speed.  To | 
|  | 337 | offset the errors, the PARIDE protocol modules introduce a "port | 
|  | 338 | delay" between each access to the i/o ports.  Each protocol sets | 
|  | 339 | a default value for this delay.  In most cases, the user can override | 
|  | 340 | the default and set it to 0 - resulting in somewhat higher transfer | 
|  | 341 | rates.  In some rare cases (especially with older 486 systems) the | 
|  | 342 | default delays are not long enough.  if you experience corrupt data | 
|  | 343 | transfers, or unexpected failures, you may wish to increase the | 
|  | 344 | port delay.   The delay can be programmed using the "driveN" parameters | 
|  | 345 | to each of the high-level drivers.  Please see the notes above, or | 
|  | 346 | read the comments at the beginning of the driver source files in | 
|  | 347 | linux/drivers/block/paride. | 
|  | 348 |  | 
|  | 349 | 3.3  Some drives need a printer reset | 
|  | 350 |  | 
|  | 351 | There appear to be a number of "noname" external drives on the market | 
|  | 352 | that do not always power up correctly.  We have noticed this with some | 
|  | 353 | drives based on OnSpec and older Freecom adapters.  In these rare cases, | 
|  | 354 | the adapter can often be reinitialised by issuing a "printer reset" on | 
|  | 355 | the parallel port.  As the reset operation is potentially disruptive in | 
|  | 356 | multiple device environments, the PARIDE drivers will not do it | 
|  | 357 | automatically.  You can however, force a printer reset by doing: | 
|  | 358 |  | 
|  | 359 | insmod lp reset=1 | 
|  | 360 | rmmod lp | 
|  | 361 |  | 
|  | 362 | If you have one of these marginal cases, you should probably build | 
|  | 363 | your paride drivers as modules, and arrange to do the printer reset | 
|  | 364 | before loading the PARIDE drivers. | 
|  | 365 |  | 
|  | 366 | 3.4  Use the verbose option and dmesg if you need help | 
|  | 367 |  | 
|  | 368 | While a lot of testing has gone into these drivers to make them work | 
|  | 369 | as smoothly as possible, problems will arise.  If you do have problems, | 
|  | 370 | please check all the obvious things first:  does the drive work in | 
|  | 371 | DOS with the manufacturer's drivers ?  If that doesn't yield any useful | 
|  | 372 | clues, then please make sure that only one drive is hooked to your system, | 
|  | 373 | and that either (a) PARPORT is enabled or (b) no other device driver | 
|  | 374 | is using your parallel port (check in /proc/ioports).  Then, load the | 
|  | 375 | appropriate drivers (you can load several protocol modules if you want) | 
|  | 376 | as in: | 
|  | 377 |  | 
|  | 378 | # insmod paride | 
|  | 379 | # insmod epat | 
|  | 380 | # insmod bpck | 
|  | 381 | # insmod kbic | 
|  | 382 | ... | 
|  | 383 | # insmod pd verbose=1 | 
|  | 384 |  | 
|  | 385 | (using the correct driver for the type of device you have, of course). | 
|  | 386 | The verbose=1 parameter will cause the drivers to log a trace of their | 
|  | 387 | activity as they attempt to locate your drive. | 
|  | 388 |  | 
|  | 389 | Use 'dmesg' to capture a log of all the PARIDE messages (any messages | 
|  | 390 | beginning with paride:, a protocol module's name or a driver's name) and | 
|  | 391 | include that with your bug report.  You can submit a bug report in one | 
|  | 392 | of two ways.  Either send it directly to the author of the PARIDE suite, | 
|  | 393 | by e-mail to grant@torque.net, or join the linux-parport mailing list | 
|  | 394 | and post your report there. | 
|  | 395 |  | 
|  | 396 | 3.5  For more information or help | 
|  | 397 |  | 
|  | 398 | You can join the linux-parport mailing list by sending a mail message | 
|  | 399 | to | 
|  | 400 | linux-parport-request@torque.net | 
|  | 401 |  | 
|  | 402 | with the single word | 
|  | 403 |  | 
|  | 404 | subscribe | 
|  | 405 |  | 
|  | 406 | in the body of the mail message (not in the subject line).   Please be | 
|  | 407 | sure that your mail program is correctly set up when you do this,  as | 
|  | 408 | the list manager is a robot that will subscribe you using the reply | 
|  | 409 | address in your mail headers.  REMOVE any anti-spam gimmicks you may | 
|  | 410 | have in your mail headers, when sending mail to the list server. | 
|  | 411 |  | 
|  | 412 | You might also find some useful information on the linux-parport | 
|  | 413 | web pages (although they are not always up to date) at | 
|  | 414 |  | 
| Justin P. Mattock | 0ea6e61 | 2010-07-23 20:51:24 -0700 | [diff] [blame] | 415 | http://web.archive.org/web/*/http://www.torque.net/parport/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 416 |  | 
|  | 417 |  |