SCSI  protocols.  See Section 13.2 of our book for more.

Bus is independent of the devices on it.

Devices may be initiator, target, or both.
  Initiator - device that proactively uses bus.
    Multiple initiators possible, requiring arbitration.

  Target - passive device being acted on.

  Host recommended - device acting primarily as an initiator.

Each device is assigned a logical unit number, LUN. 
  Host interface card often assigned id 1 (?).
  Original done with jumpers, often done at the software level.  
  Device usually has one lun but can have more.


How devices interract :

  Initiator starts an interaction with a target by sending a command
  in a Command Descriptor Block (operator byte and 5 more or bytes of command
  parameters).

  Target responds with Status, Success, Busy, Error or check condition.

  If initiator detects an error, 
    perform additional communication to determine more about the error.

  Else if busy
    Possibly initiate altenative task on another target 

  Otherwise 
    Perform task.
 
Logical protocol (task phases) :

  Bus Free - is bus busy? Check BSY control line.

  Arbitration - bid for control of bus. ID used to assert authority, with
    higher id winning. Devices that are always targets should have low ids.

  Selection - target device's address put on data lines. (SEL)lect line 
    activated.

    Target responds by activating BSY line. Initiator deactivates SEL.

  Command - when targets sees SEL deactivated, it indicates ready for command
    on (C)ommand/(D)ata and the (REQ)uest lines. 

    Once detected by iniator, initator places command byte on data line and 
      asserts (ACK)nowledgement.

    Target toggles ACK when command byte successfully retrieved. Subsequent 
      command argument bytes passed by toggling ACK for each byte. 
 
    It is possible to release the bus while target device activates and seeks 
      out targeted storage area, but much of the previous handshaking would 
      have to be re-performed to re-establish inter-connectivity.

  Data - Transfer of data between initiator and target.
    Set C/D line to data. Using data lines, input/output control, REQ, and 
    ACK, pass data in desired direction.

  Status - Once data transferred, target toggles C/D to control and asserts
    REQ to inform initiator it has completed task.  
  
  Message - when target senses initiator's recognition of its state (ACK?), 
    the target places "command complete" status on data lines and asserts MSG 
    line.

    When initiator detects this, it clears the various status lines marking
    the bus as free.

  Reselection - if "connection" freed because bus was released with drive 
    spun up or tape reader searched for records, and now is ready to complete
    the task, reselection allows initiator to perform the arbitration step but 
    skip the selection and command steps to complete the task.

The interaction on the bus are actual byte/word values without clock line or
clock encoding of data (RLL). The various actions on the bus have fairly tight 
timing.

  If one of the "phases" listed above does not complete in the defined time,
    it is considered an error and the phase is repeated from the beginning. 

  Synchronous transfers possible on devices that are fast enough. The data
    step is done as a sequence of data transfers based on an agreed on time
    per bytes with a single REQ/ACK performed at end of the block of data.

    CRC check of data helpful in confirming good transfer.

There are about 60 commands available and they are designed to be generic
enough to be applicable in some combination to any device likely to be 
attached to the bus.

* Similar to channel programming on a mainframe.
 
Some more common command activities.

Test unit ready - query target to see if it is in responsive state. 

Inquiry - get basic information on target.

Request sense - get error code on device that returned error status.

Start/stop - spin device up/down or load/eject media.

Send/Receive diagnostics

Format Unit 

Read/Write (6 variants of read and 5 of write).
   Variants related to changes in LBA sizes as disks evolve.

Mode sense/select - read/set various device configuration parameters - 
  Some information retrieved is standardized.
  But device specific information would by passed to/from a device driver for 
    correct interpretation and setting. 


Note that SCSI buses are designed to transmit data at certain clock speeds.

However, the target itself may take a long time to determine its own status,
such as a tape drive seeking a particular file.  

NCQ provides a way to keep bus busy while waiting for response. NCQ allows
"controller" to rearrange the tasks to optimize the queue to the speed of
the task. 

Serial SCSI