📄 scsi-unixware.c
字号:
/* Open pass-through device node */ if ((fd = open(dname, O_RDONLY)) < 0) { if (scgp->errstr) js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE, "can not open pass-through %s", dname); return (-1); } sdidevs[s][t][l].fd = fd; sdidevs[s][t][l].open = 1; nopen++; scglocal(scgp)->scgfiles[s][t][l] = (short) fd; if (scgp->debug) { printf("s = %d, t = %d, l = %d, dev = %s, fd = %d\n", s, t, l, sdidevs[s][t][l].devn, sdidevs[s][t][l].fd ); } } } } return (nopen);}EXPORT intscsi_open(scgp, device, busno, tgt, tlun) SCSI *scgp; char *device; int busno; int tgt; int tlun;{ int c, b, t; 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 (scgp->local == NULL) { scgp->local = malloc(sizeof(struct scg_local)); if (scgp->local == NULL) return (0); for (c = 0; c < MAX_SCG; c++) { for (b = 0; b < MAX_TGT; b++) { for (t = 0; t < MAX_LUN ; t++) scglocal(scgp)->scgfiles[c][b][t] = (short)-1; } } } memset(sdidevs, 0, sizeof(sdidevs)); /* init tmp_structure */ if (*device != '\0') { /* we don't allow old dev usage */ errno = EINVAL; if (scgp->errstr) js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE, "Open by 'devname' no longer supported on this OS"); return (-1); } else { /* this is the new stuff */ /* it will do the initialisation */ /* and return the number of */ /* detected devices to be used */ /* with the new addressing */ /* scheme. */ return (unixware_init(scgp)); }}EXPORT intscsi_close(scgp) SCSI *scgp;{ register int f; register int b; register int t; register int l; if (scgp->local == NULL) return (-1); for (b=0; b < MAX_SCG; b++) { for (t=0; t < MAX_TGT; t++) { for (l=0; l < MAX_LUN ; l++) { f = scglocal(scgp)->scgfiles[b][t][l]; if (f >= 0) close(f); sdidevs[b][t][l].fd = -1; sdidevs[b][t][l].open = 0; sdidevs[b][t][l].valid = 0; scglocal(scgp)->scgfiles[b][t][l] = (short)-1; } } } return (0);}LOCAL longscsi_maxdma(scgp, amt) SCSI *scgp; long amt;{ return (MAX_DMA);}EXPORT void *scsi_getbuf(scgp, amt) SCSI *scgp; long amt;{ if (amt <= 0 || amt > scsi_bufsize(scgp, amt)) return ((void *)0); if (scgp->debug) printf("scsi_getbuf: %ld bytes\n", amt); scgp->bufbase = (void *) valloc((size_t)(amt)); return (scgp->bufbase);}EXPORT voidscsi_freebuf(scgp) SCSI *scgp;{ if (scgp->bufbase) free(scgp->bufbase); 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); if (scgp->local == NULL) return (FALSE); for (t=0; t < MAX_TGT; t++) { for (l=0; l < MAX_LUN ; l++) if (scglocal(scgp)->scgfiles[busno][t][l] >= 0) return (TRUE); } return (FALSE);}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); if (scgp->local == NULL) return (-1); return ((int)scglocal(scgp)->scgfiles[busno][tgt][tlun]);}EXPORT intscsi_initiator_id(scgp) SCSI *scgp;{ register int t; register int l; register int busno; busno = scgp->scsibus; if (busno < 0 || busno >= MAX_SCG) return (FALSE); for (t=0; t < MAX_TGT; t++) { for (l=0; l < MAX_LUN ; l++) if (sdidevs[busno][t][l].initiator == 1){ if (scgp->debug) printf("scsi_initiator_id: id = %d\n", t); return (t); } } return (-1);}EXPORTint scsi_isatapi(scgp) SCSI *scgp;{ /* if the new address method is used we know if this is ATAPI*/ return (sdidevs[scgp->scsibus][scgp->target][scgp->lun].atapi);}EXPORTint scsireset(scgp) SCSI *scgp;{ return(-1);}LOCAL intdo_scsi_cmd(scgp, fd, sp) SCSI *scgp; int fd; struct scg_cmd *sp;{ int ret; int i; struct sb scsi_cmd; struct scb *scbp; memset(&scsi_cmd, 0, sizeof(scsi_cmd)); scsi_cmd.sb_type = ISCB_TYPE; scbp = &scsi_cmd.SCB; scbp->sc_cmdpt = (caddr_t) sp->cdb.cmd_cdb; scbp->sc_cmdsz = sp->cdb_len; scbp->sc_datapt = sp->addr; scbp->sc_datasz = sp->size; if (!(sp->flags & SCG_RECV_DATA) && (sp->size > 0)) scbp->sc_mode = SCB_WRITE; else scbp->sc_mode = SCB_READ; scbp->sc_time = sp->timeout; errno = 0; for (;;) { if ((ret = ioctl(fd, SDI_SEND, &scsi_cmd)) < 0) { if (errno == EAGAIN){ sleep(1); continue; } sp->ux_errno = errno; if (errno == 0) sp->ux_errno = EIO; sp->error = SCG_RETRYABLE; return (ret); } break; } memset(&sp->u_scb.Scb, 0, sizeof(sp->u_scb.Scb)); sp->u_scb.cmd_scb[0] = scbp->sc_status; sp->resid = scbp->sc_resid; sp->ux_errno = errno; return (0);}LOCAL intdo_scsi_sense(scgp, fd, sp) SCSI *scgp; int fd; struct scg_cmd *sp;{ int ret; struct scg_cmd s_cmd; if (sp->sense_len > SCG_MAX_SENSE) sp->sense_len = SCG_MAX_SENSE; memset((caddr_t)&s_cmd, 0, sizeof(s_cmd)); s_cmd.addr = (caddr_t) sp->u_sense.cmd_sense; s_cmd.size = sp->sense_len; s_cmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA; s_cmd.cdb_len = SC_G0_CDBLEN; s_cmd.sense_len = CCS_SENSE_LEN; s_cmd.target = scgp->target; s_cmd.cdb.g0_cdb.cmd = SC_REQUEST_SENSE; s_cmd.cdb.g0_cdb.lun = sp->cdb.g0_cdb.lun; s_cmd.cdb.g0_cdb.count = sp->sense_len; ret = do_scsi_cmd(scgp, fd, &s_cmd); if (ret < 0) return (ret); sp->sense_count = sp->sense_len - s_cmd.resid; return (ret);}LOCAL intscsi_send(scgp, fd, sp) SCSI *scgp; int fd; struct scg_cmd *sp;{ int ret; if ( fd < 0 ) { sp->error = SCG_FATAL; return (0); } else { ret = do_scsi_cmd(scgp, fd, sp); if (ret < 0) return (ret); if (sp->u_scb.cmd_scb[0] & S_CKCON) ret = do_scsi_sense(scgp, fd, sp); return (ret); }}#define sense u_sense.Sense#undef SC_PARITY#define SC_PARITY 0x09#define scb u_scb.Scb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -