scsireq.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. typedef struct Umsc Umsc;
  2. #pragma incomplete Umsc
  3. enum { /* fundamental constants/defaults */
  4. NTargetID = 8, /* number of target IDs */
  5. CtlrID = 7, /* default controller target ID */
  6. MaxDirData = 255, /* max. direct data returned */
  7. LBsize = 512, /* default logical-block size */
  8. };
  9. typedef struct {
  10. uchar *p;
  11. long count;
  12. uchar write;
  13. } ScsiPtr;
  14. typedef struct {
  15. int flags;
  16. char *unit; /* unit directory */
  17. int lun;
  18. ulong lbsize;
  19. ulong offset; /* in blocks of lbsize bytes */
  20. int fd;
  21. Umsc *umsc; /* lun */
  22. ScsiPtr cmd;
  23. ScsiPtr data;
  24. int status; /* returned status */
  25. uchar sense[MaxDirData]; /* returned sense data */
  26. uchar inquiry[MaxDirData]; /* returned inquiry data */
  27. int readblock; /* flag: read a block since open */
  28. } ScsiReq;
  29. enum { /* software flags */
  30. Fopen = 0x0001, /* open */
  31. Fseqdev = 0x0002, /* sequential-access device */
  32. Fwritten = 0x0004, /* device written */
  33. Fronly = 0x0008, /* device is read-only */
  34. Fwormdev = 0x0010, /* write-once read-multiple device */
  35. Fprintdev = 0x0020, /* printer */
  36. Fbfixed = 0x0040, /* fixed block size */
  37. Fchanger = 0x0080, /* medium-changer device */
  38. Finqok = 0x0100, /* inquiry data is OK */
  39. Fmode6 = 0x0200, /* use 6-byte modeselect */
  40. Frw10 = 0x0400, /* use 10-byte read/write */
  41. Fusb = 0x0800, /* USB transparent scsi */
  42. };
  43. enum {
  44. STnomem =-4, /* buffer allocation failed */
  45. STharderr =-3, /* controller error of some kind */
  46. STtimeout =-2, /* bus timeout */
  47. STok = 0, /* good */
  48. STcheck = 0x02, /* check condition */
  49. STcondmet = 0x04, /* condition met/good */
  50. STbusy = 0x08, /* busy */
  51. STintok = 0x10, /* intermediate/good */
  52. STintcondmet = 0x14, /* intermediate/condition met/good */
  53. STresconf = 0x18, /* reservation conflict */
  54. STterminated = 0x22, /* command terminated */
  55. STqfull = 0x28, /* queue full */
  56. };
  57. enum { /* status */
  58. Status_SD = 0x80, /* sense-data available */
  59. Status_SW = 0x83, /* internal software error */
  60. Status_BADARG = 0x84, /* bad argument to request */
  61. Status_RO = 0x85, /* device is read-only */
  62. };
  63. enum { /* SCSI command codes */
  64. ScmdTur = 0x00, /* test unit ready */
  65. ScmdRewind = 0x01, /* rezero/rewind */
  66. ScmdRsense = 0x03, /* request sense */
  67. ScmdFormat = 0x04, /* format unit */
  68. ScmdRblimits = 0x05, /* read block limits */
  69. ScmdRead = 0x08, /* read */
  70. ScmdWrite = 0x0A, /* write */
  71. ScmdSeek = 0x0B, /* seek */
  72. ScmdFmark = 0x10, /* write filemarks */
  73. ScmdSpace = 0x11, /* space forward/backward */
  74. ScmdInq = 0x12, /* inquiry */
  75. ScmdMselect6 = 0x15, /* mode select */
  76. ScmdMselect10 = 0x55, /* mode select */
  77. ScmdMsense6 = 0x1A, /* mode sense */
  78. ScmdMsense10 = 0x5A, /* mode sense */
  79. ScmdStart = 0x1B, /* start/stop unit */
  80. ScmdRcapacity = 0x25, /* read capacity */
  81. ScmdExtread = 0x28, /* extended read */
  82. ScmdExtwrite = 0x2A, /* extended write */
  83. ScmdExtseek = 0x2B, /* extended seek */
  84. ScmdSynccache = 0x35, /* flush cache */
  85. ScmdRTOC = 0x43, /* read TOC data */
  86. ScmdRdiscinfo = 0x51, /* read disc information */
  87. ScmdRtrackinfo = 0x52, /* read track information */
  88. ScmdBlank = 0xA1, /* blank CD-RW media */
  89. ScmdCDpause = 0x4B, /* pause/resume */
  90. ScmdCDstop = 0x4E, /* stop play/scan */
  91. ScmdCDplay = 0xA5, /* play audio */
  92. ScmdCDload = 0xA6, /* load/unload */
  93. ScmdCDscan = 0xBA, /* fast forward/reverse */
  94. ScmdCDstatus = 0xBD, /* mechanism status */
  95. Scmdgetconf = 0x46, /* get configuration */
  96. ScmdFwaddr = 0xE2, /* first writeable address */
  97. ScmdTreserve = 0xE4, /* reserve track */
  98. ScmdTinfo = 0xE5, /* read track info */
  99. ScmdTwrite = 0xE6, /* write track */
  100. ScmdMload = 0xE7, /* medium load/unload */
  101. ScmdFixation = 0xE9, /* fixation */
  102. ScmdEInitialise = 0x07, /* initialise element status */
  103. ScmdMMove = 0xA5, /* move medium */
  104. ScmdEStatus = 0xB8, /* read element status */
  105. ScmdMExchange = 0xA6, /* exchange medium */
  106. ScmdEposition = 0x2B, /* position to element */
  107. ScmdReadDVD = 0xAD, /* read dvd structure */
  108. ScmdReportKey = 0xA4, /* read dvd key */
  109. ScmdSendKey = 0xA3, /* write dvd key */
  110. };
  111. enum {
  112. /* sense data byte 0 */
  113. Sd0valid = 0x80, /* valid sense data present */
  114. /* sense data byte 2 */
  115. /* incorrect-length indicator, difference in bytes 3—6 */
  116. Sd2ili = 0x20,
  117. Sd2eom = 0x40, /* end of medium (tape) */
  118. Sd2filemark = 0x80, /* at a filemark (tape) */
  119. /* command byte 1 */
  120. Cmd1fixed = 1, /* use fixed-length blocks */
  121. Cmd1sili = 2, /* don't set Sd2ili */
  122. /* limit of block #s in 24-bit ccbs */
  123. Max24off = (1<<21) - 1, /* 2⁲ⁱ - 1 */
  124. /* mode pages */
  125. Allmodepages = 0x3F,
  126. };
  127. /* p arguments should be of type uchar* */
  128. #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3])
  129. #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \
  130. (p)[2] = (ul)>>8, (p)[3] = (ul))
  131. #define GETBE24(p) ((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2])
  132. #define PUTBE24(p, ul) ((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul))
  133. extern long maxiosize;
  134. long SRready(ScsiReq*);
  135. long SRrewind(ScsiReq*);
  136. long SRreqsense(ScsiReq*);
  137. long SRformat(ScsiReq*);
  138. long SRrblimits(ScsiReq*, uchar*);
  139. long SRread(ScsiReq*, void*, long);
  140. long SRwrite(ScsiReq*, void*, long);
  141. long SRseek(ScsiReq*, long, int);
  142. long SRfilemark(ScsiReq*, ulong);
  143. long SRspace(ScsiReq*, uchar, long);
  144. long SRinquiry(ScsiReq*);
  145. long SRmodeselect6(ScsiReq*, uchar*, long);
  146. long SRmodeselect10(ScsiReq*, uchar*, long);
  147. long SRmodesense6(ScsiReq*, uchar, uchar*, long);
  148. long SRmodesense10(ScsiReq*, uchar, uchar*, long);
  149. long SRstart(ScsiReq*, uchar);
  150. long SRrcapacity(ScsiReq*, uchar*);
  151. long SRblank(ScsiReq*, uchar, uchar); /* MMC CD-R/CD-RW commands */
  152. long SRsynccache(ScsiReq*);
  153. long SRTOC(ScsiReq*, void*, int, uchar, uchar);
  154. long SRrdiscinfo(ScsiReq*, void*, int);
  155. long SRrtrackinfo(ScsiReq*, void*, int, int);
  156. long SRcdpause(ScsiReq*, int); /* MMC CD audio commands */
  157. long SRcdstop(ScsiReq*);
  158. long SRcdload(ScsiReq*, int, int);
  159. long SRcdplay(ScsiReq*, int, long, long);
  160. long SRcdstatus(ScsiReq*, uchar*, int);
  161. long SRgetconf(ScsiReq*, uchar*, int);
  162. /* old CD-R/CD-RW commands */
  163. long SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*);
  164. long SRtreserve(ScsiReq*, long);
  165. long SRtinfo(ScsiReq*, uchar, uchar*);
  166. long SRwtrack(ScsiReq*, void*, long, uchar, uchar);
  167. long SRmload(ScsiReq*, uchar);
  168. long SRfixation(ScsiReq*, uchar);
  169. long SReinitialise(ScsiReq*); /* CHANGER commands */
  170. long SRestatus(ScsiReq*, uchar, uchar*, int);
  171. long SRmmove(ScsiReq*, int, int, int, int);
  172. long SRrequest(ScsiReq*);
  173. int SRclose(ScsiReq*);
  174. int SRopenraw(ScsiReq*, char*);
  175. int SRopen(ScsiReq*, char*);
  176. void makesense(ScsiReq*);
  177. long umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);