cdr.c 4.3 KB

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