cdr.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "scsireq.h"
  4. long
  5. SRblank(ScsiReq *rp, uchar type, uchar track)
  6. {
  7. uchar cmd[12];
  8. memset(cmd, 0, sizeof(cmd));
  9. cmd[0] = ScmdBlank;
  10. cmd[1] = type;
  11. cmd[2] = track>>24;
  12. cmd[3] = track>>16;
  13. cmd[4] = track>>8;
  14. cmd[5] = track;
  15. rp->cmd.p = cmd;
  16. rp->cmd.count = sizeof(cmd);
  17. rp->data.p = cmd;
  18. rp->data.count = 0;
  19. rp->data.write = 1;
  20. return SRrequest(rp);
  21. }
  22. long
  23. SRsynccache(ScsiReq *rp)
  24. {
  25. uchar cmd[10];
  26. memset(cmd, 0, sizeof(cmd));
  27. cmd[0] = ScmdSynccache;
  28. rp->cmd.p = cmd;
  29. rp->cmd.count = sizeof(cmd);
  30. rp->data.p = cmd;
  31. rp->data.count = 0;
  32. rp->data.write = 1;
  33. return SRrequest(rp);
  34. }
  35. long
  36. SRTOC(ScsiReq *rp, void *data, int nbytes, uchar format, uchar track)
  37. {
  38. uchar cmd[10];
  39. memset(cmd, 0, sizeof(cmd));
  40. cmd[0] = ScmdRTOC;
  41. cmd[2] = format;
  42. cmd[6] = track;
  43. cmd[7] = nbytes>>8;
  44. cmd[8] = nbytes;
  45. rp->cmd.p = cmd;
  46. rp->cmd.count = sizeof(cmd);
  47. rp->data.p = data;
  48. rp->data.count = nbytes;
  49. rp->data.write = 0;
  50. return SRrequest(rp);
  51. }
  52. long
  53. SRrdiscinfo(ScsiReq *rp, void *data, int nbytes)
  54. {
  55. uchar cmd[10];
  56. memset(cmd, 0, sizeof(cmd));
  57. cmd[0] = ScmdRdiscinfo;
  58. cmd[7] = nbytes>>8;
  59. cmd[8] = nbytes;
  60. rp->cmd.p = cmd;
  61. rp->cmd.count = sizeof(cmd);
  62. rp->data.p = data;
  63. rp->data.count = nbytes;
  64. rp->data.write = 0;
  65. return SRrequest(rp);
  66. }
  67. long
  68. SRrtrackinfo(ScsiReq *rp, void *data, int nbytes, int track)
  69. {
  70. uchar cmd[10];
  71. memset(cmd, 0, sizeof(cmd));
  72. cmd[0] = ScmdRtrackinfo;
  73. cmd[1] = 0x01;
  74. cmd[2] = track>>24;
  75. cmd[3] = track>>16;
  76. cmd[4] = track>>8;
  77. cmd[5] = track;
  78. cmd[7] = nbytes>>8;
  79. cmd[8] = nbytes;
  80. rp->cmd.p = cmd;
  81. rp->cmd.count = sizeof(cmd);
  82. rp->data.p = data;
  83. rp->data.count = nbytes;
  84. rp->data.write = 0;
  85. return SRrequest(rp);
  86. }
  87. long
  88. SRfwaddr(ScsiReq *rp, uchar track, uchar mode, uchar npa, uchar *data)
  89. {
  90. uchar cmd[10];
  91. memset(cmd, 0, sizeof(cmd));
  92. cmd[0] = ScmdFwaddr;
  93. cmd[2] = track;
  94. cmd[3] = mode;
  95. cmd[7] = npa;
  96. rp->cmd.p = cmd;
  97. rp->cmd.count = sizeof(cmd);
  98. rp->data.p = data;
  99. rp->data.count = MaxDirData;
  100. rp->data.write = 0;
  101. return SRrequest(rp);
  102. }
  103. long
  104. SRtreserve(ScsiReq *rp, long nbytes)
  105. {
  106. uchar cmd[10];
  107. long n;
  108. if((nbytes % rp->lbsize)){
  109. rp->status = Status_BADARG;
  110. return -1;
  111. }
  112. memset(cmd, 0, sizeof(cmd));
  113. cmd[0] = ScmdTreserve;
  114. n = nbytes/rp->lbsize;
  115. cmd[5] = n>>24;
  116. cmd[6] = n>>16;
  117. cmd[7] = n>>8;
  118. cmd[8] = n;
  119. rp->cmd.p = cmd;
  120. rp->cmd.count = sizeof(cmd);
  121. rp->data.p = cmd;
  122. rp->data.count = 0;
  123. rp->data.write = 1;
  124. return SRrequest(rp);
  125. }
  126. long
  127. SRtinfo(ScsiReq *rp, uchar track, uchar *data)
  128. {
  129. uchar cmd[10];
  130. memset(cmd, 0, sizeof(cmd));
  131. cmd[0] = ScmdTinfo;
  132. cmd[5] = track;
  133. cmd[8] = MaxDirData;
  134. rp->cmd.p = cmd;
  135. rp->cmd.count = sizeof(cmd);
  136. rp->data.p = data;
  137. rp->data.count = MaxDirData;
  138. rp->data.write = 0;
  139. return SRrequest(rp);
  140. }
  141. long
  142. SRwtrack(ScsiReq *rp, void *buf, long nbytes, uchar track, uchar mode)
  143. {
  144. uchar cmd[10];
  145. long m, n;
  146. if((nbytes % rp->lbsize) || nbytes > MaxIOsize){
  147. rp->status = Status_BADARG;
  148. return -1;
  149. }
  150. memset(cmd, 0, sizeof(cmd));
  151. cmd[0] = ScmdTwrite;
  152. cmd[5] = track;
  153. cmd[6] = mode;
  154. n = nbytes/rp->lbsize;
  155. cmd[7] = n>>8;
  156. cmd[8] = n;
  157. rp->cmd.p = cmd;
  158. rp->cmd.count = sizeof(cmd);
  159. rp->data.p = buf;
  160. rp->data.count = nbytes;
  161. rp->data.write = 1;
  162. m = SRrequest(rp);
  163. if(m < 0)
  164. return -1;
  165. rp->offset += n;
  166. return m;
  167. }
  168. long
  169. SRmload(ScsiReq *rp, uchar code)
  170. {
  171. uchar cmd[12];
  172. memset(cmd, 0, sizeof(cmd));
  173. cmd[0] = ScmdMload;
  174. cmd[8] = code;
  175. rp->cmd.p = cmd;
  176. rp->cmd.count = sizeof(cmd);
  177. rp->data.p = cmd;
  178. rp->data.count = 0;
  179. rp->data.write = 1;
  180. return SRrequest(rp);
  181. }
  182. long
  183. SRfixation(ScsiReq *rp, uchar type)
  184. {
  185. uchar cmd[10];
  186. memset(cmd, 0, sizeof(cmd));
  187. cmd[0] = ScmdFixation;
  188. cmd[8] = type;
  189. rp->cmd.p = cmd;
  190. rp->cmd.count = sizeof(cmd);
  191. rp->data.p = cmd;
  192. rp->data.count = 0;
  193. rp->data.write = 1;
  194. return SRrequest(rp);
  195. }