summaryrefslogtreecommitdiff
path: root/sys/src/cmd/nusb/disk/scsireq.h
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-07-27 20:07:30 +0200
committeraiju <aiju@phicode.de>2011-07-27 20:07:30 +0200
commit05d09f086fdb76206ab5ff0e26a1e1bc2f34b6a3 (patch)
treec62905a4a8467110b426843a683136a835c8be14 /sys/src/cmd/nusb/disk/scsireq.h
parent5181f2e576dc6b92dfa7dcaa2f60397b931fbc4a (diff)
nusb: improved
Diffstat (limited to 'sys/src/cmd/nusb/disk/scsireq.h')
-rw-r--r--sys/src/cmd/nusb/disk/scsireq.h238
1 files changed, 238 insertions, 0 deletions
diff --git a/sys/src/cmd/nusb/disk/scsireq.h b/sys/src/cmd/nusb/disk/scsireq.h
new file mode 100644
index 000000000..0fbd2b938
--- /dev/null
+++ b/sys/src/cmd/nusb/disk/scsireq.h
@@ -0,0 +1,238 @@
+/*
+ * This is /sys/src/cmd/scuzz/scsireq.h
+ * changed to add more debug support, and to keep
+ * disk compiling without a scuzz that includes these changes.
+ *
+ * scsireq.h is also included by usb/disk and cdfs.
+ */
+typedef struct Umsc Umsc;
+#pragma incomplete Umsc
+
+enum { /* fundamental constants/defaults */
+ MaxDirData = 255, /* max. direct data returned */
+ /*
+ * Because we are accessed via devmnt, we can never get i/o counts
+ * larger than 8216 (Msgsize and devmnt's offered iounit) - 24
+ * (IOHDRSZ) = 8K.
+ */
+ Maxiosize = 8216 - IOHDRSZ, /* max. I/O transfer size */
+};
+
+typedef struct {
+ uchar *p;
+ long count;
+ uchar write;
+} ScsiPtr;
+
+typedef struct {
+ int flags;
+ char *unit; /* unit directory */
+ int lun;
+ ulong lbsize;
+ uvlong offset; /* in blocks of lbsize bytes */
+ int fd;
+ Umsc *umsc; /* lun */
+ ScsiPtr cmd;
+ ScsiPtr data;
+ int status; /* returned status */
+ uchar sense[MaxDirData]; /* returned sense data */
+ uchar inquiry[MaxDirData]; /* returned inquiry data */
+ int readblock; /* flag: read a block since open */
+} ScsiReq;
+
+enum { /* software flags */
+ Fopen = 0x0001, /* open */
+ Fseqdev = 0x0002, /* sequential-access device */
+ Fwritten = 0x0004, /* device written */
+ Fronly = 0x0008, /* device is read-only */
+ Fwormdev = 0x0010, /* write-once read-multiple device */
+ Fprintdev = 0x0020, /* printer */
+ Fbfixed = 0x0040, /* fixed block size */
+ Fchanger = 0x0080, /* medium-changer device */
+ Finqok = 0x0100, /* inquiry data is OK */
+ Fmode6 = 0x0200, /* use 6-byte modeselect */
+ Frw10 = 0x0400, /* use 10-byte read/write */
+ Fusb = 0x0800, /* USB transparent scsi */
+};
+
+enum {
+ STnomem =-4, /* buffer allocation failed */
+ STharderr =-3, /* controller error of some kind */
+ STtimeout =-2, /* bus timeout */
+ STok = 0, /* good */
+ STcheck = 0x02, /* check condition */
+ STcondmet = 0x04, /* condition met/good */
+ STbusy = 0x08, /* busy */
+ STintok = 0x10, /* intermediate/good */
+ STintcondmet = 0x14, /* intermediate/condition met/good */
+ STresconf = 0x18, /* reservation conflict */
+ STterminated = 0x22, /* command terminated */
+ STqfull = 0x28, /* queue full */
+};
+
+enum { /* status */
+ Status_SD = 0x80, /* sense-data available */
+ Status_SW = 0x83, /* internal software error */
+ Status_BADARG = 0x84, /* bad argument to request */
+ Status_RO = 0x85, /* device is read-only */
+};
+
+enum { /* SCSI command codes */
+ ScmdTur = 0x00, /* test unit ready */
+ ScmdRewind = 0x01, /* rezero/rewind */
+ ScmdRsense = 0x03, /* request sense */
+ ScmdFormat = 0x04, /* format unit */
+ ScmdRblimits = 0x05, /* read block limits */
+ ScmdRead = 0x08, /* read */
+ ScmdWrite = 0x0A, /* write */
+ ScmdSeek = 0x0B, /* seek */
+ ScmdFmark = 0x10, /* write filemarks */
+ ScmdSpace = 0x11, /* space forward/backward */
+ ScmdInq = 0x12, /* inquiry */
+ ScmdMselect6 = 0x15, /* mode select */
+ ScmdMselect10 = 0x55, /* mode select */
+ ScmdMsense6 = 0x1A, /* mode sense */
+ ScmdMsense10 = 0x5A, /* mode sense */
+ ScmdStart = 0x1B, /* start/stop unit */
+ ScmdRcapacity = 0x25, /* read capacity */
+ ScmdRcapacity16 = 0x9e, /* long read capacity */
+ ScmdExtread = 0x28, /* extended read */
+ ScmdExtwrite = 0x2A, /* extended write */
+ ScmdExtseek = 0x2B, /* extended seek */
+
+ ScmdSynccache = 0x35, /* flush cache */
+ ScmdRTOC = 0x43, /* read TOC data */
+ ScmdRdiscinfo = 0x51, /* read disc information */
+ ScmdRtrackinfo = 0x52, /* read track information */
+ ScmdReserve = 0x53, /* reserve track */
+ ScmdBlank = 0xA1, /* blank *-RW media */
+
+ ScmdCDpause = 0x4B, /* pause/resume */
+ ScmdCDstop = 0x4E, /* stop play/scan */
+ ScmdCDplay = 0xA5, /* play audio */
+ ScmdCDload = 0xA6, /* load/unload */
+ ScmdCDscan = 0xBA, /* fast forward/reverse */
+ ScmdCDstatus = 0xBD, /* mechanism status */
+ Scmdgetconf = 0x46, /* get configuration */
+
+ ScmdEInitialise = 0x07, /* initialise element status */
+ ScmdMMove = 0xA5, /* move medium */
+ ScmdEStatus = 0xB8, /* read element status */
+ ScmdMExchange = 0xA6, /* exchange medium */
+ ScmdEposition = 0x2B, /* position to element */
+
+ ScmdReadDVD = 0xAD, /* read dvd structure */
+ ScmdReportKey = 0xA4, /* read dvd key */
+ ScmdSendKey = 0xA3, /* write dvd key */
+
+ ScmdClosetracksess= 0x5B,
+ ScmdRead12 = 0xA8,
+ ScmdSetcdspeed = 0xBB,
+ ScmdReadcd = 0xBE,
+
+ /* vendor-specific */
+ ScmdFwaddr = 0xE2, /* first writeable address */
+ ScmdTreserve = 0xE4, /* reserve track */
+ ScmdTinfo = 0xE5, /* read track info */
+ ScmdTwrite = 0xE6, /* write track */
+ ScmdMload = 0xE7, /* medium load/unload */
+ ScmdFixation = 0xE9, /* fixation */
+};
+
+enum {
+ /* sense data byte 0 */
+ Sd0valid = 0x80, /* valid sense data present */
+
+ /* sense data byte 2 */
+ /* incorrect-length indicator, difference in bytes 3—6 */
+ Sd2ili = 0x20,
+ Sd2eom = 0x40, /* end of medium (tape) */
+ Sd2filemark = 0x80, /* at a filemark (tape) */
+
+ /* command byte 1 */
+ Cmd1fixed = 1, /* use fixed-length blocks */
+ Cmd1sili = 2, /* don't set Sd2ili */
+
+ /* limit of block #s in 24-bit ccbs */
+ Max24off = (1<<21) - 1, /* 2⁲ⁱ - 1 */
+
+ /* mode pages */
+ Allmodepages = 0x3F,
+};
+
+/* scsi device types, from the scsi standards */
+enum {
+ Devdir, /* usually disk */
+ Devseq, /* usually tape */
+ Devprint,
+ Dev3,
+ Devworm, /* also direct, but special */
+ Devcd, /* also direct */
+ Dev6,
+ Devmo, /* also direct */
+ Devjuke,
+};
+
+/* p arguments should be of type uchar* */
+#define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3])
+#define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \
+ (p)[2] = (ul)>>8, (p)[3] = (ul))
+#define GETBE24(p) ((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2])
+#define PUTBE24(p, ul) ((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul))
+
+long SRready(ScsiReq*);
+long SRrewind(ScsiReq*);
+long SRreqsense(ScsiReq*);
+long SRformat(ScsiReq*);
+long SRrblimits(ScsiReq*, uchar*);
+long SRread(ScsiReq*, void*, long);
+long SRwrite(ScsiReq*, void*, long);
+long SRseek(ScsiReq*, long, int);
+long SRfilemark(ScsiReq*, ulong);
+long SRspace(ScsiReq*, uchar, long);
+long SRinquiry(ScsiReq*);
+long SRmodeselect6(ScsiReq*, uchar*, long);
+long SRmodeselect10(ScsiReq*, uchar*, long);
+long SRmodesense6(ScsiReq*, uchar, uchar*, long);
+long SRmodesense10(ScsiReq*, uchar, uchar*, long);
+long SRstart(ScsiReq*, uchar);
+long SRrcapacity(ScsiReq*, uchar*);
+long SRrcapacity16(ScsiReq*, uchar*);
+
+long SRblank(ScsiReq*, uchar, uchar); /* MMC CD-R/CD-RW commands */
+long SRsynccache(ScsiReq*);
+long SRTOC(ScsiReq*, void*, int, uchar, uchar);
+long SRrdiscinfo(ScsiReq*, void*, int);
+long SRrtrackinfo(ScsiReq*, void*, int, int);
+
+long SRcdpause(ScsiReq*, int); /* MMC CD audio commands */
+long SRcdstop(ScsiReq*);
+long SRcdload(ScsiReq*, int, int);
+long SRcdplay(ScsiReq*, int, long, long);
+long SRcdstatus(ScsiReq*, uchar*, int);
+long SRgetconf(ScsiReq*, uchar*, int);
+
+/* old CD-R/CD-RW commands */
+long SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*);
+long SRtreserve(ScsiReq*, long);
+long SRtinfo(ScsiReq*, uchar, uchar*);
+long SRwtrack(ScsiReq*, void*, long, uchar, uchar);
+long SRmload(ScsiReq*, uchar);
+long SRfixation(ScsiReq*, uchar);
+
+long SReinitialise(ScsiReq*); /* CHANGER commands */
+long SRestatus(ScsiReq*, uchar, uchar*, int);
+long SRmmove(ScsiReq*, int, int, int, int);
+
+long SRrequest(ScsiReq*);
+int SRclose(ScsiReq*);
+int SRopenraw(ScsiReq*, char*);
+int SRopen(ScsiReq*, char*);
+
+void makesense(ScsiReq*);
+
+long umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);
+
+void scsidebug(int);
+
+char* scsierrmsg(int n);