Oh GACK! src-clean doesn't quite work that easily since cleandist rebuilds the
[unix-history] / sys / i386 / doc / ata / ata-9
9. Command Descriptions
Commands are issued to the drive by loading the pertinent registers in the
command block with the needed parameters, and then writing the command code to
the Command Register.
The manner in which a command is accepted varies. There are three classes
(see Table 9-1) of command acceptance, all predicated on the fact that to
receive a command, BSY=0:
- Upon receipt of a Class 1 command, the drive sets BSY within 400 nsec.
- Upon receipt of a Class 2 command, the drive sets BSY within 400 nsec, sets
up the sector buffer for a write operation, sets DRQ within 700 usec, and
clears BSY within 400 nsec of setting DRQ.
- Upon receipt of a Class 3 command, the drive sets BSY within 400 nsec, sets
up the sector buffer for a write operation, sets DRQ within 20 msec, and
clears BSY within 400 nsec of setting DRQ.
..rm102
NOTE: DRQ may be set so quickly on Class 2 and Class 3 that the BSY
transition is too short for BSY=1 to be recognized.
The drive shall implement all mandatory commands as identified by an M, and
may implement the optional commands identified by an O, in Table 9-1. V
indicates a Vendor Specific command code.
TABLE 9-1: COMMAND CODES AND PARAMETERS
+-------+-------------------+
+-----+ |Command| Parameters Used |
|Class| | Code |FR SC SN CY DH |
+-----+----------------------------------+---+-------+---+---+---+---+---+
| 1 | Check Power Mode | O |98h E5h| | y | | | D |
| 1 | Execute Drive Diagnostic | M | 90h | | | | | D*|
| 2 | Format Track | M | 50h | * | y | | y | y |
| 1 | Identify Drive | O | ECh | | | | | D |
| 1 | Idle | O |97h E3h| | y | | | D |
| 1 | Idle Immediate | O |95h E1h| | | | | D |
| 1 | Initialize Drive Parameters | M | 91h | | y | | | y |
| 1 | Recalibrate | M | 1xh | | | | | D |
| 1 | Read Buffer | O | E4h | | | | | D |
| 1 | Read DMA (w/retry) | O | C8h | | y | y | y | y |
| 1 | Read DMA (w/o retry) | O | C9h | | y | y | y | y |
| 1 | Read Multiple | O | C4h | | y | y | y | y |
| 1 | Read Sector(s) (w/retry) | M | 20 | | y | y | y | y |
| 1 | Read Sector(s) (w/o retry) | M | 21 | | y | y | y | y |
| 1 | Read Long (w/retry) See 9.13 | M | 22 | | y | y | y | y |
| 1 | Read Long (w/o retry) See 9.13 | M | 23 | | y | y | y | y |
| 1 | Read Verify Sector(s) (w/retry) | M | 40 | | y | y | y | y |
| 1 | Read Verify Sector(s) (w/o retry)| M | 41 | | y | y | y | y |
| 1 | Seek | M | 7xh | | | y | y | y |
| 1 | Set Features | O | EFh | y | | | | D |
| 1 | Set Multiple Mode | O | C6h | | y | | | D |
| 1 | Set Sleep Mode | O |99h E6h| | | | | D |
| 1 | Standby | O |96h E2h| | y | | | D |
| 1 | Standby Immediate | O |94h E0h| | | | | D |
| 2 | Write Buffer | O | E8h | | | | | D |
| 3 | Write DMA (w/retry) | O | CAh | | y | y | y | y |
| 3 | Write DMA (w/o retry) | O | CBh | | y | y | y | y |
| 3 | Write Multiple | O | C5h | * | y | y | y | y |
| 3 | Write Same | O | E9h | y | y | y | y | y |
| 2 | Write Sector(s) (w/retry) | M | 30 | * | y | y | y | y |
| 2 | Write Sector(s) (w/o retry) | M | 31 | * | y | y | y | y |
| 2 | Write Sector(s) (w/retry) | M | 32 | * | y | y | y | y |
| 2 | Write Sector(s) (w/o retry) | M | 33 | * | y | y | y | y |
| 3 | Write Verify | O | 3Ch | * | y | y | y | y |
| | Vendor Unique | V | 9Ah | | | | | |
| | Vendor Unique | V | C0-C3h| | | | | |
| | Vendor Unique | V | 8xh | | | | | |
| | Vendor Unique | V |F5h-FFh| | | | | |
| | EATA Standard (CAM/89-004) | O |F0h-F4h| | | | | |
| | Reserved: All remaining codes | | | | | | | |
+-----+----------------------------------+---+-------+---+---+---+---+---+
| | CY = Cylinder Registers SC = Sector Count Register |
| | DH = Drive/Head Register SN = Sector Number Register |
| | FR = Features Register (see command descriptions for use) |
.. | | |
.. | | M = Mandatory O = Optional V = Vendor Specific |
| | y - the register contains a valid parameter for this command. |
| | For the Drive/Head Register, y means both the drive and |
| | head parameters are used. |
| | D - only the drive parameter is valid and not the head parameter.|
| | D* - Addressed to Drive 0 but both drives execute it. |
| | * - Maintained for compatibility (see 7.2.9) |
+-----+------------------------------------------------------------------+
9.1 Check Power Mode
This command checks the power mode.
If the drive is in, going to, or recovering from the Standby Mode the drive
shall set BSY, set the Sector Count Register to 00h, clear BSY, and generate
an interrupt.
If the drive is in the Idle Mode, the drive shall set BSY, set the Sector
Count Register to FFh, clear BSY, and generate an interrupt.
9.2 Execute Drive Diagnostic
This command shall perform the internal diagnostic tests implemented by the
drive. See also 6.3.4 and 6.3.13. The DRV bit is ignored. Both drives, if
present, shall execute this command.
If Drive 1 is present:
- Drive 0 waits up to 5 seconds for Drive 1 to assert PDIAG-.
- If Drive 1 has not asserted PDIAG-, indicating a failure, Drive 0 shall
append 80h to its own diagnostic status.
- Both drives shall execute diagnostics.
- If Drive 1 diagnostic failure is detected when Drive 0 status is read,
Drive 1 status is obtained by setting the DRV bit, and reading status.
If there is no Drive 1 present:
- Drive 0 posts only its own diagnostic results.
- Drive 0 clears BSY, and generates an interrupt.
The Diagnostic Code written to the Error Register is a unique 8-bit code as
shown in Table 9-2, and not as the single bit flags defined in 7.2.9.
..Table 9-2 details the codes and the corresponding explanations.
If Drive 1 fails diagnostics, Drive 0 "ORs" 80h with its own status and loads
that code into the Error Register. If Drive 1 passes diagnostics or there is
no Drive 1 connected, Drive 0 "ORs" 00h with its own status and loads that
code into the Error Register.
TABLE 9-2: DIAGNOSTIC CODES
+-------+
| Code |
+-------+----------------------------------+
| 01h | No error detected |
| 02h | Formatter device error |
| 03h | Sector buffer error |
| 04h | ECC circuitry error |
| 05h | Controlling microprocessor error |
| 8xh | Drive 1 failed |
+-------+----------------------------------+
9.3 Format Track
The implementation of the Format Track command is vendor specific. The actions
may be a physical reformatting of a track, initializing the data field
contents to some value, or doing nothing.
The Sector Count Register contains the number of sectors per track.
The track address is specified in the Cylinder High and Cylinder Low
Registers, and the number of sectors is specified in the Sector Count
Register. When the command is accepted, the drive sets the DRQ bit and waits
for the host to fill the sector buffer. When the sector buffer is full, the
drive clears DRQ, sets BSY and begins command execution.
The contents of the sector buffer shall not be written to the media, and may
be either ignored or interpreted as follows:
DD15 ---- DD0 DD15 ---- DD0
+------+------+ +------+------+--------------------------+
| First|Desc- | | Last |Desc- | Remainder of buffer |
|Sector|riptor| : : : : : : |Sector|riptor| filled with zeros |
+------+------+ +------+------+--------------------------+
One 16-bit word represents each sector, the words being contiguous from the
start of a sector. Any words remaining in the buffer after the representation
of the last sector are filled with zeros. DD15-8 contain the sector number. If
an interleave is specified, the words appear in the same sequence as they
appear on the track. DD7-0 contain a descriptor value defined as follows:
00h - Format sector as good
20h - Unassign the alternate location for this sector
40h - Assign this sector to an alternate location
80h - Format sector as bad
..rm102
NOTE: Some users of the ATA drive expect the operating system partition
table to be erased on a Format command. It is recommended that a drive
which does not perform a physical format of the track, write a data
pattern of all zeros to the sectors which have been specified by the
Format Track command.
..rm102
NOTE: It is recommended that implementors resassign data blocks which show
repeated errors.
9.4 Identify Drive
The Identify Drive command enables the host to receive parameter information
from the drive. When the command is issued, the drive sets BSY, stores the
required parameter information in the sector buffer, sets DRQ, and generates
an interrupt. The host then reads the information out of the sector buffer.
The parameter words in the buffer have the arrangement and meanings defined in
Table 9-3. All reserved bits or words shall be zero.
+-------+ TABLE 9-3: IDENTIFY DRIVE INFORMATION
| Word |
+-------+------------------------------------------------------------------+
| 0 | General configuration bit-significant information: |
| | 15 0 reserved for non-magnetic drives |
| | 14 1=format speed tolerance gap required |
| | 13 1=track offset option available |
| | 12 1=data strobe offset option available |
| | 11 1=rotational speed tolerance is > 0.5% |
| | 10 1=disk transfer rate > 10 Mbs |
| | 9 1=disk transfer rate > 5Mbs but <= 10Mbs |
| | 8 1=disk transfer rate <= 5Mbs |
| | 7 0 reserved for removable cartridge drive |
| | 6 1=fixed drive |
| | 5 1=spindle motor control option implemented |
| | 4 1=head switch time > 15 usec |
| | 3 1=not MFM encoded |
| | 2 1=soft sectored |
| | 1 1=hard sectored |
| | 0 0=reserved |
| 1 | Number of fixed cylinders |
| 2 | reserved |
| 3 | Number of heads |
| 4 | Number of unformatted bytes per track |
| 5 | Number of unformatted bytes per sector |
| 6 | Number of sectors per track |
| 7-9 | Vendor Unique |
| 10-19 | Serial number (20 ASCII characters, 0000h=not specified) |
| 20 | Buffer type |
| 21 | Buffer size in 512 byte increments (0000h=not specified) |
| 22 | # of ECC bytes passed on Read/Write Long cmds (0000h=not spec'd) |
| 23-26 | Firmware revision (8 ASCII characters, 0000h=not specified) |
| 27-46 | Model number (40 ASCII characters, 0000h=not specified) |
| 47 | 0000h = Read/Write Multiple commands not implemented |
| | x = number of sectors that can be transferred per interrupt |
| | on Read and Write Multiple commands |
| 48 | 0000h = cannot perform doubleword I/O |
| | 0001h = can perform doubleword I/O |
| 49 | Capabilities |
| | 15-9 0=reserved |
| | 8 1=DMA Supported |
| | 7-0 Vendor Unique |
| 50 | reserved |
| 51 | PIO data transfer cycle timing mode |
| 52 | DMA data transfer cycle timing mode |
| 53-127| reserved |
|128-159| Vendor Unique |
|160-255| reserved |
+-------+------------------------------------------------------------------+
The fields described in 9.4.1 through 9.4.5 are not affected by the Initialize
Drive Parameters command.
9.4.1 Number of fixed cylinders
The number of translated cylinders in the default translation mode.
9.4.2 Number of heads
The number of translated heads in the default translation mode.
9.4.3 Number of unformatted bytes per track
The number of unformatted bytes per translated track in the default
translation mode.
9.4.4 Number of unformatted bytes per sector
The number of unformatted bytes per sector in the default translation mode.
9.4.5 Number of sectors per track
The number of sectors per track in the default translation mode.
9.4.6 Serial Number
The contents of this field are right justified and padded with spaces (20h).
9.4.7 Buffer Type
The contents of the field are determined by the manufacturer.
0000h = not specified.
0001h = a single ported single sector buffer which is not capable of
simultaneous data transfers to or from the host and the disk.
0002h = a dual ported multi-sector buffer capable of simultaneous data
transfers to or from the host and the disk.
0003h = a dual ported multi-sector buffer capable of simultaneous transfers
with a read cacheing capability.
0004-FFFFh = reserved
These codes are typically not used by the operating system, however, they are
useful for diagnostic programs which perform initialization routines e.g. a
different interleave may be desirable for 0001h vs 0002h or 0003h.
9.4.8 Firmware Revision
The contents of this field are left justified and padded with spaces (20h).
9.4.9 Model Number
The contents of this field are left justified and padded with spaces (20h).
9.4.10 PIO data transfer cycle timing mode
The PIO transfer timing for each ATA device falls into categories which have
unique parametric timing specifications. To determine the proper device timing
category, compare the Cycle Time specified in Figure 11-1 with the contents of
this field. The value returned should fall into one of the categories
specified in Figure 11-1, and if it does not, then Mode 0 shall be used to
serve as the default timing.
9.4.11 DMA data transfer cycle timing mode
The DMA transfer timing for each ATA device falls into categories which have
unique parametric timing specifications. To determine the proper device timing
category, compare the Cycle Time specified in Figure 11-3 with the contents of
this field. The value returned should fall into one of the categories
specified in Figure 11-3, and if it does not, then Mode 0 shall be used to
serve as the default timing.
9.5 Idle
This command causes the drive to set BSY, enter the Idle Mode, clear BSY, and
generate an interrupt. The interrupt is generated even though the drive may
not have fully transitioned to Idle Mode.
If the drive is already spinning, the spinup sequence is not executed.
If the Sector Count Register is non-zero then the automatic power down
sequence shall be enabled and the timer begins counting down immediately. If
the Sector Count Register is zero then the automatic power down sequence shall
be disabled.
9.6 Idle Immediate
This command causes the drive to set BSY, enter the Idle Mode, clear BSY, and
generate an interrupt. The interrupt is generated even though the drive may
not have fully transitioned to Idle Mode.
9.7 Initialize Drive Parameters
..This command enables the host to control certain drive parameters. Some
..parameters are standard while others are vendor specific.
This command enables the host to set the number of sectors per track and the
number of heads minus 1, per cylinder. Upon receipt of the command, the drive
sets BSY, saves the parameters, clears BSY, and generates an interrupt.
The only two register values used by this command are the Sector Count
Register which specifies the number of sectors per track, and the Drive/Head
Register which specifies the number of heads minus 1. The DRV bit designates
these values to Drive 0 or Drive 1, as appropriate.
The sector count and head values are not checked for validity by this command.
If they are invalid, no error will be posted until an illegal access is made
by some other command.
9.8 Recalibrate
This command moves the read/write heads from anywhere on the disk to cylinder
0. Upon receipt of the command, the drive sets BSY and issues a seek to
cylinder zero. The drive then waits for the seek to complete before updating
status, clearing BSY and generating an interrupt.
If the drive cannot reach cylinder 0, a Track Not Found error is posted.
9.9 Read Buffer
The Read Buffer command enables the host to read the current contents of the
drive's sector buffer. When this command is issued, the drive sets BSY, sets
up the sector buffer for a read operation, sets DRQ, clears BSY, and generates
an interrupt. The host then reads up to 512 bytes of data from the buffer.
The Read Buffer and Write Buffer commands shall be synchronized such that
sequential Write Buffer and Read Buffer commands access the same 512 bytes
within the buffer.
9.10 Read DMA
This command executes in a similar manner to the Read Sectors command except
for the following:
- the host initializes a slave-DMA channel prior to issuing the command
- data transfers are qualified by DMARQ and are performed by the slave-DMA
channel
- the drive issues only one interrupt per command to indicate that data
transfer has terminated and status is available.
Any error encountered during execution of a Read DMA command results in the
termination of data transfer at the sector where the error was detected. The
sector in error is not transferred. The drive generates an interrupt to
indicate that data transfer has terminated and status is available. The error
posting is the same as that of the Read Sectors command.
9.11 Read Long
The Read Long command performs similarly to the Read Sectors command except
that it returns the data and the ECC bytes contained in the data field of the
desired sector. During a Read Long command, the drive does not check the ECC
bytes to determine if there has been a data error. Only single sector read
long operations are supported.
The transfer of the ECC bytes shall be 8-bits wide.
9.12 Read Multiple Command
The Read Multiple command performs similarly to the Read Sectors command.
Interrupts are not generated on every sector, but on the transfer of a block
which contains the number of sectors defined by a Set Multiple command.
Command execution is identical to the Read Sectors operation except that the
number of sectors defined by a Set Multiple command are transferred without
intervening interrupts. DRQ qualification of the transfer is required only at
the start of the data block, not on each sector.
The block count of sectors to be transferred without intervening interrupts is
programmed by the Set Multiple Mode command, which shall be executed prior to
the Read Multiple command.
When the Read Multiple command is issued, the Sector Count Register contains
the number of sectors (not the number of blocks or the block count) requested.
If the number of requested sectors is not evenly divisible by the block count,
as many full blocks as possible are transferred, followed by a final, partial
block transfer. The partial block transfer shall be for n sectors, where
n = (sector count) - modulo (block count)
If the Read Multiple command is attempted before the Set Multiple Mode command
has been executed or when Read Multiple commands are disabled, the Read
Multiple operation shall be rejected with an Aborted Command error.
Disk errors encountered during Read Multiple commands are posted at the
beginning of the block or partial block transfer, but DRQ is still set and the
data transfer shall take place as it normally would, including transfer of
corrupted data, if any.
The contents of the Command Block Registers following the transfer of a data
block which had a sector in error are undefined. The host should retry the
transfer as individual requests to obtain valid error information.
Subsequent blocks or partial blocks are transferred only if the error was a
correctable data error. All other errors cause the command to stop after
transfer of the block which contained the error. Interrupts are generated when
DRQ is set at the beginning of each block or partial block.
..The error reporting is the same as that on a Read Sectors command.
..
9.13 Read Sector(s)
This command reads from 1 to 256 sectors as specified in the Sector Count
register. A sector count of 0 requests 256 sectors. The transfer begins at the
sector specified in the Sector Number Register. See 10.1 for the DRQ, IRQ and
BSY protocol on data transfers.
If the drive is not already on the desired track, an implied seek is
performed. Once at the desired track, the drive searches for the appropriate
ID field.
If retries are disabled and two index pulses have occurred without error free
reading of the requested ID, an ID Not Found error is posted.
If retries are enabled, up to a vendor specific number of attempts may be made
to read the requested ID before posting an error.
If the ID is read correctly, the data address mark shall be recognized within
a specified number of bytes, or the Address Mark Not Found error is posted.
..Once the data address mark is found, the data field is read into the sector
..buffer, error bits are set if an error was encountered, DRQ is set, and an
..interrupt is generated.
..
DRQ is always set regardless of the presence or absence of an error condition
at the end of the sector.
At command completion, the Command Block Registers contain the cylinder, head,
and sector number of the last sector read.
If an error occurs, the read terminates at the sector where the error
occurred. The Command Block Registers contain the cylinder, head, and sector
number of the sector where the error occurred.
The flawed data is pending in the sector buffer.
9.14 Read Verify Sector(s)
This command is identical to the Read Sectors command, except that DRQ is
never set, and no data is transferred to the host. See 10.3 for protocol.
..When the command is accepted, the drive sets BSY.
When the requested sectors have been verified, the drive clears BSY and
generates an interrupt. Upon command completion, the Command Block Registers
contain the cylinder, head, and sector number of the last sector verified.
If an error occurs, the verify terminates at the sector where the error
occurs. The Command Block Registers contain the cylinder, head, and sector
number of the sector where the error occurred. The Sector Count Register shall
contain the number of sectors not yet verified.
9.15 Seek
This command initiates a seek to the track and selects the head specified in
the command block. The drive need not be formatted for a seek to execute
properly. See 10.3 for protocol. The drive shall not set DSC=1 until the
action of seeking has completed. The drive may return the interrupt before the
seek is completed.
If another command is issued to the drive while a seek is being executed, the
drive sets BSY=1, waits for the seek to complete, and then begins execution of
the command.
..The Sector Number Register is used to translate between perceived and real
..geometry.
..
9.16 Set Features
This command is used by the host to establish the following parameters which
affect the execution of certain drive features:
44h Vendor unique length of ECC on Read Long/Write Long commands
55h Disable read look-ahead feature
AAh Enable read look-ahead feature
BBh 4 bytes of ECC apply on Read Long/Write Long commands
See 10.3 for protocol. If the value in the register is not supported or is
invalid, the drive posts an Aborted Command error.
At power on, or after a software or hardware reset, the default mode is read
look-ahead enabled and 4 bytes of ECC.
9.17 Set Multiple Mode
This command enables the drive to perform Read and Write Multiple operations
and establishes the block count for these commands. See 10.3 for protocol.
The Sector Count Register is loaded with the number of sectors per block.
Drives shall support block sizes of 2, 4, 8, and 16 sectors, if their buffer
size is at least 8,192 bytes, and may also support other block sizes. Upon
receipt of the command, the drive sets BSY=1 and checks the Sector Count
Register.
If the Sector Count Register contains a valid value and the block count is
supported, the value is loaded for all subsequent Read Multiple and Write
Multiple commands and execution of those commands is enabled. If a block count
is not supported, an Aborted Command error is posted, and Read Multiple and
Write Multiple commands are disabled.
If the Sector Count Register contains 0 when the command is issued, Read and
Write Multiple commands are disabled.
At power on, or after a hardware or software reset, the default mode is Read
and Write Multiple disabled.
9.18 Sleep
This command is the only way to cause the drive to enter Sleep Mode. The drive
is spun down, and when it is stopped, BSY is cleared, an interrupt is
generated, and the interface becomes inactive.
The only way to recover from Sleep mode without a reset or power on, is for
the host to issue a software reset.
A drive shall not power on in Sleep Mode nor remain in Sleep Mode following a
reset sequence. If the drive is already spun down, the spin down sequence is
not executed.
9.19 Standby
This command causes the drive to enter the Standby Mode. See 10.3 for
protocol. The drive may return the interrupt before the transition to Standby
Mode is completed.
If the drive is already spun down, the spin down sequence is not executed.
If the Sector Count Register is non-zero then the automatic power down
sequence shall be enabled and the timer will begin counting down when the
drive returns to Idle mode. If the Sector Count Register is zero then the
automatic power down sequence shall be disabled.
9.20 Standby Immediate
This command causes the drive to enter the Standby Mode. See 10.3 for
protocol. The drive may return the interrupt before the transition to Standby
Mode is completed.
If the drive is already spun down, the spin down sequence is not executed.
9.21 Write Buffer
This command enables the host to overwrite the contents of the drive's sector
buffer with any data pattern desired. See 10.2 for protocol.
The Read Buffer and Write Buffer commands shall be synchronized within the
drive such that sequential Write Buffer and Read Buffer commands access the
same 512 bytes within the buffer.
9.22 Write DMA
This command executes in a similar manner to Write Sectors except for the
following:
- the host initializes a slave-DMA channel prior to issuing the command
- data transfers are qualified by DMARQ and are performed by the slave-DMA
channel
- the drive issues only one interrupt per command to indicate that data
transfer has terminated and status is available.
Any error encountered during Write DMA execution results in the termination of
data transfer. The drive issues an interrupt to indicate that data transfer
has terminated and status is available in the Error Register. The error
posting is the same as that of the Write Sectors command.
9.23 Write Multiple Command
This command is similar to the Write Sectors command. The drive sets BSY
within 400 nsec of accepting the command, and interrupts are not presented on
each sector but on the transfer of a block which contains the number of
sectors defined by Set Multiple.
Command execution is identical to the Write Sectors operation except that the
number of sectors defined by the Set Multiple command are transferred without
intervening interrupts. DRQ qualification of the transfer is required only at
the start of the data block, not on each sector.
The block count of sectors to be transferred without intervening interrupts is
programmed by the Set Multiple Mode command, which shall be executed prior to
the Read Multiple command.
When the Write Multiple command is issued, the Sector Count Register contains
the number of sectors (not the number of blocks or the block count) requested.
If the number of requested sectors is not evenly divisible by the block count,
as many full blocks as possible are transferred, followed by a final, partial
block transfer. The partial block transfer is for n sectors, where
n = (sector count) - modulo (block count)
If the Write Multiple command is attempted before the Set Multiple Mode
command has been executed or when Write Multiple commands are disabled, the
Write Multiple operation shall be rejected with an aborted command error.
Disk errors encountered during Write Multiple commands are posted after the
attempted disk write of the block or partial block transferred. The Write
command ends with the sector in error, even if it was in the middle of a
block. Subsequent blocks are not transferred in the event of an error.
Interrupts are generated when DRQ is set at the beginning of each block or
partial block.
..The Command Block Registers contain the cylinder, head, and sector number of
..the sector where the error occurred and the Sector Count Register contains the
..residual of sectors that need to be transferred for successful completion of
..the command e.g. each block has 4 sectors, a request for 8 sectors is issued,
..and an error occurs on the third sector. The Sector Count Register contains 6
..and the address is that of the third sector.
..
The contents of the Command Block Registers following the transfer of a data
block which had a sector in error are undefined. The host should retry the
transfer as individual requests to obtain valid error information.
9.24 Write Same
This command executes in a similar manner to Write Sectors except that only
one sector of data is transferred. The contents of the sector are written to
the medium one or more times.
NOTE: The Write Same command allows for initialization of part or all of the
medium to the specified data with a single command.
If the Features Register is 22h, the drive shall write that part of the medium
specified by the sector count, sector number, cylinder and drive/head
registers. If the Features Register contains DDh, the drive shall initialize
all the user accessible medium. If the register contains a value other than
22h or DDh, the command shall be rejected with an aborted command error.
The drive issues an interrupt to indicate that the command is complete. Any
error encountered during execution results in the termination of the write
operation. Status is available in the Error Register if an error occurs. The
error posting is the same as that of the Write Sectors command.
9.25 Write Long
This command is similar to the Write Sectors command except that it writes the
data and the ECC bytes directly from the sector buffer; the drive does not
generate the ECC bytes itself. Only single sector Write Long operations are
supported.
The transfer of the ECC bytes shall be 8-bits wide.
9.26 Write Sector(s)
This command writes from 1 to 256 sectors as specified in the Sector Count
Register (a sector count of zero requests 256 sectors), beginning at the
specified sector. See 10.1 for the DRQ, IRQ and BSY protocol on data
transfers.
..When this command is accepted, the drive sets DRQ and waits
..for the host to fill the sector buffer with the data to be written. No
..interrupt is generated to start the first buffer fill operation. Once the
..buffer is full, the drive clears DRQ, sets BSY and begins command execution.
..
If the drive is not already on the desired track, an implied seek is
performed. Once at the desired track, the drive searches for the appropriate
ID field.
If retries are disabled and two index pulses have occurred without error free
reading of the requested ID, an ID Not Found error is posted.
If retries are enabled, up to a vendor specific number of attempts may be made
to read the requested ID before posting an error.
If the ID is read correctly, the data loaded in the buffer is written to the
data field of the sector, followed by the ECC bytes. Upon command completion,
the Command Block Registers contain the cylinder, head, and sector number of
the last sector written.
If an error occurs during a write of more than one sector, writing terminates
at the sector where the error occurs. The Command Block Registers contain the
cylinder, head, and sector number of the sector where the error occurred. The
host may then read the command block to determine what error has occurred, and
on which sector.
9.27 Write Verify
This command is similar to the Write Sectors command, except that each sector
is verified immediately after being written. The verify operation is a read
without transfer and a check for data errors. Any errors encountered during
the verify operation are posted. Multiple sector write verify commands write
all the requested sectors and then verify all the requested sectors before
generating the final interrupt.