📄 scsi-openserver.c
字号:
} /* find root disk controller to make it scg 0 */ for (l = 0; l < nlm; l++) if (strcmp(cmtbl[l].dev, DEV_ROOT) == 0) t = l; if (scgp->debug) { printf("root = %5s(%d,%d,%d,%d) -> %s\n", cmtbl[t].drv, cmtbl[t].hba, cmtbl[t].bus, cmtbl[t].tgt, cmtbl[t].lun, cmtbl[t].dev); printf("-------------------- \n"); } /* calculate scg from drv, hba and bus */ strcpy(drvid, ""); for (l = 0, s = t; l < nlm; l++, s = (t + l) % nlm) { if (strcmp(drvid, cmtbl[s].drv) != 0) { strcpy(drvid, cmtbl[s].drv); lhba = cmtbl[s].hba; lbus = cmtbl[s].bus; cmtbl[s].scg = ++nscg; } else if (cmtbl[s].hba != lhba) { lhba = cmtbl[s].hba; lbus = cmtbl[s].bus; cmtbl[s].scg = ++nscg; } else if (cmtbl[s].bus != lbus) { lbus = cmtbl[s].bus; cmtbl[s].scg = ++nscg; } else { cmtbl[s].scg = nscg; } sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].valid = 1; sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].open = 0; if (strcmp(cmtbl[s].drv, DRV_ATAPI) == 0) sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].atapi = 1; sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].lmscsi = s; } /* open all device nodes */ for (s = 0; s < MAX_SCG; s++) { for (t = 0; t < MAX_TGT; t++) { for (l = 0; l < MAX_LUN ; l++) { if ( sdidevs[s][t][l].valid == 0) continue; /* Open pass-through device node */ mscsi = sdidevs[s][t][l].lmscsi; strcpy(dname, cmtbl[mscsi].dev); /* ------------------------------------------------------------------ ** NOTE: If we can't open the device, we will set the device invalid! ** ------------------------------------------------------------------ */ if ((fd = open(dname, O_RDONLY | O_NONBLOCK)) < 0) { sdidevs[s][t][l].valid = 0; continue; } if (scgp->debug) { printf("%d,%d,%d => %5s(%d,%d,%d,%d) -> %d : %s \n", s, t, l, cmtbl[mscsi].drv, cmtbl[mscsi].hba, cmtbl[mscsi].bus, cmtbl[mscsi].tgt, cmtbl[mscsi].lun, cmtbl[mscsi].scg, cmtbl[mscsi].dev); } 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("-------------------- \n"); printf("nopen = %d devices \n", nopen); printf("-------------------- \n"); } return (nopen);}EXPORT intscsi_open(scgp, device, busno, tgt, tlun) SCSI *scgp; char *device; int busno; int tgt; int tlun;{ int f, b, t, l; int nopen = 0; char devname[64]; 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 (b = 0; b < MAX_SCG; b++) { for (t = 0; t < MAX_TGT; t++) { for (l = 0; l < MAX_LUN ; l++) scglocal(scgp)->scgfiles[b][t][l] = (short)-1; } } } 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); } return ( openserver_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 = 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;{ return (-1); /* We don't know the initiator ID yet, but we can if we parse the ** output of the command 'cat /dev/string/cfg | grep "%adapter"' ** ** Sample line: ** ** %adapter 0xE800-0xE8FF 11 - type=alad ha=0 bus=0 id=7 fts=sto ** ** This tells us that the alad controller 0 has an id of 7 ! ** The parsing should be done in openserver_init(). ** */}EXPORTint scsi_isatapi(scgp) SCSI *scgp;{ return (sdidevs[scgp->scsibus][scgp->target][scgp->lun].atapi);}EXPORTint scsireset(scgp) SCSI *scgp;{ return(-1); /* no scsi reset available */}LOCAL voidcp_scg2sco(sco, scg) struct scsicmd2 *sco; struct scg_cmd *scg;{ sco->cmd.data_ptr = (char *) scg->addr; sco->cmd.data_len = scg->size; sco->cmd.cdb_len = scg->cdb_len; sco->sense_len = scg->sense_len; sco->sense_ptr = scg->u_sense.cmd_sense; if (!(scg->flags & SCG_RECV_DATA) && (scg->size > 0)) sco->cmd.is_write = 1; if (scg->cdb_len == SC_G0_CDBLEN ) memcpy(sco->cmd.cdb, &scg->cdb.g0_cdb, scg->cdb_len); if (scg->cdb_len == SC_G1_CDBLEN ) memcpy(sco->cmd.cdb, &scg->cdb.g1_cdb, scg->cdb_len); if (scg->cdb_len == SC_G5_CDBLEN ) memcpy(sco->cmd.cdb, &scg->cdb.g5_cdb, scg->cdb_len);}LOCAL voidcp_sco2scg(sco, scg) struct scsicmd2 *sco; struct scg_cmd *scg;{ scg->size = sco->cmd.data_len; memset(&scg->scb, 0, sizeof(scg->scb)); if (sco->sense_len > SCG_MAX_SENSE) scg->sense_count = SCG_MAX_SENSE; else scg->sense_count = sco->sense_len; scg->resid = 0; scg->u_scb.cmd_scb[0] = sco->cmd.target_sts;}LOCAL intscsi_send(scgp, fd, sp) SCSI *scgp; int fd; struct scg_cmd *sp;{ struct scsicmd2 scsi_cmd; int i; u_char sense_buf[SCG_MAX_SENSE]; if ( fd < 0 ) { sp->error = SCG_FATAL; return (0); } memset(&scsi_cmd, 0, sizeof(scsi_cmd)); memset(sense_buf, 0, sizeof(sense_buf)); scsi_cmd.sense_ptr = sense_buf; scsi_cmd.sense_len = sizeof(sense_buf); cp_scg2sco(&scsi_cmd, sp); errno = 0; for (;;) { int ioctlStatus; if ((ioctlStatus = ioctl(fd, SCSIUSERCMD2, &scsi_cmd)) < 0) { if (errno == EINTR) continue; cp_sco2scg(&scsi_cmd, sp); sp->ux_errno = errno; if (errno == 0) sp->ux_errno = EIO; sp->error = SCG_RETRYABLE; return (0); } break; } cp_sco2scg(&scsi_cmd, sp); sp->ux_errno = errno; if (scsi_cmd.cmd.target_sts & 0x02) { if (errno == 0) sp->ux_errno = EIO; sp->error = SCG_RETRYABLE; } else { sp->error = SCG_NO_ERROR; } return 0;}#define sense u_sense.Sense
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -