123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- .TH SCSI 2
- .SH NAME
- openscsi, closescsi, scsiready, scsi, scsicmd, scsierror \- SCSI device operations
- .SH SYNOPSIS
- .nf
- .ft L
- #include <u.h>
- #include <libc.h>
- #include <disk.h>
- .ft
- .PP
- .ft L
- typedef struct Scsi {
- char *inquire;
- int rawfd;
- int nchange;
- ulong changetime;
- };
- .ft
- .PP
- .B
- Scsi* openscsi(char *devdir)
- .PP
- .B
- void closescsi(Scsi *s)
- .PP
- .B
- int scsiready(Scsi *s)
- .PP
- .ft L
- int scsi(Scsi *s, uchar *cmd, int ncmd,
- .br
- void *data, int ndata, int dir)
- .PP
- .ft L
- int scsicmd(Scsi *s, uchar *cmd, int ncmd,
- .br
- void *data, int ndata, int dir)
- .PP
- .B
- char* scsierror(int asc, int ascq)
- .PP
- .B
- int scsiverbose;
- .SH DESCRIPTION
- These routines provide an interface
- to a SCSI or ATAPI device via
- .IR sd (3).
- .PP
- .I Openscsi
- attempts to open the file
- .IB devdir /raw
- and use it to send raw SCSI commands.
- On success, it reads the device's inquiry
- string and stores it in
- .I inquire
- in the returned
- .B Scsi
- structure.
- .I Closescsi
- closes the connection and frees the
- .B Scsi
- structure.
- .PP
- .I Scsiready
- sends the ``unit ready'' command up to three times,
- returning zero if the unit responds that it is ready,
- or \-1 on error.
- .PP
- .I Scsierror
- returns a textual description of the SCSI status
- denoted by the ASC and ASCQ sense codes.
- The description is found by consulting
- .BR /sys/lib/scsicodes .
- The returned string will be overwritten by
- the next call to
- .IR scsierror .
- .PP
- .I Scsi
- and
- .I scsicmd
- execute a single SCSI command on the named device.
- There should be
- .I ncmd
- bytes of
- command data in
- .IR cmd ;
- if
- .I dir
- is
- .BR Sread ,
- a successful operation
- will store up to
- .I ndata
- bytes into
- .IR data ,
- returning the number of bytes stored.
- If
- .I dir
- is
- .BR Swrite ,
- the
- .I ndata
- bytes beginning at
- .I data
- are transmitted as the data argument to
- the command, and the
- number of bytes written is returned.
- If
- .I dir
- is
- .BR Snone ,
- .I data
- and
- .I ndata
- are ignored.
- On error,
- .I scsi
- and
- .I scsicmd
- return \-1.
- .I Scsicmd
- simply issues the command and
- returns the result;
- .I scsi
- works a bit harder and
- is the more commonly used routine.
- .I Scsi
- attempts to send the command;
- if it is successful,
- .I scsi
- returns what
- .I scsicmd
- returned.
- Otherwise,
- .I 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,
- .I scsi
- sends the request
- sense and unit ready commands
- again
- and then uses
- .I scsierror
- to set
- .I errstr
- with a reason for failure.
- .PP
- The
- .B nchange
- and
- .B changetime
- fields
- in the
- .B Scsi
- structure
- record the number 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
- .IR scsi .
- .PP
- If
- .I scsiverbose
- is set,
- these commands will produce a fair
- amount of debugging output on file descriptor 2
- when SCSI commands fail.
- .SH FILES
- .TP
- .B /sys/lib/scsicodes
- List of textual messages corresponding to SCSI error codes;
- consulted by
- .BR scsierror .
- .SH SOURCE
- .B /sys/src/libdisk/scsi.c
- .SH SEE ALSO
- .IR sd (3),
- .IR scuzz (8)
|