1130b656e5
This will make a number of things easier in the future, as well as (finally!) avoiding the Id-smashing problem which has plagued developers for so long. Boy, I'm glad we're not using sup anymore. This update would have been insane otherwise.
422 lines
17 KiB
Plaintext
422 lines
17 KiB
Plaintext
<!-- $FreeBSD$ -->
|
|
<!-- The FreeBSD Documentation Project -->
|
|
|
|
<!--
|
|
<title>An introduction to ESDI hard disks and their use with FreeBSD</title>
|
|
<author>(c) 1995, Wilko Bulte, <tt/wilko@yedi.iaf.nl/
|
|
<date>Tue Sep 12 20:48:44 MET DST 1995</date>
|
|
|
|
Copyright 1995, Wilko C. Bulte, Arnhem, The Netherlands
|
|
|
|
<abstract>
|
|
This document describes the use of ESDI disks in combination
|
|
with the FreeBSD operating system. Contrary to popular
|
|
belief, this is possible and people are using ESDI based
|
|
systems successfully! This document tries to explain you
|
|
how to do this.
|
|
|
|
If you find something missing, plain wrong or have useful
|
|
comments on how to improve
|
|
the document please send mail to <tt/wilko@yedi.iaf.nl/
|
|
</abstract>
|
|
-->
|
|
|
|
<sect1><heading>Using ESDI hard disks<label id="esdi"></heading>
|
|
|
|
<p><em>Copyright © 1995, &a.wilko;.<newline>24 September 1995.</em>
|
|
|
|
ESDI is an acronym that means Enhanced Small Device Interface.
|
|
It is loosely based on the good old ST506/412 interface originally
|
|
devised by Seagate Technology, the makers of the first affordable
|
|
5.25" winchester disk.
|
|
|
|
The acronym says Enhanced, and rightly so. In the first place
|
|
the speed of the interface is higher, 10 or 15 Mbits/second
|
|
instead of the 5 Mbits/second of ST412 interfaced drives.
|
|
Secondly some higher level commands are added, making the ESDI
|
|
interface somewhat 'smarter' to the operating system driver
|
|
writers. It is by no means as smart as SCSI by the way. ESDI
|
|
is standardized by ANSI.
|
|
|
|
Capacities of the drives are boosted by putting more sectors
|
|
on each track. Typical is 35 sectors per track, high capacity
|
|
drives I have seen were up to 54 sectors/track.
|
|
|
|
Although ESDI has been largely obsoleted by IDE and SCSI interfaces,
|
|
the availability of free or cheap surplus drives makes them
|
|
ideal for low (or now) budget systems.
|
|
|
|
<sect2><heading>Concepts of ESDI</heading>
|
|
<p>
|
|
<sect3><heading>Physical connections</heading>
|
|
<p>
|
|
The ESDI interface uses two cables connected to each drive.
|
|
One cable is a 34 pin flat cable edge connector that carries
|
|
the command and status signals from the controller to the
|
|
drive and vice-versa. The command cable is daisy chained
|
|
between all the drives. So, it forms a bus onto which all
|
|
drives are connected.
|
|
|
|
The second cable is a 20 pin flat cable edge connector that
|
|
carries the data to and from the drive. This cable is radially
|
|
connected, so each drive has its own direct connection to the
|
|
controller.
|
|
|
|
To the best of my knowledge PC ESDI controllers are limited
|
|
to using a maximum of 2 drives per controller. This is
|
|
compatibility feature(?) left over from the WD1003 standard
|
|
that reserves only a single bit for device addressing.
|
|
|
|
<sect3><heading>Device addressing</heading>
|
|
<p>
|
|
On each command cable a maximum of 7 devices and 1 controller
|
|
can be present. To enable the controller to uniquely
|
|
identify which drive it addresses, each ESDI device is equipped
|
|
with jumpers or switches to select the devices address.
|
|
|
|
On PC type controllers the first drive is set to address 0,
|
|
the second disk to address 1. <it>Always make sure</it> you
|
|
set each disk to an unique address! So, on a PC with its
|
|
two drives/controller maximum the first drive is drive 0, the
|
|
second is drive 1.
|
|
|
|
<sect3><heading>Termination</heading>
|
|
<p>
|
|
The daisy chained command cable (the 34 pin cable remember?)
|
|
needs to be terminated at the last drive on the chain.
|
|
For this purpose ESDI drives come with a termination resistor
|
|
network that can be removed or disabled by a jumper when it
|
|
is not used.
|
|
|
|
So, one and <it>only</it> one drive, the one at
|
|
the farthest end of the command
|
|
cable has its terminator installed/enabled. The controller
|
|
automatically terminates the other end of the cable.
|
|
Please note that this implies that the controller must be
|
|
at one end of the cable and <it>not</it> in the middle.
|
|
|
|
<sect2><heading>Using ESDI disks with FreeBSD</heading>
|
|
<p>
|
|
Why is ESDI such a pain to get working in the first place?
|
|
|
|
People who tried ESDI disks with FreeBSD are known to have
|
|
developed a profound sense of frustration. A combination of
|
|
factors works against you to produce effects that are
|
|
hard to understand when you have never seen them before.
|
|
|
|
This has also led to the popular legend ESDI and FreeBSD
|
|
is a plain NO-GO.
|
|
The following sections try to list all the pitfalls and
|
|
solutions.
|
|
|
|
<sect3><heading>ESDI speed variants</heading>
|
|
<p>
|
|
As briefly mentioned before, ESDI comes in two speed flavors.
|
|
The older drives and controllers use a 10 Mbits/second
|
|
data transfer rate. Newer stuff uses 15 Mbits/second.
|
|
|
|
It is not hard to imagine that 15 Mbits/second drive cause
|
|
problems on controllers laid out for 10 Mbits/second.
|
|
As always, consult your controller <it>and</it> drive
|
|
documentation to see if things match.
|
|
|
|
<sect3><heading>Stay on track</heading>
|
|
<p>
|
|
Mainstream ESDI drives use 34 to 36 sectors per track.
|
|
Most (older) controllers cannot handle more than this
|
|
number of sectors.
|
|
Newer, higher capacity, drives use higher numbers of sectors
|
|
per track. For instance, I own a 670 Mb drive that has
|
|
54 sectors per track.
|
|
|
|
In my case, the controller could not handle this number
|
|
of sectors. It proved to work well except that it only
|
|
used 35 sectors on each track. This meant losing a
|
|
lot of disk space.
|
|
|
|
Once again, check the documentation of your hardware for
|
|
more info. Going out-of-spec like in the example might
|
|
or might not work. Give it a try or get another more
|
|
capable controller.
|
|
|
|
<sect3><heading>Hard or soft sectoring</heading>
|
|
<p>
|
|
Most ESDI drives allow hard or soft sectoring to be
|
|
selected using a jumper. Hard sectoring means that the
|
|
drive will produce a sector pulse on the start of each
|
|
new sector. The controller uses this pulse to tell when
|
|
it should start to write or read.
|
|
|
|
Hard sectoring allows a selection of sector size (normally
|
|
256, 512 or 1024 bytes per formatted sector). FreeBSD uses
|
|
512 byte sectors. The number of sectors per track also varies
|
|
while still using the same number of bytes per formatted sector.
|
|
The number of <em>unformatted</em> bytes per sector varies,
|
|
dependent on your controller it needs more or less overhead
|
|
bytes to work correctly. Pushing more sectors on a track
|
|
of course gives you more usable space, but might give
|
|
problems if your controller needs more bytes than the
|
|
drive offers.
|
|
|
|
In case of soft sectoring, the controller itself determines
|
|
where to start/stop reading or writing. For ESDI
|
|
hard sectoring is the default (at least on everything
|
|
I came across). I never felt the urge to try soft sectoring.
|
|
|
|
In general, experiment with sector settings before you install
|
|
FreeBSD because you need to re-run the low-level format
|
|
after each change.
|
|
|
|
<sect3><heading>Low level formatting</heading>
|
|
<p>
|
|
ESDI drives need to be low level formatted before they
|
|
are usable. A reformat is needed whenever you figgle
|
|
with the number of sectors/track jumpers or the
|
|
physical orientation of the drive (horizontal, vertical).
|
|
So, first think, then format.
|
|
The format time must not be underestimated, for big
|
|
disks it can take hours.
|
|
|
|
After a low level format, a surface scan is done to
|
|
find and flag bad sectors. Most disks have a
|
|
manufacturer bad block list listed on a piece of paper
|
|
or adhesive sticker. In addition, on most disks the
|
|
list is also written onto the disk.
|
|
Please use the manufacturer's list. It is much easier
|
|
to remap a defect now than after FreeBSD is installed.
|
|
|
|
Stay away from low-level formatters that mark all
|
|
sectors of a track as bad as soon as they find one
|
|
bad sector. Not only does this waste space, it also
|
|
and more importantly causes you grief with bad144
|
|
(see the section on bad144).
|
|
|
|
<sect3><heading>Translations</heading>
|
|
<p>
|
|
Translations, although not exclusively a ESDI-only problem,
|
|
might give you real trouble.
|
|
Translations come in multiple flavors. Most of them
|
|
have in common that they attempt to work around the
|
|
limitations posed upon disk geometries by the original
|
|
IBM PC/AT design (thanks IBM!).
|
|
|
|
First of all there is the (in)famous 1024 cylinder limit.
|
|
For a system to be able to boot, the stuff (whatever
|
|
operating system) must be in the first 1024 cylinders
|
|
of a disk. Only 10 bits are available to encode the
|
|
cylinder number. For the number of sectors the limit
|
|
is 64 (0-63).
|
|
When you combine the 1024 cylinder limit with the 16 head
|
|
limit (also a design feature) you max out at fairly limited
|
|
disk sizes.
|
|
|
|
To work around this problem, the manufacturers of ESDI
|
|
PC controllers added a BIOS prom extension on their boards.
|
|
This BIOS extension handles disk I/O for booting (and for
|
|
some operating systems <it>all</it> disk I/O) by using
|
|
translation. For instance, a big drive might be presented
|
|
to the system as having 32 heads and 64 sectors/track.
|
|
The result is that the number of cylinders is reduced to
|
|
something below 1024 and is therefore usable by the system
|
|
without problems.
|
|
It is noteworthy to know that FreeBSD does not use the
|
|
BIOS after its kernel has started. More on this later.
|
|
|
|
A second reason for translations is the fact that most
|
|
older system BIOSes could only handle drives with 17 sectors
|
|
per track (the old ST412 standard). Newer system BIOSes
|
|
usually have a user-defined drive type (in most cases this is
|
|
drive type 47).
|
|
|
|
<em>Whatever you do to translations after reading this document,
|
|
keep in mind that if you have multiple operating systems on the
|
|
same disk, all must use the same translation</em>
|
|
|
|
While on the subject of translations, I have seen one controller
|
|
type (but there are probably more like this) offer the option
|
|
to logically split a drive in multiple partitions as a BIOS
|
|
option. I had select 1 drive == 1 partition because this
|
|
controller wrote this info onto the disk. On power-up it
|
|
read the info and presented itself to the system based on
|
|
the info from the disk.
|
|
|
|
<sect3><heading>Spare sectoring</heading>
|
|
<p>
|
|
Most ESDI controllers offer the possibility to remap bad sectors.
|
|
During/after the low-level format of the disk bad sectors are
|
|
marked as such, and a replacement sector is put in place
|
|
(logically of course) of the bad one.
|
|
|
|
In most cases the remapping is done by using N-1 sectors on
|
|
each track for actual data storage, and sector N itself is
|
|
the spare sector. N is the total number of sectors physically
|
|
available on the track.
|
|
The idea behind this is that the operating system sees
|
|
a 'perfect' disk without bad sectors. In the case of
|
|
FreeBSD this concept is not usable.
|
|
|
|
The problem is that the translation from <it>bad</it> to <it>good</it>
|
|
is performed by the BIOS of the ESDI controller. FreeBSD,
|
|
being a true 32 bit operating system, does not use the BIOS
|
|
after it has been booted. Instead, it has device drivers that
|
|
talk directly to the hardware.
|
|
|
|
<em>So: don't use spare sectoring, bad block remapping or
|
|
whatever it may be called by the controller manufacturer when you
|
|
want to use the disk for FreeBSD.</em>
|
|
|
|
<sect3><heading>Bad block handling</heading>
|
|
<p>
|
|
The preceding section leaves us with a problem. The controller's
|
|
bad block handling is not usable and still FreeBSD's filesystems
|
|
assume perfect media without any flaws.
|
|
To solve this problem, FreeBSD use the <it>bad144</it> tool.
|
|
Bad144 (named after a Digital Equipment standard for bad block
|
|
handling) scans a FreeBSD slice for bad blocks. Having found
|
|
these bad blocks, it writes a table with the offending block
|
|
numbers to the end of the FreeBSD slice.
|
|
|
|
When the disk is in operation, the disk accesses are checked
|
|
against the table read from the disk. Whenever a block number
|
|
is requested that is in the bad144 list, a replacement block
|
|
(also from the end of the FreeBSD slice) is used.
|
|
In this way, the bad144 replacement scheme presents 'perfect'
|
|
media to the FreeBSD filesystems.
|
|
|
|
There are a number of potential pitfalls associated with
|
|
the use of bad144.
|
|
First of all, the slice cannot have more than 126 bad sectors.
|
|
If your drive has a high number of bad sectors, you might need
|
|
to divide it into multiple FreeBSD slices each containing less
|
|
than 126 bad sectors. Stay away from low-level format programs
|
|
that mark <em>every</em> sector of a track as bad when
|
|
they find a flaw on the track. As you can imagine, the
|
|
126 limit is quickly reached when the low-level format is done
|
|
this way.
|
|
|
|
Second, if the slice contains the root filesystem, the slice
|
|
should be within the 1024 cylinder BIOS limit. During the
|
|
boot process the bad144 list is read using the BIOS and this
|
|
only succeeds when the list is within the 1024 cylinder limit.
|
|
<em>Note</em> that the restriction is not that only the root
|
|
<em>filesystem</em> must be within the 1024 cylinder limit, but
|
|
rather the entire <em>slice</em> that contains the root filesystem.
|
|
|
|
|
|
<sect3><heading>Kernel configuration</heading>
|
|
<p>
|
|
ESDI disks are handled by the same <it>wd</it>driver as
|
|
IDE and ST412 MFM disks. The <it>wd</it> driver should work
|
|
for all WD1003 compatible interfaces.
|
|
|
|
Most hardware is jumperable for one of two different I/O
|
|
address ranges and IRQ lines. This allows you to have
|
|
two wd type controllers in one system.
|
|
|
|
When your hardware allows non-standard strappings, you
|
|
can use these with FreeBSD as long as you enter the
|
|
correct info into the kernel config file.
|
|
An example from the kernel config file (they live in
|
|
<tt>/sys/i386/conf</tt> BTW).
|
|
|
|
<tscreen><verb>
|
|
# First WD compatible controller
|
|
controller wdc0 at isa? port "IO_WD1" bio irq 14 vector wdintr
|
|
disk wd0 at wdc0 drive 0
|
|
disk wd1 at wdc0 drive 1
|
|
|
|
# Second WD compatible controller
|
|
controller wdc1 at isa? port "IO_WD2" bio irq 15 vector wdintr
|
|
disk wd2 at wdc1 drive 0
|
|
disk wd3 at wdc1 drive 1
|
|
</verb></tscreen>
|
|
|
|
<!--
|
|
<sect3><heading>Tuning your ESDI kernel setup</heading>
|
|
<p>
|
|
-->
|
|
|
|
<sect2><heading>Particulars on ESDI hardware</heading>
|
|
<p>
|
|
<sect3><heading>Adaptec 2320 controllers</heading>
|
|
<p>
|
|
I successfully installed FreeBSD onto a ESDI disk controlled by a
|
|
ACB-2320. No other operating system was present on the disk.
|
|
|
|
To do so I low level formatted the disk using NEFMT.EXE
|
|
(<it>ftp</it>able from <it>www.adaptec.com</it>) and answered NO
|
|
to the question whether the disk should be formatted with a
|
|
spare sector on each track. The BIOS on the ACD-2320 was
|
|
disabled. I used the 'free configurable' option in the system
|
|
BIOS to allow the BIOS to boot it.
|
|
|
|
Before using NEFMT.EXE I tried to format the disk using the
|
|
ACB-2320 BIOS builtin formatter. This proved to be a show stopper,
|
|
because it did not give me an option to disable spare sectoring.
|
|
With spare sectoring enabled the FreeBSD installation
|
|
process broke down on the bad144 run.
|
|
|
|
Please check carefully which ACB-232xy variant you have. The
|
|
x is either 0 or 2, indicating a controller without or with
|
|
a floppy controller on board.
|
|
|
|
The y is more interesting. It can either be a blank,
|
|
a "A-8" or a "D". A blank indicates a plain 10 Mbits/second
|
|
controller. An "A-8" indicates a 15 Mbits/second controller
|
|
capable of handling 52 sectors/track.
|
|
A "D" means a 15 Mbits/second controller that can also
|
|
handle drives with > 36 sectors/track (also 52 ?).
|
|
|
|
All variations should be capable of using 1:1 interleaving. Use 1:1,
|
|
FreeBSD is fast enough to handle it.
|
|
|
|
<sect3><heading>Western Digital WD1007 controllers</heading>
|
|
<p>
|
|
I successfully installed FreeBSD onto a ESDI disk controlled by a
|
|
WD1007 controller. To be precise, it was a WD1007-WA2. Other
|
|
variations of the WD1007 do exist.
|
|
|
|
To get it to work, I had to disable the sector translation and
|
|
the WD1007's onboard BIOS. This implied I could not use
|
|
the low-level formatter built into this BIOS. Instead, I grabbed
|
|
WDFMT.EXE from www.wdc.com Running this formatted my drive
|
|
just fine.
|
|
|
|
<sect3><heading>Ultrastor U14F controllers</heading>
|
|
<p>
|
|
According to multiple reports from the net, Ultrastor ESDI
|
|
boards work OK with FreeBSD. I lack any further info on
|
|
particular settings.
|
|
|
|
<!--
|
|
|
|
<sect2><heading>Tracking down problems</heading>
|
|
<p>
|
|
-->
|
|
|
|
<sect2><heading>Further reading<label id="esdi:further-reading"></>
|
|
<p>
|
|
If you intend to do some serious ESDI hacking, you might want to
|
|
have the official standard at hand:
|
|
|
|
The latest ANSI X3T10 committee document is:
|
|
<itemize>
|
|
<item>Enhanced Small Device Interface (ESDI) [X3.170-1990/X3.170a-1991]
|
|
[X3T10/792D Rev 11]
|
|
</itemize>
|
|
On Usenet the newsgroup <htmlurl url="news:comp.periphs"
|
|
name="comp.periphs"> is a noteworthy place to look
|
|
for more info.
|
|
|
|
The World Wide Web (WWW) also proves to be a very handy info source:
|
|
For info on Adaptec ESDI controllers see <htmlurl
|
|
url="http://www.adaptec.com/">.
|
|
For info on Western Digital controllers see <htmlurl
|
|
url="http://www.wdc.com/">.
|
|
|
|
<sect2>Thanks to...
|
|
<p>
|
|
Andrew Gordon for sending me an Adaptec 2320 controller and ESDI disk
|
|
for testing.
|
|
|