![Bartlomiej Zolnierkiewicz](/assets/img/avatar_default.png)
Remove broken disk byte-swapping support: - it can cause a data corruption on SMP (or if using PREEMPT on UP) - all data coming from disk are byte-swapped by taskfile_*_data() which results in incorrect identify data being reported by /proc/ide/ and IOCTLs - "hdx=bswap/byteswap" kernel parameter has been broken on m68k host drivers (including Atari/Q40 ones) since 2.5.x days (because of 'hwif' zero-ing) - byte-swapping is limited to PIO transfers (for working with TiVo disks on x86 machines using user-space solutions or dm-byteswap should result in much better performance because DMA can be used) For previous discussions please see: http://www.ussg.iu.edu/hypermail/linux/kernel/0201.0/0768.html http://lkml.org/lkml/2004/2/28/111 [ I have dm-byteswap device mapper target if somebody is interested (patch is for 2.6.4 though but I'll dust it off if needed). ] Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
385 lines
15 KiB
Text
385 lines
15 KiB
Text
|
|
Information regarding the Enhanced IDE drive in Linux 2.6
|
|
|
|
==============================================================================
|
|
|
|
|
|
The hdparm utility can be used to control various IDE features on a
|
|
running system. It is packaged separately. Please Look for it on popular
|
|
linux FTP sites.
|
|
|
|
|
|
|
|
*** IMPORTANT NOTICES: BUGGY IDE CHIPSETS CAN CORRUPT DATA!!
|
|
*** =================
|
|
*** PCI versions of the CMD640 and RZ1000 interfaces are now detected
|
|
*** automatically at startup when PCI BIOS support is configured.
|
|
***
|
|
*** Linux disables the "prefetch" ("readahead") mode of the RZ1000
|
|
*** to prevent data corruption possible due to hardware design flaws.
|
|
***
|
|
*** For the CMD640, linux disables "IRQ unmasking" (hdparm -u1) on any
|
|
*** drive for which the "prefetch" mode of the CMD640 is turned on.
|
|
*** If "prefetch" is disabled (hdparm -p8), then "IRQ unmasking" can be
|
|
*** used again.
|
|
***
|
|
*** For the CMD640, linux disables "32bit I/O" (hdparm -c1) on any drive
|
|
*** for which the "prefetch" mode of the CMD640 is turned off.
|
|
*** If "prefetch" is enabled (hdparm -p9), then "32bit I/O" can be
|
|
*** used again.
|
|
***
|
|
*** The CMD640 is also used on some Vesa Local Bus (VLB) cards, and is *NOT*
|
|
*** automatically detected by Linux. For safe, reliable operation with such
|
|
*** interfaces, one *MUST* use the "cmd640.probe_vlb" kernel option.
|
|
***
|
|
*** Use of the "serialize" option is no longer necessary.
|
|
|
|
================================================================================
|
|
Common pitfalls:
|
|
|
|
- 40-conductor IDE cables are capable of transferring data in DMA modes up to
|
|
udma2, but no faster.
|
|
|
|
- If possible devices should be attached to separate channels if they are
|
|
available. Typically the disk on the first and CD-ROM on the second.
|
|
|
|
- If you mix devices on the same cable, please consider using similar devices
|
|
in respect of the data transfer mode they support.
|
|
|
|
- Even better try to stick to the same vendor and device type on the same
|
|
cable.
|
|
|
|
================================================================================
|
|
|
|
This is the multiple IDE interface driver, as evolved from hd.c.
|
|
|
|
It supports up to 9 IDE interfaces per default, on one or more IRQs (usually
|
|
14 & 15). There can be up to two drives per interface, as per the ATA-6 spec.
|
|
|
|
Primary: ide0, port 0x1f0; major=3; hda is minor=0; hdb is minor=64
|
|
Secondary: ide1, port 0x170; major=22; hdc is minor=0; hdd is minor=64
|
|
Tertiary: ide2, port 0x1e8; major=33; hde is minor=0; hdf is minor=64
|
|
Quaternary: ide3, port 0x168; major=34; hdg is minor=0; hdh is minor=64
|
|
fifth.. ide4, usually PCI, probed
|
|
sixth.. ide5, usually PCI, probed
|
|
|
|
To access devices on interfaces > ide0, device entries please make sure that
|
|
device files for them are present in /dev. If not, please create such
|
|
entries, by using /dev/MAKEDEV.
|
|
|
|
This driver automatically probes for most IDE interfaces (including all PCI
|
|
ones), for the drives/geometries attached to those interfaces, and for the IRQ
|
|
lines being used by the interfaces (normally 14, 15 for ide0/ide1).
|
|
|
|
For special cases, interfaces may be specified using kernel "command line"
|
|
options. For example,
|
|
|
|
ide3=0x168,0x36e,10 /* ioports 0x168-0x16f,0x36e, irq 10 */
|
|
|
|
Normally the irq number need not be specified, as ide.c will probe for it:
|
|
|
|
ide3=0x168,0x36e /* ioports 0x168-0x16f,0x36e */
|
|
|
|
The standard port, and irq values are these:
|
|
|
|
ide0=0x1f0,0x3f6,14
|
|
ide1=0x170,0x376,15
|
|
ide2=0x1e8,0x3ee,11
|
|
ide3=0x168,0x36e,10
|
|
|
|
Note that the first parameter reserves 8 contiguous ioports, whereas the
|
|
second value denotes a single ioport. If in doubt, do a 'cat /proc/ioports'.
|
|
|
|
In all probability the device uses these ports and IRQs if it is attached
|
|
to the appropriate ide channel. Pass the parameter for the correct ide
|
|
channel to the kernel, as explained above.
|
|
|
|
Any number of interfaces may share a single IRQ if necessary, at a slight
|
|
performance penalty, whether on separate cards or a single VLB card.
|
|
The IDE driver automatically detects and handles this. However, this may
|
|
or may not be harmful to your hardware.. two or more cards driving the same IRQ
|
|
can potentially burn each other's bus driver, though in practice this
|
|
seldom occurs. Be careful, and if in doubt, don't do it!
|
|
|
|
Drives are normally found by auto-probing and/or examining the CMOS/BIOS data.
|
|
For really weird situations, the apparent (fdisk) geometry can also be specified
|
|
on the kernel "command line" using LILO. The format of such lines is:
|
|
|
|
hdx=cyls,heads,sects,wpcom,irq
|
|
or hdx=cdrom
|
|
|
|
where hdx can be any of hda through hdh, Three values are required
|
|
(cyls,heads,sects). For example:
|
|
|
|
hdc=1050,32,64 hdd=cdrom
|
|
|
|
either {hda,hdb} or {hdc,hdd}. The results of successful auto-probing may
|
|
override the physical geometry/irq specified, though the "original" geometry
|
|
may be retained as the "logical" geometry for partitioning purposes (fdisk).
|
|
|
|
If the auto-probing during boot time confuses a drive (ie. the drive works
|
|
with hd.c but not with ide.c), then an command line option may be specified
|
|
for each drive for which you'd like the drive to skip the hardware
|
|
probe/identification sequence. For example:
|
|
|
|
hdb=noprobe
|
|
or
|
|
hdc=768,16,32
|
|
hdc=noprobe
|
|
|
|
Note that when only one IDE device is attached to an interface, it should be
|
|
jumpered as "single" or "master", *not* "slave". Many folks have had
|
|
"trouble" with cdroms because of this requirement, so the driver now probes
|
|
for both units, though success is more likely when the drive is jumpered
|
|
correctly.
|
|
|
|
Courtesy of Scott Snyder and others, the driver supports ATAPI cdrom drives
|
|
such as the NEC-260 and the new MITSUMI triple/quad speed drives.
|
|
Such drives will be identified at boot time, just like a hard disk.
|
|
|
|
If for some reason your cdrom drive is *not* found at boot time, you can force
|
|
the probe to look harder by supplying a kernel command line parameter
|
|
via LILO, such as:
|
|
|
|
hdc=cdrom /* hdc = "master" on second interface */
|
|
or
|
|
hdd=cdrom /* hdd = "slave" on second interface */
|
|
|
|
For example, a GW2000 system might have a hard drive on the primary
|
|
interface (/dev/hda) and an IDE cdrom drive on the secondary interface
|
|
(/dev/hdc). To mount a CD in the cdrom drive, one would use something like:
|
|
|
|
ln -sf /dev/hdc /dev/cdrom
|
|
mkdir /mnt/cdrom
|
|
mount /dev/cdrom /mnt/cdrom -t iso9660 -o ro
|
|
|
|
If, after doing all of the above, mount doesn't work and you see
|
|
errors from the driver (with dmesg) complaining about `status=0xff',
|
|
this means that the hardware is not responding to the driver's attempts
|
|
to read it. One of the following is probably the problem:
|
|
|
|
- Your hardware is broken.
|
|
|
|
- You are using the wrong address for the device, or you have the
|
|
drive jumpered wrong. Review the configuration instructions above.
|
|
|
|
- Your IDE controller requires some nonstandard initialization sequence
|
|
before it will work properly. If this is the case, there will often
|
|
be a separate MS-DOS driver just for the controller. IDE interfaces
|
|
on sound cards usually fall into this category. Such configurations
|
|
can often be made to work by first booting MS-DOS, loading the
|
|
appropriate drivers, and then warm-booting linux (without powering
|
|
off). This can be automated using loadlin in the MS-DOS autoexec.
|
|
|
|
If you always get timeout errors, interrupts from the drive are probably
|
|
not making it to the host. Check how you have the hardware jumpered
|
|
and make sure it matches what the driver expects (see the configuration
|
|
instructions above). If you have a PCI system, also check the BIOS
|
|
setup; I've had one report of a system which was shipped with IRQ 15
|
|
disabled by the BIOS.
|
|
|
|
The kernel is able to execute binaries directly off of the cdrom,
|
|
provided it is mounted with the default block size of 1024 (as above).
|
|
|
|
Please pass on any feedback on any of this stuff to the maintainer,
|
|
whose address can be found in linux/MAINTAINERS.
|
|
|
|
Note that if BOTH hd.c and ide.c are configured into the kernel,
|
|
hd.c will normally be allowed to control the primary IDE interface.
|
|
This is useful for older hardware that may be incompatible with ide.c,
|
|
and still allows newer hardware to run on the 2nd/3rd/4th IDE ports
|
|
under control of ide.c. To have ide.c also "take over" the primary
|
|
IDE port in this situation, use the "command line" parameter: ide0=0x1f0
|
|
|
|
The IDE driver is modularized. The high level disk/CD-ROM/tape/floppy
|
|
drivers can always be compiled as loadable modules, the chipset drivers
|
|
can only be compiled into the kernel, and the core code (ide.c) can be
|
|
compiled as a loadable module provided no chipset support is needed.
|
|
|
|
When using ide.c as a module in combination with kmod, add:
|
|
|
|
alias block-major-3 ide-probe
|
|
|
|
to /etc/modprobe.conf.
|
|
|
|
When ide.c is used as a module, you can pass command line parameters to the
|
|
driver using the "options=" keyword to insmod, while replacing any ',' with
|
|
';'. For example:
|
|
|
|
insmod ide.o options="ide0=serialize ide1=serialize ide2=0x1e8;0x3ee;11"
|
|
|
|
|
|
================================================================================
|
|
|
|
Summary of ide driver parameters for kernel command line
|
|
--------------------------------------------------------
|
|
|
|
"hdx=" is recognized for all "x" from "a" to "h", such as "hdc".
|
|
|
|
"idex=" is recognized for all "x" from "0" to "3", such as "ide1".
|
|
|
|
"hdx=noprobe" : drive may be present, but do not probe for it
|
|
|
|
"hdx=none" : drive is NOT present, ignore cmos and do not probe
|
|
|
|
"hdx=nowerr" : ignore the WRERR_STAT bit on this drive
|
|
|
|
"hdx=cdrom" : drive is present, and is a cdrom drive
|
|
|
|
"hdx=cyl,head,sect" : disk drive is present, with specified geometry
|
|
|
|
"hdx=remap" : remap access of sector 0 to sector 1 (for EZDrive)
|
|
|
|
"hdx=remap63" : remap the drive: add 63 to all sector numbers
|
|
(for DM OnTrack)
|
|
|
|
"idex=noautotune" : driver will NOT attempt to tune interface speed
|
|
|
|
"hdx=autotune" : driver will attempt to tune interface speed
|
|
to the fastest PIO mode supported,
|
|
if possible for this drive only.
|
|
Not fully supported by all chipset types,
|
|
and quite likely to cause trouble with
|
|
older/odd IDE drives.
|
|
|
|
"hdx=nodma" : disallow DMA
|
|
|
|
"hdx=scsi" : the return of the ide-scsi flag, this is useful for
|
|
allowing ide-floppy, ide-tape, and ide-cdrom|writers
|
|
to use ide-scsi emulation on a device specific option.
|
|
|
|
"idebus=xx" : inform IDE driver of VESA/PCI bus speed in MHz,
|
|
where "xx" is between 20 and 66 inclusive,
|
|
used when tuning chipset PIO modes.
|
|
For PCI bus, 25 is correct for a P75 system,
|
|
30 is correct for P90,P120,P180 systems,
|
|
and 33 is used for P100,P133,P166 systems.
|
|
If in doubt, use idebus=33 for PCI.
|
|
As for VLB, it is safest to not specify it.
|
|
Bigger values are safer than smaller ones.
|
|
|
|
"idex=noprobe" : do not attempt to access/use this interface
|
|
|
|
"idex=base" : probe for an interface at the addr specified,
|
|
where "base" is usually 0x1f0 or 0x170
|
|
and "ctl" is assumed to be "base"+0x206
|
|
|
|
"idex=base,ctl" : specify both base and ctl
|
|
|
|
"idex=base,ctl,irq" : specify base, ctl, and irq number
|
|
|
|
"idex=serialize" : do not overlap operations on idex. Please note
|
|
that you will have to specify this option for
|
|
both the respective primary and secondary channel
|
|
to take effect.
|
|
|
|
"idex=four" : four drives on idex and ide(x^1) share same ports
|
|
|
|
"idex=reset" : reset interface after probe
|
|
|
|
"idex=ata66" : informs the interface that it has an 80c cable
|
|
for chipsets that are ATA-66 capable, but the
|
|
ability to bit test for detection is currently
|
|
unknown.
|
|
|
|
"ide=reverse" : formerly called to pci sub-system, but now local.
|
|
|
|
The following are valid ONLY on ide0, which usually corresponds
|
|
to the first ATA interface found on the particular host, and the defaults for
|
|
the base,ctl ports must not be altered.
|
|
|
|
"ide=doubler" : probe/support IDE doublers on Amiga
|
|
|
|
There may be more options than shown -- use the source, Luke!
|
|
|
|
Everything else is rejected with a "BAD OPTION" message.
|
|
|
|
For legacy IDE VLB host drivers (ali14xx/dtc2278/ht6560b/qd65xx/umc8672)
|
|
you need to explicitly enable probing by using "probe" kernel parameter,
|
|
i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
|
|
|
|
* "ali14xx.probe" boot option when ali14xx driver is built-in the kernel
|
|
|
|
* "probe" module parameter when ali14xx driver is compiled as module
|
|
("modprobe ali14xx probe")
|
|
|
|
Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb"
|
|
kernel paremeter to enable probing for VLB version of the chipset (PCI ones
|
|
are detected automatically).
|
|
|
|
================================================================================
|
|
|
|
IDE ATAPI streaming tape driver
|
|
-------------------------------
|
|
|
|
This driver is a part of the Linux ide driver and works in co-operation
|
|
with linux/drivers/block/ide.c.
|
|
|
|
The driver, in co-operation with ide.c, basically traverses the
|
|
request-list for the block device interface. The character device
|
|
interface, on the other hand, creates new requests, adds them
|
|
to the request-list of the block device, and waits for their completion.
|
|
|
|
Pipelined operation mode is now supported on both reads and writes.
|
|
|
|
The block device major and minor numbers are determined from the
|
|
tape's relative position in the ide interfaces, as explained in ide.c.
|
|
|
|
The character device interface consists of the following devices:
|
|
|
|
ht0 major 37, minor 0 first IDE tape, rewind on close.
|
|
ht1 major 37, minor 1 second IDE tape, rewind on close.
|
|
...
|
|
nht0 major 37, minor 128 first IDE tape, no rewind on close.
|
|
nht1 major 37, minor 129 second IDE tape, no rewind on close.
|
|
...
|
|
|
|
Run /dev/MAKEDEV to create the above entries.
|
|
|
|
The general magnetic tape commands compatible interface, as defined by
|
|
include/linux/mtio.h, is accessible through the character device.
|
|
|
|
General ide driver configuration options, such as the interrupt-unmask
|
|
flag, can be configured by issuing an ioctl to the block device interface,
|
|
as any other ide device.
|
|
|
|
Our own ide-tape ioctl's can be issued to either the block device or
|
|
the character device interface.
|
|
|
|
Maximal throughput with minimal bus load will usually be achieved in the
|
|
following scenario:
|
|
|
|
1. ide-tape is operating in the pipelined operation mode.
|
|
2. No buffering is performed by the user backup program.
|
|
|
|
|
|
|
|
================================================================================
|
|
|
|
Some Terminology
|
|
----------------
|
|
IDE = Integrated Drive Electronics, meaning that each drive has a built-in
|
|
controller, which is why an "IDE interface card" is not a "controller card".
|
|
|
|
ATA = AT (the old IBM 286 computer) Attachment Interface, a draft American
|
|
National Standard for connecting hard drives to PCs. This is the official
|
|
name for "IDE".
|
|
|
|
The latest standards define some enhancements, known as the ATA-6 spec,
|
|
which grew out of vendor-specific "Enhanced IDE" (EIDE) implementations.
|
|
|
|
ATAPI = ATA Packet Interface, a new protocol for controlling the drives,
|
|
similar to SCSI protocols, created at the same time as the ATA2 standard.
|
|
ATAPI is currently used for controlling CDROM, TAPE and FLOPPY (ZIP or
|
|
LS120/240) devices, removable R/W cartridges, and for high capacity hard disk
|
|
drives.
|
|
|
|
mlord@pobox.com
|
|
--
|
|
|
|
Wed Apr 17 22:52:44 CEST 2002 edited by Marcin Dalecki, the current
|
|
maintainer.
|
|
|
|
Wed Aug 20 22:31:29 CEST 2003 updated ide boot options to current ide.c
|
|
comments at 2.6.0-test4 time. Maciej Soltysiak <solt@dns.toxicfilms.tv>
|