The storage device interface serves a two–level directory giving
access to multiple storage units, typically ATA(PI) or SCSI discs.
Each unit is accessed via files in the directory named by the
controller to which it is attached, C, and by its unit number
u. The controller naming convention for legacy IDE units names
controller C, and the second D. There can be a maximum of 4 IDE
controllers and a maximum of 2 units per IDE controller ().
Other ATA controllers start with the first controller being named
E There can be a maximum of 16 units per non–legacy ATA controller
([0–9a–f]). The controller naming convention for
SCSI units starts with the first controller being named 0, the
second 1, etc. up to a maximum of 16 controllers ([0–9a–f]). There
can be a maximum of 16 units per SCSI controller ([0–9a–f]).
Units are not accessed before the first attach. Units may be individually
attached using the attach specifier, for example|
An attach without a specifier will cause the driver to scan for
all possible units before processing the rest of the name.
The subdirectory for each unit contains two files, ctl and raw.
In addition, if the unit is a direct–access disc of some type it
may be split into partitions and the subdirectory may contain
a file per partition. By default, the partition data will exist
for such media.
Partitions are added and deleted by writing to the ctl file
The default data partition may be deleted. A partition cannot
be deleted if a process has it open. If a change of removable
media is detected, the new media cannot be opened until all open
partitions on the old media are closed.
Partitions are usually created using fdisk and prep(8); the convention
is to name non–Plan 9 partitions after their corresponding operating
systems (e.g., /dev/sdC0/dos) and Plan 9 partitions according
to their function (e.g., /dev/sdC0/swap). The example in prep(8)
shows how this is done.
Reading the ctl file returns at least one line of textual information
about the unit. The first line will always be prefixed by inquiry
and will give a manufacturer and model number if possible. A line
prefixed by config will be returned for appropriate media, e.g.
for IDE units the remainder of the line contains
configuration information from the device's identify command (config
and capabilities) and also the available I/O transfer options;
this is a diagnostic aid. A line prefixed by geometry will be
returned for appropriate media; at least two numbers will follow,
the first being the number of sectors contained in the unit
and the second the sector size in bytes. Any remaining information
on the geometry line is unit–dependent, for instance, head, cylinder
and sector counts for ATA discs. If any partitions are defined
for the media, their name, start–sector and end–sector will be returned,
prefixed by part.
part name start–sector end–sector|
The use of DMA and multi–sector read/write commands may be enabled
and disabled on ATA(PI) units by writing to the ctl file dma and
rwm respectively followed by on or off. For example, to enable
DMA on a unit that supports it:
% cat /dev/sdD0/ctl|
inquiry KENWOOD CD–ROM UCR–421 208E10/20/99 7.39 2 M0
config 85C0 capabilities 0F00 dma 00550004 dmactl 00000000
geometry 242725 2352
part data 0 242725
If supported by the unit, the standby timer may be enabled:
% echo 'dma on'>/dev/sd00/ctl|
where T is the standby timer period in seconds. T must be between
30 and 1200, or can be 0 to disable the timer.
The raw file is used to execute an arbitrary SCSI or ATA commands
on the unit at a low level. SCSI commands are submitted as raw
CDBs up to 16 bytes long. ATA commands are formatted as ATA8–AST
FISes prefixed by two bytes – an ata escape 0xff and a byte specifying
the ATA protcol. All devices respond to
basic SCSI commands such as inquiry . This is used by programs
such as scuzz(8) and atazz(8) to manipulate devices that do not
fit the simple storage model or for maintenance purposes. The
following steps may be taken to execute a command
% echo 'standby T'>/dev/sdC0/ctl|
–Write the command to the raw file;
–Read or write data associated with the command, according to the
direction of the transfer.
–Read the raw file to retrieve the status of the command, returned
as a text integer for SCSI commands. ATA commands return the one
byte status and response FIS.
Reading /dev/sdctl yields information about each controller, one
line per controller. Writing `config message' to /dev/sdctl passes
message to the legacy configuration machinery, used to set attributes
such as IRQ, port and size. Writing `ctltype message' to /dev/sdctl
passes message to ctltype's
wtopctl function with a nil sdev argument, where ctltype is a
known controller type such as ata or scsi. Writing `sdctlletter
message' to /dev/sdctl passes message to sdctlletter's wtopctl
function with an sdev argument corresponding to the named controller,
where ctlletter is a known controller letter
such as C or 0.