scsi-beos.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:7k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)scsi-beos.c 1.7 99/09/07 Copyright 1998 J. Schilling */
  2. #ifndef lint
  3. static char __sccsid[] =
  4. "@(#)scsi-beos.c 1.7 99/09/07 Copyright 1998 J. Schilling";
  5. #endif
  6. /*
  7.  * Interface for the BeOS user-land raw SCSI implementation.
  8.  *
  9.  * This is a hack, that tries to emulate the functionality
  10.  * of the scg driver.
  11.  *
  12.  * First version done by swetland@be.com
  13.  *
  14.  * Copyright (c) 1998 J. Schilling
  15.  */
  16. /*
  17.  * This program is free software; you can redistribute it and/or modify
  18.  * it under the terms of the GNU General Public License as published by
  19.  * the Free Software Foundation; either version 2, or (at your option)
  20.  * any later version.
  21.  *
  22.  * This program is distributed in the hope that it will be useful,
  23.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25.  * GNU General Public License for more details.
  26.  *
  27.  * You should have received a copy of the GNU General Public License
  28.  * along with this program; see the file COPYING.  If not, write to
  29.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  30.  */
  31. /* nasty hack to avoid broken def of bool in SupportDefs.h */
  32. #define _SUPPORT_DEFS_H
  33. #ifndef _SYS_TYPES_H
  34. typedef unsigned long ulong;
  35. typedef unsigned int uint;
  36. typedef unsigned short ushort;
  37. #endif /* _SYS_TYPES_H */
  38. #include <BeBuild.h>
  39. #include <sys/types.h>
  40. #include <Errors.h>
  41. /*-------------------------------------------------------------*/
  42. /*----- Shorthand type formats --------------------------------*/
  43. typedef signed char int8;
  44. typedef unsigned char uint8;
  45. typedef volatile signed char vint8;
  46. typedef volatile unsigned char vuint8;
  47. typedef short int16;
  48. typedef unsigned short uint16;
  49. typedef volatile short vint16;
  50. typedef volatile unsigned short vuint16;
  51. typedef long int32;
  52. typedef unsigned long uint32;
  53. typedef volatile long vint32;
  54. typedef volatile unsigned long vuint32;
  55. typedef long long int64;
  56. typedef unsigned long long uint64;
  57. typedef volatile long long vint64;
  58. typedef volatile unsigned long long vuint64;
  59. typedef volatile long vlong;
  60. typedef volatile int vint;
  61. typedef volatile short vshort;
  62. typedef volatile char vchar;
  63. typedef volatile unsigned long vulong;
  64. typedef volatile unsigned int vuint;
  65. typedef volatile unsigned short vushort;
  66. typedef volatile unsigned char vuchar;
  67. typedef unsigned char uchar;
  68. typedef unsigned short unichar;
  69. /*-------------------------------------------------------------*/
  70. /*----- Descriptive formats -----------------------------------*/
  71. typedef int32 status_t;
  72. typedef int64 bigtime_t;
  73. typedef uint32 type_code;
  74. typedef uint32 perform_code;
  75. /* end nasty hack */
  76. #include <stdlib.h>
  77. #include <stdio.h>
  78. #include <string.h>
  79. #include <unistd.h>
  80. #include <sys/stat.h>
  81. #include <scg/scgio.h>
  82. /* this is really really dumb (tm) */
  83. /*#undef sense*/
  84. /*#undef scb*/
  85. #include <device/scsi.h>
  86. #undef bool
  87. #include <drivers/CAM.h>
  88. struct _fdmap_ {
  89. struct _fdmap_ *next;
  90. int bus;
  91. int targ;
  92. int lun;
  93. int fd;
  94. };
  95. EXPORT int
  96. scsi_open(scgp, device, busno, tgt, tlun)
  97. SCSI *scgp;
  98. char *device;
  99. int busno;
  100. int tgt;
  101. int tlun;
  102. {
  103. #ifdef nonono
  104. if (busno >= MAX_SCG || tgt >= MAX_TGT || tlun >= MAX_LUN) {
  105. errno = EINVAL;
  106. if (scgp->errstr)
  107. js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE,
  108. "Illegal value for busno, target or lun '%d,%d,%d'",
  109. busno, tgt, tlun);
  110. return (-1);
  111. }
  112. #endif
  113. if ((device != NULL && *device != '') || (busno == -2 && tgt == -2)) {
  114. errno = EINVAL;
  115. if (scgp->errstr)
  116. js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE,
  117. "Open by 'devname' not supported on this OS");
  118. return (-1);
  119. }
  120. return (1);
  121. }
  122. EXPORT int
  123. scsi_close(scgp)
  124. SCSI *scgp;
  125. {
  126. struct _fdmap_ *f;
  127. struct _fdmap_ *fnext;
  128. for (f = (struct _fdmap_ *)scgp->local; f; f=fnext) {
  129. scgp->local = 0;
  130. fnext = f->next;
  131. close(f->fd);
  132. free(f);
  133. }
  134. return (0);
  135. }
  136. LOCAL long
  137. scsi_maxdma(scgp)
  138. SCSI *scgp;
  139. {
  140. return (256*1024);
  141. }
  142. EXPORT void *
  143. scsi_getbuf(scgp, amt)
  144. SCSI *scgp;
  145. long amt;
  146. {
  147. if (amt <= 0 || amt > scsi_maxdma(scgp))
  148. return ((void *)0);
  149. if (scgp->debug)
  150. printf("scsi_getbuf: %ld bytesn", amt);
  151. scgp->bufbase = malloc((size_t)(amt));
  152. return (scgp->bufbase);
  153. }
  154. EXPORT void
  155. scsi_freebuf(scgp)
  156. SCSI *scgp;
  157. {
  158. if (scgp->bufbase)
  159. free(scgp->bufbase);
  160. scgp->bufbase = NULL;
  161. }
  162. EXPORT BOOL
  163. scsi_havebus(scgp, busno)
  164. SCSI *scgp;
  165. int busno;
  166. {
  167. struct stat sb;
  168. char buf[128];
  169. if (busno < 8)
  170. sprintf(buf, "/dev/bus/scsi/%d", busno);
  171. else
  172. sprintf(buf, "/dev/disk/ide/atapi/%d", busno-8);
  173. if (stat(buf, &sb))
  174. return (FALSE);
  175. return (TRUE);
  176. }
  177. EXPORT int
  178. scsi_fileno(scgp, busno, tgt, tlun)
  179. SCSI *scgp;
  180. int busno;
  181. int tgt;
  182. int tlun;
  183. {
  184. struct _fdmap_ *f;
  185. char buf[128];
  186. int fd;
  187. for (f = (struct _fdmap_ *)scgp->local; f; f=fnext) {
  188. if (f->bus == busno && f->targ == tgt && f->lun == tlun)
  189. return (f->fd);
  190. }
  191. if (busno < 8) {
  192. sprintf(buf, "/dev/bus/scsi/%d/%d/%d/raw",
  193. busno, tgt, tlun);
  194. } else {
  195. char *tgtstr = (tgt == 0) ? "master" : (tgt == 1) ? "slave" : "dummy";
  196. sprintf(buf, "/dev/disk/ide/atapi/%d/%s/%d/raw",
  197. busno-8, tgtstr, tlun);
  198. }
  199. fd = open(buf, 0);
  200. if (fd >=0 ) {
  201. f = (struct _fdmap_ *) malloc(sizeof(struct _fdmap_));
  202. f->bus = busno;
  203. f->targ = tgt;
  204. f->lun = tlun;
  205. f->fd = fd;
  206. f->next = (struct _fdmap_ *)scgp->local;
  207. scp->local = f;
  208. }
  209. return (fd);
  210. }
  211. EXPORT int
  212. scsi_initiator_id(scgp)
  213. SCSI *scgp;
  214. {
  215. return (-1);
  216. }
  217. EXPORT int
  218. scsi_isatapi(scgp)
  219. SCSI *scgp;
  220. {
  221. /*
  222.  * XXX Should check for ATAPI
  223.  */
  224. return (-1);
  225. }
  226. EXPORT int
  227. scsireset(scgp)
  228. SCSI *scgp;
  229. {
  230. return (-1);
  231. }
  232. LOCAL int
  233. scsi_send(scgp, f, sp)
  234. SCSI *scgp;
  235. int f;
  236. struct scg_cmd *sp;
  237. {
  238. int e;
  239. int  scsi_error;
  240. int cam_error;
  241. raw_device_command rdc;
  242. if (f < 0) {
  243. sp->error = SCG_FATAL;
  244. return (0);
  245. }
  246. memcpy(rdc.command, &(sp->cdb), 12);
  247. rdc.command_length = sp->cdb_len;
  248. rdc.data = sp->addr;
  249. rdc.data_length = sp->size;
  250. rdc.sense_data_length = sp->sense_len;
  251. rdc.sense_data = sp->u_sense.cmd_sense;
  252. rdc.flags = sp->flags & SCG_RECV_DATA ? B_RAW_DEVICE_DATA_IN : 0;
  253. rdc.timeout = sp->timeout * 1000000;
  254. if (scgp->debug) {
  255. error("SEND(%d): cmd %02x, cdb = %d, data = %d, sense = %dn",
  256. f, rdc.command[0], rdc.command_length,
  257. rdc.data_length, rdc.sense_data_length);
  258. }
  259. e = ioctl(f, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc));
  260. sp->ux_errno = 0;
  261. if (!e) {
  262. cam_error = rdc.cam_status;
  263. scsi_error = rdc.scsi_status;
  264. if (scgp->debug)
  265. error("result: cam %02x scsi %02xn", cam_error, scsi_error);
  266. sp->u_scb.cmd_scb[0] = scsi_error;
  267. switch (cam_error) {
  268. case CAM_REQ_CMP:
  269. sp->resid = 0;
  270. sp->error = SCG_NO_ERROR;
  271. break;
  272. case CAM_REQ_CMP_ERR:
  273. sp->sense_count = sp->sense_len; /* XXX */
  274. sp->error = SCG_RETRYABLE;
  275. break;
  276. default:
  277. sp->error = SCG_FATAL;
  278. }
  279. } else {
  280. sp->error = SCG_FATAL;
  281. }
  282. return (0);
  283. }