📄 scsi-os2.c
字号:
printf("SRBlock.ha_status: 0x%x, SRBlock.target_status: 0x%x, SRBlock.satus: 0x%x\n", SRBlock.u.cmd.ha_status, SRBlock.u.cmd.target_status, SRBlock.status);#endif return (0);}/* * Set error flags */LOCAL voidset_error(srb, sp) SRB *srb; struct scg_cmd *sp;{ switch (srb->status) { case SRB_InvalidCmd: /* 0x80 Invalid SCSI request */ case SRB_InvalidHA: /* 0x81 Invalid host adapter number */ case SRB_BadDevice: /* 0x82 SCSI device not installed */ sp->error = SCG_FATAL; sp->ux_errno = EINVAL; break; case SRB_Busy: /* 0x00 SCSI request in progress */ case SRB_Aborted: /* 0x02 SCSI aborted by host */ case SRB_BadAbort: /* 0x03 Unable to abort SCSI request */ case SRB_Error: /* 0x04 SCSI request completed with error */ default: sp->error = SCG_RETRYABLE; sp->ux_errno = EIO; break; }}LOCAL intscsi_send(scgp, f, sp) SCSI *scgp; int f; struct scg_cmd *sp;{ ULONG rc; /* return value */static SRB SRBlock; /* XXX makes it non reentrant */ Ulong cbreturn; Ulong cbParam; UCHAR* ptr; if (!f) { /* Set in scsi_open() */ sp->error = SCG_FATAL; return (-1); } if (sp->cdb_len > sizeof(SRBlock.u.cmd.cdb_st)) { /* commandsize too big */ sp->error = SCG_FATAL; sp->ux_errno = EINVAL; fprintf(stderr, "sp->cdb_len > SRBlock.u.cmd.cdb_st. Fatal error in scsi_send, exiting...\n"); return (-1); } /* clear command block */ fillbytes((caddr_t)&SRBlock.u.cmd.cdb_st, sizeof(SRBlock.u.cmd.cdb_st), '\0'); /* copy cdrecord command into SRB */ movebytes(&sp->cdb, &SRBlock.u.cmd.cdb_st, sp->cdb_len); /* Build SRB command block */ SRBlock.cmd = SRB_Command; SRBlock.ha_num = scgp->scsibus; /* host adapter number */ SRBlock.flags = SRB_Post; /* flags */ SRBlock.u.cmd.target = scgp->target; /* Target SCSI ID */ SRBlock.u.cmd.lun = scgp->lun; /* Target SCSI LUN */ SRBlock.u.cmd.data_len = sp->size; /* # of bytes transferred */ SRBlock.u.cmd.data_ptr = 0; /* pointer to data buffer */ SRBlock.u.cmd.sense_len = sp->sense_len;/* length of sense buffer */ SRBlock.u.cmd.link_ptr = 0; /* pointer to next SRB */ SRBlock.u.cmd.cdb_len = sp->cdb_len; /* SCSI command length */ /* Specify direction */ if (sp->flags & SCG_RECV_DATA) { SRBlock.flags |= SRB_Read; } else { if (sp->size > 0) { SRBlock.flags |= SRB_Write; if (scgp->bufbase != sp->addr) {/* Copy only if data not in ASPI-Mem */ movebytes(sp->addr, scgp->bufbase, sp->size); } } else { SRBlock.flags |= SRB_NoTransfer; } } sp->error = SCG_NO_ERROR; sp->sense_count = 0; sp->u_scb.cmd_scb[0] = 0; sp->resid = 0; /* execute SCSI command */ rc = DosDevIOCtl(driver_handle, 0x92, 0x02, (void*) &SRBlock, sizeof(SRB), &cbParam, (void*) &SRBlock, sizeof(SRB), &cbreturn); if (rc) { /* An error occured */ fprintf(stderr, "DosDevIOCtl() in sendCommand failed.\n"); sp->error = SCG_FATAL; sp->ux_errno = EIO; /* Sp鋞er vielleicht errno einsetzen */ return (rc); } else { /* Wait until the command is processed */ rc = wait_post(sp->timeout*1000); if (rc) { /* An error occured */ if (rc == 640) { /* Timeout */ sp->error = SCG_TIMEOUT; sp->ux_errno = EIO; fprintf(stderr, "Timeout during SCSI-Command.\n"); return (1); } sp->error = SCG_FATAL; sp->ux_errno = EIO; fprintf(stderr, "Fatal Error during DosWaitEventSem().\n"); return (1); } /* The command is processed */ if (SRBlock.status == SRB_Done) { /* succesful completion */#ifdef DEBUG printf("Command successful finished. SRBlock.status=0x%x\n\n", SRBlock.status);#endif sp->sense_count = 0; sp->resid = 0; if (sp->flags & SCG_RECV_DATA) { /* We read data */ if (sp->addr && sp->size) { if (scgp->bufbase != sp->addr) /* Copy only if data not in ASPI-Mem */ movebytes(scgp->bufbase, sp->addr, SRBlock.u.cmd.data_len); ptr = (UCHAR*)sp->addr; sp->resid = sp->size - SRBlock.u.cmd.data_len;/*nicht 黚ertragene bytes. Korrekt berechnet???*/ } } /* end of if (sp->flags & SCG_RECV_DATA) */ if (SRBlock.u.cmd.target_status == SRB_CheckStatus) { /* Sense data valid */ sp->sense_count = (int)SRBlock.u.cmd.sense_len; if (sp->sense_count > sp->sense_len) sp->sense_count = sp->sense_len; ptr = (UCHAR*)&SRBlock.u.cmd.cdb_st; ptr += SRBlock.u.cmd.cdb_len; fillbytes(&sp->u_sense.Sense, sizeof(sp->u_sense.Sense), '\0'); movebytes(ptr, &sp->u_sense.Sense, sp->sense_len); sp->u_scb.cmd_scb[0] = SRBlock.u.cmd.target_status; sp->ux_errno = EIO; /* Sp鋞er differenzieren? */ } return (0); } /* SCSI-Error occured */ set_error(&SRBlock, sp); if (SRBlock.u.cmd.target_status == SRB_CheckStatus) { /* Sense data valid */ sp->sense_count = (int)SRBlock.u.cmd.sense_len; if (sp->sense_count > sp->sense_len) sp->sense_count = sp->sense_len; ptr = (UCHAR*)&SRBlock.u.cmd.cdb_st; ptr += SRBlock.u.cmd.cdb_len; fillbytes(&sp->u_sense.Sense, sizeof(sp->u_sense.Sense), '\0'); movebytes(ptr, &sp->u_sense.Sense, sp->sense_len); sp->u_scb.cmd_scb[0] = SRBlock.u.cmd.target_status; } if (sp->flags & SCG_RECV_DATA) { if (sp->addr && sp->size) { if (scgp->bufbase != sp->addr) /* Copy only if data not in ASPI-Mem */ movebytes(scgp->bufbase, sp->addr, SRBlock.u.cmd.data_len); } }#ifdef really sp->resid = SRBlock.u.cmd.data_len;/* XXXXX Got no Data ????? */#else sp->resid = sp->size - SRBlock.u.cmd.data_len;#endif return (1); }}/*************************************************************************** * * * BOOL open_driver() * * * * Opens the ASPI Router device driver and sets device_handle. * * Returns: * * TRUE - Success * * FALSE - Unsuccessful opening of device driver * * * * Preconditions: ASPI Router driver has be loaded * * * ***************************************************************************/LOCAL BOOLopen_driver(){ ULONG rc; /* return value */ ULONG ActionTaken; /* return value */ USHORT openSemaReturn; /* return value */ ULONG cbreturn; ULONG cbParam; if (driver_handle) /* ASPI-Router already opened */ return (TRUE); rc = DosOpen((PSZ) "aspirou$", /* open driver*/ &driver_handle, &ActionTaken, 0, 0, FILE_OPEN, OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, NULL); if (rc) { fprintf(stderr, "Cannot open ASPI-Router!\n"); return (FALSE); /* opening failed -> return false*/ } /* Init semaphore */ if (DosCreateEventSem(NULL, &postSema, /* create event semaphore */ DC_SEM_SHARED, 0)) { DosClose(driver_handle); fprintf(stderr, "Cannot create event semaphore!\n"); return (FALSE); } rc = DosDevIOCtl(driver_handle, 0x92, 0x03, /* pass semaphore handle */ (void*) &postSema, sizeof(HEV), /* to driver */ &cbParam, (void*) &openSemaReturn, sizeof(USHORT), &cbreturn); if (rc||openSemaReturn) { /* Error */ DosCloseEventSem(postSema); DosClose(driver_handle); return (FALSE); } return (TRUE);}/*************************************************************************** * * * BOOL close_driver() * * * * Closes the device driver * * Returns: * * TRUE - Success * * FALSE - Unsuccessful closing of device driver * * * * Preconditions: ASPI Router driver has be opened with open_driver * * * ***************************************************************************/LOCAL BOOLclose_driver(){ ULONG rc; /* return value */ if (driver_handle) { rc = DosClose(driver_handle); if (rc) return (FALSE); /* closing failed -> return false */ driver_handle = 0; if (DosCloseEventSem(postSema)) fprintf(stderr, "Cannot close event semaphore!\n"); if (buffer && DosFreeMem(buffer)) fprintf(stderr, "Cannot free buffer memory for ASPI-Router!\n"); /* Free our memory buffer if not already done */ buffer = NULL; } return (TRUE);}LOCAL ULONGwait_post(ULONG ulTimeOut){ ULONG count = 0; ULONG rc; /* return value *//* rc = DosWaitEventSem(postSema, -1);*/ /* wait forever*/ rc = DosWaitEventSem(postSema, ulTimeOut); DosResetEventSem(postSema, &count); return (rc);}LOCAL BOOL init_buffer(mem) void *mem;{ ULONG rc; /* return value */ USHORT lockSegmentReturn; /* return value */ Ulong cbreturn; Ulong cbParam; rc = DosDevIOCtl(driver_handle, 0x92, 0x04, /* pass buffers pointer */ (void*) mem, sizeof(void*), /* to driver */ &cbParam, (void*) &lockSegmentReturn, sizeof(USHORT), &cbreturn); if (rc) return (FALSE); /* DosDevIOCtl failed */ if (lockSegmentReturn) return (FALSE); /* Driver could not lock segment */ return (TRUE);}#define sense u_sense.Sense
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -