glenda.party
term% ls -F
term% pwd
$home/manuals/9front/2/scsi
term% cat index.txt
SCSI(2)                       System Calls Manual                      SCSI(2)

NAME
       openscsi,  closescsi, scsiready, scsi, scsicmd, scsierror - SCSI device
       operations

SYNOPSIS
       #include <u.h>
       #include <libc.h>
       #include <disk.h>

       typedef struct Scsi {
            char  *inquire;
            int   rawfd;
            int   nchange;
            ulong changetime;
       };

       Scsi* openscsi(char *devdir)

       void  closescsi(Scsi *s)

       int   scsiready(Scsi *s)

       int   scsi(Scsi *s, uchar *cmd, int ncmd,
                           void *data, int ndata, int dir)

       int   scsicmd(Scsi *s, uchar *cmd, int ncmd,
                           void *data, int ndata, int dir)

       char* scsierror(int asc, int ascq)

       int   scsiverbose;

DESCRIPTION
       These routines provide an interface to  a  SCSI  or  ATAPI  device  via
       sd(3).

       Openscsi  attempts  to  open the file devdir/raw and use it to send raw
       SCSI commands.  On success, it reads the device's  inquiry  string  and
       stores  it in inquire in the returned Scsi structure.  Closescsi closes
       the connection and frees the Scsi structure.

       Scsiready sends the ‘‘unit ready'' command up to three times, returning
       zero if the unit responds that it is ready, or -1 on error.

       Scsierror returns a textual description of the SCSI status  denoted  by
       the  ASC  and ASCQ sense codes.  The description is found by consulting
       /sys/lib/scsicodes.  The returned string will  be  overwritten  by  the
       next call to scsierror.

       Scsi  and  scsicmd  execute  a single SCSI command on the named device.
       There should be ncmd bytes of command data in cmd; if dir is  Sread,  a
       successful  operation will store up to ndata bytes into data, returning
       the number of bytes stored.  If dir is Swrite, the ndata  bytes  begin‐
       ning  at  data are transmitted as the data argument to the command, and
       the number of bytes written is returned.  If dir  is  Snone,  data  and
       ndata are ignored.  On error, scsi and scsicmd return -1.  Scsicmd sim‐
       ply  issues the command and returns the result; scsi works a bit harder
       and is the more commonly used routine.  Scsi attempts to send the  com‐
       mand;  if it is successful, scsi returns what scsicmd returned.  Other‐
       wise, scsi sends a request sense command to obtain the reason  for  the
       failure, sends a unit ready command in an attempt to bring the unit out
       of  any inconsistent states, and tries again.  If the second try fails,
       scsi sends the request sense and unit ready  commands  again  and  then
       uses scsierror to set errstr with a reason for failure.

       The nchange and changetime fields in the Scsi structure record the num‐
       ber  of  times  a media change has been detected, and the time when the
       current media was inserted into the drive (really the first time a SCSI
       command was issued after it was  inserted).   They  are  maintained  by
       scsi.

       If scsiverbose is set, these commands will produce a fair amount of de‐
       bugging output on file descriptor 2 when SCSI commands fail.

FILES
       /sys/lib/scsicodes
              List of textual messages corresponding to SCSI error codes; con‐
              sulted by scsierror.

SOURCE
       /sys/src/libdisk/scsi.c

SEE ALSO
       sd(3), scuzz(8)

                                                                       SCSI(2)