📄 scsi-os2.c
字号:
/* @(#)scsi-os2.c 1.12 99/11/27 Copyright 1998 J. Schilling, C. Wohlgemuth */#ifndef lintstatic char __sccsid[] = "@(#)scsi-os2.c 1.12 99/11/27 Copyright 1998 J. Schilling, C. Wohlgemuth";#endif/* * Interface for the OS/2 ASPI-Router ASPIROUT.SYS ((c) D. Dorau). * This additional driver is a prerequisite for using cdrecord. * Get it from HOBBES or LEO. * * Warning: you may change this source, but if you do that * you need to change the _scg_version and _scg_auth* string below. * You may not return "schily" for an SCG_AUTHOR request anymore. * Choose your name instead of "schily" and make clear that the version * string is related to a modified source. * * XXX it currently uses static SRB and for this reason is not reentrant * * Copyright (c) 1998 J. Schilling * Copyright (c) 1998 C. Wohlgemuth for this interface. *//* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */#undef sense/*#define DEBUG*//* For AspiRouter */#include "scg/srb_os2.h"/* * Warning: you may change this source, but if you do that * you need to change the _scg_version and _scg_auth* string below. * You may not return "schily" for an SCG_AUTHOR request anymore. * Choose your name instead of "schily" and make clear that the version * string is related to a modified source. */LOCAL char _scg_trans_version[] = "scsi-os2.c-1.12"; /* The version for this transport*/#define FILE_OPEN 0x0001#define OPEN_SHARE_DENYREADWRITE 0x0010#define OPEN_ACCESS_READWRITE 0x0002#define DC_SEM_SHARED 0x01#define OBJ_TILE 0x0040#define PAG_READ 0x0001#define PAG_WRITE 0x0002#define PAG_COMMIT 0x0010typedef unsigned long LHANDLE;typedef unsigned long ULONG;typedef unsigned char *PSZ;typedef unsigned short USHORT;typedef unsigned char UCHAR;typedef LHANDLE HFILE;typedef ULONG HEV;#define MAX_SCG 16 /* Max # of SCSI controllers */#define MAX_TGT 16#define MAX_LUN 8struct scg_local { int dummy;};#define scglocal(p) ((struct scg_local *)((p)->local)) #define MAX_DMA_OS2 (63*1024) /* ASPI-Router allows up to 64k */LOCAL void *buffer = NULL;LOCAL HFILE driver_handle = 0;LOCAL HEV postSema = 0;LOCAL BOOL open_driver __PR((void));LOCAL BOOL close_driver __PR((void));LOCAL ULONG wait_post __PR((ULONG ulTimeOut));LOCAL BOOL init_buffer __PR((void* mem));EXPORT void exit_func __PR((void));LOCAL void set_error __PR((SRB *srb, struct scg_cmd *sp));EXPORT voidexit_func(){ if (!close_driver()) fprintf(stderr, "Cannot close OS/2-ASPI-Router!\n");}/* * Return version information for the low level SCSI transport code. * This has been introduced to make it easier to trace down problems * in applications. */EXPORT char *scg__version(scgp, what) SCSI *scgp; int what;{ if (scgp != (SCSI *)0) { switch (what) { case SCG_VERSION: return (_scg_trans_version); /* * If you changed this source, you are not allowed to * return "schily" for the SCG_AUTHOR request. */ case SCG_AUTHOR: return (_scg_auth_schily); case SCG_SCCS_ID: return (__sccsid); } } return ((char *)0);}EXPORT intscsi_open(scgp, device, busno, tgt, tlun) SCSI *scgp; char *device; int busno; int tgt; int tlun;{ if (busno >= MAX_SCG || tgt >= MAX_TGT || tlun >= MAX_LUN) { errno = EINVAL; if (scgp->errstr) js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE, "Illegal value for busno, target or lun '%d,%d,%d'", busno, tgt, tlun); return (-1); } if ((device != NULL && *device != '\0') || (busno == -2 && tgt == -2)) { errno = EINVAL; if (scgp->errstr) js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE, "Open by 'devname' not supported on this OS"); return (-1); } if (scgp->local == NULL) { scgp->local = malloc(sizeof(struct scg_local)); if (scgp->local == NULL) return (0); } if (!open_driver()) /* Try to open ASPI-Router */ return (-1); atexit(exit_func); /* Install Exit Function which closes the ASPI-Router */ /* * Success after all */ return (1);}EXPORT intscsi_close(scgp) SCSI *scgp;{ exit_func(); return (0);}LOCAL longscsi_maxdma(scgp) SCSI *scgp;{ long maxdma = MAX_DMA_OS2; return (maxdma);}EXPORT void *scsi_getbuf(scgp, amt) SCSI *scgp; long amt;{ ULONG rc; if (amt <= 0 || amt > scsi_maxdma(scgp)) return ((void *)0);#ifdef DEBUG printf("scsi_getbuf: %ld bytes\n", amt);#endif rc = DosAllocMem(&buffer, amt, OBJ_TILE | PAG_READ | PAG_WRITE | PAG_COMMIT); if (rc) { fprintf(stderr, "Cannot allocate buffer.\n"); return ((void *)0); } scgp->bufbase = buffer;#ifdef DEBUG printf("Buffer allocated at: 0x%x\n", scgp->bufbase);#endif /* Lock memory */ if (init_buffer(scgp->bufbase)) return (scgp->bufbase); fprintf(stderr, "Cannot lock memory buffer.\n"); return ((void *)0); /* Error */}EXPORT voidscsi_freebuf(scgp) SCSI *scgp;{ if (scgp->bufbase && DosFreeMem(scgp->bufbase)) fprintf(stderr, "Cannot free buffer memory for ASPI-Router!\n"); /* Free our memory buffer if not already done */ if (buffer == scgp->bufbase) buffer = NULL; scgp->bufbase = NULL;}EXPORTBOOL scsi_havebus(scgp, busno) SCSI *scgp; int busno;{ register int t; register int l; if (busno < 0 || busno >= MAX_SCG) return (FALSE); return (TRUE);}EXPORTint scsi_fileno(scgp, busno, tgt, tlun) SCSI *scgp; int busno; int tgt; int tlun;{ if (busno < 0 || busno >= MAX_SCG || tgt < 0 || tgt >= MAX_TGT || tlun < 0 || tlun >= MAX_LUN) return (-1); /* * Return fake */ return (1);}EXPORT intscsi_initiator_id(scgp) SCSI *scgp;{ return (-1);}EXPORT intscsi_isatapi(scgp) SCSI *scgp;{ return (FALSE);}EXPORTint scsireset(scgp) SCSI *scgp;{ ULONG rc; /* return value */ ULONG cbreturn; ULONG cbParam; BOOL success;static SRB SRBlock; /* XXX makes it non reentrant */ SRBlock.cmd = SRB_Reset; /* reset device */ SRBlock.ha_num = scgp->scsibus;/* host adapter number */ SRBlock.flags = SRB_Post; /* posting enabled */ SRBlock.u.res.target = scgp->target; /* target id */ SRBlock.u.res.lun = scgp->lun; /* target LUN */ rc = DosDevIOCtl(driver_handle, 0x92, 0x02, (void*) &SRBlock, sizeof(SRB), &cbParam, (void*) &SRBlock, sizeof(SRB), &cbreturn); if (rc) { fprintf(stderr, "DosDevIOCtl() failed in resetDevice.\n"); return (1); /* DosDevIOCtl failed */ } else { success = wait_post(40000); /** wait for SRB being processed */ if (success) return (2); } if (SRBlock.status != SRB_Done) return (3);#ifdef DEBUG printf("resetDevice of host: %d target: %d lun: %d successful.\n", scgp->scsibus, scgp->target, scgp->lun);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -