17d7728c9SDavid du Colombier /* 27d7728c9SDavid du Colombier * This is /sys/src/cmd/scuzz/scsireq.h 3*3a827ddcSDavid du Colombier * changed to add more debug support, and to keep 47d7728c9SDavid du Colombier * disk compiling without a scuzz that includes these changes. 57d7728c9SDavid du Colombier * 6*3a827ddcSDavid du Colombier * scsireq.h is also included by usb/disk and cdfs. 77d7728c9SDavid du Colombier */ 87d7728c9SDavid du Colombier typedef struct Umsc Umsc; 97d7728c9SDavid du Colombier #pragma incomplete Umsc 107d7728c9SDavid du Colombier 117d7728c9SDavid du Colombier enum { /* fundamental constants/defaults */ 127d7728c9SDavid du Colombier MaxDirData = 255, /* max. direct data returned */ 13*3a827ddcSDavid du Colombier /* 14*3a827ddcSDavid du Colombier * Because we are accessed via devmnt, we can never get i/o counts 15*3a827ddcSDavid du Colombier * larger than 8216 (Msgsize and devmnt's offered iounit) - 24 16*3a827ddcSDavid du Colombier * (IOHDRSZ) = 8K. 17*3a827ddcSDavid du Colombier */ 18*3a827ddcSDavid du Colombier Maxiosize = 8216 - IOHDRSZ, /* max. I/O transfer size */ 197d7728c9SDavid du Colombier }; 207d7728c9SDavid du Colombier 217d7728c9SDavid du Colombier typedef struct { 227d7728c9SDavid du Colombier uchar *p; 237d7728c9SDavid du Colombier long count; 247d7728c9SDavid du Colombier uchar write; 257d7728c9SDavid du Colombier } ScsiPtr; 267d7728c9SDavid du Colombier 277d7728c9SDavid du Colombier typedef struct { 287d7728c9SDavid du Colombier int flags; 297d7728c9SDavid du Colombier char *unit; /* unit directory */ 307d7728c9SDavid du Colombier int lun; 317d7728c9SDavid du Colombier ulong lbsize; 32*3a827ddcSDavid du Colombier uvlong offset; /* in blocks of lbsize bytes */ 337d7728c9SDavid du Colombier int fd; 347d7728c9SDavid du Colombier Umsc *umsc; /* lun */ 357d7728c9SDavid du Colombier ScsiPtr cmd; 367d7728c9SDavid du Colombier ScsiPtr data; 377d7728c9SDavid du Colombier int status; /* returned status */ 387d7728c9SDavid du Colombier uchar sense[MaxDirData]; /* returned sense data */ 397d7728c9SDavid du Colombier uchar inquiry[MaxDirData]; /* returned inquiry data */ 407d7728c9SDavid du Colombier int readblock; /* flag: read a block since open */ 417d7728c9SDavid du Colombier } ScsiReq; 427d7728c9SDavid du Colombier 437d7728c9SDavid du Colombier enum { /* software flags */ 447d7728c9SDavid du Colombier Fopen = 0x0001, /* open */ 457d7728c9SDavid du Colombier Fseqdev = 0x0002, /* sequential-access device */ 467d7728c9SDavid du Colombier Fwritten = 0x0004, /* device written */ 477d7728c9SDavid du Colombier Fronly = 0x0008, /* device is read-only */ 487d7728c9SDavid du Colombier Fwormdev = 0x0010, /* write-once read-multiple device */ 497d7728c9SDavid du Colombier Fprintdev = 0x0020, /* printer */ 507d7728c9SDavid du Colombier Fbfixed = 0x0040, /* fixed block size */ 517d7728c9SDavid du Colombier Fchanger = 0x0080, /* medium-changer device */ 527d7728c9SDavid du Colombier Finqok = 0x0100, /* inquiry data is OK */ 537d7728c9SDavid du Colombier Fmode6 = 0x0200, /* use 6-byte modeselect */ 547d7728c9SDavid du Colombier Frw10 = 0x0400, /* use 10-byte read/write */ 557d7728c9SDavid du Colombier Fusb = 0x0800, /* USB transparent scsi */ 567d7728c9SDavid du Colombier }; 577d7728c9SDavid du Colombier 587d7728c9SDavid du Colombier enum { 597d7728c9SDavid du Colombier STnomem =-4, /* buffer allocation failed */ 607d7728c9SDavid du Colombier STharderr =-3, /* controller error of some kind */ 617d7728c9SDavid du Colombier STtimeout =-2, /* bus timeout */ 627d7728c9SDavid du Colombier STok = 0, /* good */ 637d7728c9SDavid du Colombier STcheck = 0x02, /* check condition */ 647d7728c9SDavid du Colombier STcondmet = 0x04, /* condition met/good */ 657d7728c9SDavid du Colombier STbusy = 0x08, /* busy */ 667d7728c9SDavid du Colombier STintok = 0x10, /* intermediate/good */ 677d7728c9SDavid du Colombier STintcondmet = 0x14, /* intermediate/condition met/good */ 687d7728c9SDavid du Colombier STresconf = 0x18, /* reservation conflict */ 697d7728c9SDavid du Colombier STterminated = 0x22, /* command terminated */ 707d7728c9SDavid du Colombier STqfull = 0x28, /* queue full */ 717d7728c9SDavid du Colombier }; 727d7728c9SDavid du Colombier 737d7728c9SDavid du Colombier enum { /* status */ 747d7728c9SDavid du Colombier Status_SD = 0x80, /* sense-data available */ 757d7728c9SDavid du Colombier Status_SW = 0x83, /* internal software error */ 767d7728c9SDavid du Colombier Status_BADARG = 0x84, /* bad argument to request */ 777d7728c9SDavid du Colombier Status_RO = 0x85, /* device is read-only */ 787d7728c9SDavid du Colombier }; 797d7728c9SDavid du Colombier 807d7728c9SDavid du Colombier enum { 817d7728c9SDavid du Colombier /* sense data byte 0 */ 827d7728c9SDavid du Colombier Sd0valid = 0x80, /* valid sense data present */ 837d7728c9SDavid du Colombier 847d7728c9SDavid du Colombier /* sense data byte 2 */ 857d7728c9SDavid du Colombier /* incorrect-length indicator, difference in bytes 3—6 */ 867d7728c9SDavid du Colombier Sd2ili = 0x20, 877d7728c9SDavid du Colombier Sd2eom = 0x40, /* end of medium (tape) */ 887d7728c9SDavid du Colombier Sd2filemark = 0x80, /* at a filemark (tape) */ 897d7728c9SDavid du Colombier 907d7728c9SDavid du Colombier /* command byte 1 */ 917d7728c9SDavid du Colombier Cmd1fixed = 1, /* use fixed-length blocks */ 927d7728c9SDavid du Colombier Cmd1sili = 2, /* don't set Sd2ili */ 937d7728c9SDavid du Colombier 947d7728c9SDavid du Colombier /* limit of block #s in 24-bit ccbs */ 957d7728c9SDavid du Colombier Max24off = (1<<21) - 1, /* 2ⁱ - 1 */ 967d7728c9SDavid du Colombier 977d7728c9SDavid du Colombier /* mode pages */ 987d7728c9SDavid du Colombier Allmodepages = 0x3F, 997d7728c9SDavid du Colombier }; 1007d7728c9SDavid du Colombier 1017d7728c9SDavid du Colombier /* scsi device types, from the scsi standards */ 1027d7728c9SDavid du Colombier enum { 1037d7728c9SDavid du Colombier Devdir, /* usually disk */ 1047d7728c9SDavid du Colombier Devseq, /* usually tape */ 1057d7728c9SDavid du Colombier Devprint, 1067d7728c9SDavid du Colombier Dev3, 1077d7728c9SDavid du Colombier Devworm, /* also direct, but special */ 1087d7728c9SDavid du Colombier Devcd, /* also direct */ 1097d7728c9SDavid du Colombier Dev6, 1107d7728c9SDavid du Colombier Devmo, /* also direct */ 1117d7728c9SDavid du Colombier Devjuke, 1127d7728c9SDavid du Colombier }; 1137d7728c9SDavid du Colombier 1147d7728c9SDavid du Colombier /* p arguments should be of type uchar* */ 1157d7728c9SDavid du Colombier #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3]) 1167d7728c9SDavid du Colombier #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \ 1177d7728c9SDavid du Colombier (p)[2] = (ul)>>8, (p)[3] = (ul)) 1187d7728c9SDavid du Colombier #define GETBE24(p) ((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2]) 1197d7728c9SDavid du Colombier #define PUTBE24(p, ul) ((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul)) 1207d7728c9SDavid du Colombier 1217d7728c9SDavid du Colombier long SRready(ScsiReq*); 1227d7728c9SDavid du Colombier long SRrewind(ScsiReq*); 1237d7728c9SDavid du Colombier long SRreqsense(ScsiReq*); 1247d7728c9SDavid du Colombier long SRformat(ScsiReq*); 1257d7728c9SDavid du Colombier long SRrblimits(ScsiReq*, uchar*); 1267d7728c9SDavid du Colombier long SRread(ScsiReq*, void*, long); 1277d7728c9SDavid du Colombier long SRwrite(ScsiReq*, void*, long); 1287d7728c9SDavid du Colombier long SRseek(ScsiReq*, long, int); 1297d7728c9SDavid du Colombier long SRfilemark(ScsiReq*, ulong); 1307d7728c9SDavid du Colombier long SRspace(ScsiReq*, uchar, long); 1317d7728c9SDavid du Colombier long SRinquiry(ScsiReq*); 1327d7728c9SDavid du Colombier long SRmodeselect6(ScsiReq*, uchar*, long); 1337d7728c9SDavid du Colombier long SRmodeselect10(ScsiReq*, uchar*, long); 1347d7728c9SDavid du Colombier long SRmodesense6(ScsiReq*, uchar, uchar*, long); 1357d7728c9SDavid du Colombier long SRmodesense10(ScsiReq*, uchar, uchar*, long); 1367d7728c9SDavid du Colombier long SRstart(ScsiReq*, uchar); 1377d7728c9SDavid du Colombier long SRrcapacity(ScsiReq*, uchar*); 1387d7728c9SDavid du Colombier long SRrcapacity16(ScsiReq*, uchar*); 1397d7728c9SDavid du Colombier 1407d7728c9SDavid du Colombier long SRblank(ScsiReq*, uchar, uchar); /* MMC CD-R/CD-RW commands */ 1417d7728c9SDavid du Colombier long SRsynccache(ScsiReq*); 1427d7728c9SDavid du Colombier long SRTOC(ScsiReq*, void*, int, uchar, uchar); 1437d7728c9SDavid du Colombier long SRrdiscinfo(ScsiReq*, void*, int); 1447d7728c9SDavid du Colombier long SRrtrackinfo(ScsiReq*, void*, int, int); 1457d7728c9SDavid du Colombier 1467d7728c9SDavid du Colombier long SRcdpause(ScsiReq*, int); /* MMC CD audio commands */ 1477d7728c9SDavid du Colombier long SRcdstop(ScsiReq*); 1487d7728c9SDavid du Colombier long SRcdload(ScsiReq*, int, int); 1497d7728c9SDavid du Colombier long SRcdplay(ScsiReq*, int, long, long); 1507d7728c9SDavid du Colombier long SRcdstatus(ScsiReq*, uchar*, int); 1517d7728c9SDavid du Colombier long SRgetconf(ScsiReq*, uchar*, int); 1527d7728c9SDavid du Colombier 1537d7728c9SDavid du Colombier /* old CD-R/CD-RW commands */ 1547d7728c9SDavid du Colombier long SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*); 1557d7728c9SDavid du Colombier long SRtreserve(ScsiReq*, long); 1567d7728c9SDavid du Colombier long SRtinfo(ScsiReq*, uchar, uchar*); 1577d7728c9SDavid du Colombier long SRwtrack(ScsiReq*, void*, long, uchar, uchar); 1587d7728c9SDavid du Colombier long SRmload(ScsiReq*, uchar); 1597d7728c9SDavid du Colombier long SRfixation(ScsiReq*, uchar); 1607d7728c9SDavid du Colombier 1617d7728c9SDavid du Colombier long SReinitialise(ScsiReq*); /* CHANGER commands */ 1627d7728c9SDavid du Colombier long SRestatus(ScsiReq*, uchar, uchar*, int); 1637d7728c9SDavid du Colombier long SRmmove(ScsiReq*, int, int, int, int); 1647d7728c9SDavid du Colombier 1657d7728c9SDavid du Colombier long SRrequest(ScsiReq*); 1667d7728c9SDavid du Colombier int SRclose(ScsiReq*); 1677d7728c9SDavid du Colombier int SRopenraw(ScsiReq*, char*); 1687d7728c9SDavid du Colombier int SRopen(ScsiReq*, char*); 1697d7728c9SDavid du Colombier 1707d7728c9SDavid du Colombier void makesense(ScsiReq*); 1717d7728c9SDavid du Colombier 1727d7728c9SDavid du Colombier long umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*); 1737d7728c9SDavid du Colombier 1747d7728c9SDavid du Colombier void scsidebug(int); 1757d7728c9SDavid du Colombier 1767d7728c9SDavid du Colombier char* scsierrmsg(int n); 177