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

SCSI/ASPI

开发平台:

MultiPlatform

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