|
|
1.1 ! root 1: #include "scsi.h" ! 2: ! 3: #define DEV "/dev/scsi" ! 4: ! 5: int scsi_fd; ! 6: int scsi_id; ! 7: int scsi_verbose; ! 8: ! 9: scsiinit(complain) ! 10: { ! 11: if((scsi_fd = open(DEV, 2)) < 0){ ! 12: if(complain) ! 13: perror(DEV); ! 14: return(1); ! 15: } ! 16: return(0); ! 17: } ! 18: ! 19: scsiid(id) ! 20: { ! 21: scsi_id = id; ! 22: } ! 23: ! 24: scsiclro(o) ! 25: register struct scsi_o *o; ! 26: { ! 27: extern char *memset(); ! 28: memset((char *)o, 0xDD, sizeof(*o)); ! 29: } ! 30: ! 31: scsireg(fd, csr, per) ! 32: { ! 33: char buf[256]; ! 34: extern char *strcat(); ! 35: ! 36: #define add(x) strcat(buf, x) ! 37: ! 38: buf[0] = 0; ! 39: if(csr&CSR_DONE) add(", i/o done"); ! 40: if(csr&CSR_ERROR) add(", error"); ! 41: if(csr&CSR_R) add(", request active"); ! 42: if(csr&CSR_M) add(", message active"); ! 43: if(csr&CSR_I) add(", i/o active"); ! 44: if(csr&CSR_C) add(", c/d active"); ! 45: if(csr&CSR_S) add(", select active"); ! 46: if(csr&CSR_B) add(", busy active"); ! 47: if(buf[0] == 0) ! 48: fprint(fd, "CSR: zero"); ! 49: else { ! 50: fprint(fd, "CSR:%s", &buf[1]); ! 51: if(csr&!CSR_BITS) ! 52: fprint(fd, " BAD BITS SET 0x%ux", csr&!CSR_BITS); ! 53: } ! 54: fprint(fd, "; "); ! 55: buf[0] = 0; ! 56: if(per&PER_CHECK) add(", check status"); ! 57: if(per&PER_DRBUSY) add(", drive busy"); ! 58: if(per&PER_SBUSY) add(", busy timeout"); ! 59: if(per&PER_SELECT) add(", select timeout"); ! 60: if(buf[0] == 0) ! 61: fprint(fd, "PER: zero\n"); ! 62: else ! 63: fprint(fd, "PER:%s\n", &buf[1]); ! 64: } ! 65: ! 66: static char *smsg[16] = ! 67: { ! 68: "good", "check", "met/good", "reserved", "busy", "reserved", ! 69: "reserved", "reserved", "intermediate good", "reserved", "intermediate good/met", ! 70: "reserved", "reservation conflict", "reserved", "reserved", "reserved", ! 71: }; ! 72: ! 73: scsidump(o) ! 74: register struct scsi_o *o; ! 75: { ! 76: extern char *exstab[]; ! 77: ! 78: Fprint(1, "csr=0x%uhx per=0x%uhx status=0x%uhx(%s) 0x%uhx 0x%uhx\n", o->csr, ! 79: o->per, o->status[0], smsg[(o->status[0]>>1)&0xF], o->status[1], ! 80: o->status[2]); ! 81: Fprint(1, "data=0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", o->data[0], ! 82: o->data[1], o->data[2], o->data[3], o->data[4], o->data[5], ! 83: o->data[6], o->data[7], o->data[8], o->data[9], o->data[10], ! 84: o->data[11]); ! 85: if(o->data[0] == 0x70) ! 86: Fprint(1, " (extended sense: %s)", exstab[o->data[2]&0xF]); ! 87: Fprint(1, "\n"); ! 88: } ! 89: ! 90: scsiio(i, o, nn, str) ! 91: struct scsi_i *i; ! 92: struct scsi_o *o; ! 93: char *str; ! 94: { ! 95: int n; ! 96: ! 97: if((n = write(scsi_fd, (char *)i, N(nn))) != N(nn)){ ! 98: fprint(2, "%s: wrote %d, really wrote %d\n", str, N(nn), n); ! 99: perror("write"); ! 100: return(1); ! 101: } ! 102: scsiclro(o); ! 103: n = read(scsi_fd, (char *)o, sizeof *o); ! 104: if(n < 0){ ! 105: perror(str); ! 106: scsireg(2, o->csr, o->per); ! 107: return(1); ! 108: } ! 109: return(n); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.