|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <stdlib.h> ! 3: #include "../scsi.h" ! 4: #include "../scsish.h" ! 5: #include "../tcl.h" ! 6: #include "fns.h" ! 7: #include "../generic/fns.h" ! 8: #include "../jukeface.h" ! 9: #include <scsi.h> ! 10: ! 11: int ! 12: j_config(Jukebox *j, char *err) ! 13: { ! 14: struct scsi_cmd cmd; ! 15: struct scsi_return ret; ! 16: char buf[512]; ! 17: ! 18: j->nshelves = 50; ! 19: j->nluns = 8; ! 20: set6(cmd, 0x12, 0, 0, 0, 44, 0); ! 21: if(s_io(0, &cmd, 0, &ret, 44, err)) ! 22: return(-1); ! 23: switch(ret.data[37]) ! 24: { ! 25: case 1: j->ndrives = 1; break; ! 26: case 2: case 3: j->ndrives = 2; break; ! 27: default: j->ndrives = 0; break; ! 28: } ! 29: j->luns = (struct lun *)malloc(j->nluns * sizeof(struct lun)); ! 30: j->shelves = (char *)malloc(j->nshelves * sizeof(char)); ! 31: j->names = (char **)malloc(j->nshelves * sizeof(char *)); ! 32: ! 33: for(j->nworms = 0; j->nworms < j->nluns; j->nworms++){ ! 34: sprintf(buf, "/dev/worm%d", j->nworms); ! 35: if(access(buf, 0) < 0) ! 36: return(0); ! 37: } ! 38: return(0); ! 39: } ! 40: ! 41: extern j_drstatus(Jukebox *j, char *err) ! 42: { ! 43: struct scsi_return ret; ! 44: int i; ! 45: char *where[8]; ! 46: unsigned char *d; ! 47: ! 48: if(sony_istatus(&ret, err)) ! 49: return(-1); ! 50: for(i = 0; i < 8; i++) ! 51: where[i] = "shelf"; ! 52: d = &ret.data[100]; ! 53: if(*d&0x80) ! 54: where[*d&7] = "upper"; ! 55: d++; ! 56: if(*d&0x80) ! 57: where[*d&7] = "lower"; ! 58: d = &ret.data[16]; ! 59: for(i = 0; i < 8; i++, d += 4){ ! 60: j->luns[i].spunup = (d[0]&1) != 0; ! 61: j->luns[i].desc = "shelf"; ! 62: j->luns[i].shelf = -1; ! 63: j->luns[i].side = 0; ! 64: if(j->luns[i].occupied = (d[0]&0x40) != 0){ ! 65: if(d[1]&0x80){ ! 66: j->luns[i].desc = where[i]; ! 67: if(d[2]&0x80){ ! 68: j->luns[i].shelf = (d[2]&0x7F)/2; ! 69: j->luns[i].side = d[2]&1; ! 70: } ! 71: } else { ! 72: j->luns[i].shelf = (d[1]&0x7F)/2; ! 73: j->luns[i].side = d[1]&1; ! 74: } ! 75: j->shelves[j->luns[i].shelf] = 1; ! 76: } ! 77: } ! 78: return(0); ! 79: } ! 80: ! 81: extern j_shstatus(Jukebox *j, char *err) ! 82: { ! 83: struct scsi_return ret; ! 84: int i; ! 85: unsigned char *d; ! 86: ! 87: if(sony_istatus(&ret, err)) ! 88: return(-1); ! 89: d = &ret.data[48]; ! 90: for(i = 0; i < j->nshelves; i++) ! 91: j->shelves[i] = (d[i]&0x80) && (d[i]&0x40); ! 92: return(0); ! 93: } ! 94: ! 95: j_eject(int dr, char *err) ! 96: { ! 97: struct scsi_cmd cmd; ! 98: struct scsi_return ret; ! 99: ! 100: set6(cmd, 0xC0, dr<<5, 0, 0, 0, 0); ! 101: return(s_io(0, &cmd, 0, &ret, 0, err)); ! 102: } ! 103: ! 104: j_sh_to_dr(int sh, int side, int dr, char *err) ! 105: { ! 106: struct scsi_cmd cmd; ! 107: struct scsi_return ret; ! 108: ! 109: set6(cmd, 0xD6, dr<<5, 0, (sh<<1)|side, 0, 0); ! 110: return(s_io(0, &cmd, 0, &ret, 0, err)); ! 111: } ! 112: ! 113: j_dr_to_sh(int dr, int sh, int side, char *err) ! 114: { ! 115: struct scsi_cmd cmd; ! 116: struct scsi_return ret; ! 117: ! 118: if(sh < 0) ! 119: set6(cmd, 0xD7, dr<<5, 0, 0, 0, 0); ! 120: else ! 121: set6(cmd, 0xD7, (dr<<5)|1, 0, (sh<<1)|side, 0, 0); ! 122: return(s_io(0, &cmd, 0, &ret, 0, err)); ! 123: } ! 124: ! 125: j_start(int dr, char *err) ! 126: { ! 127: struct scsi_cmd cmd; ! 128: struct scsi_return ret; ! 129: ! 130: set6(cmd, 0x1B, dr<<5, 0, 0, 1, 0); ! 131: if(s_io(0, &cmd, 0, &ret, 0, err)) ! 132: return(-1); ! 133: return(0); ! 134: } ! 135: ! 136: j_stop(int dr, char *err) ! 137: { ! 138: struct scsi_cmd cmd; ! 139: struct scsi_return ret; ! 140: ! 141: set6(cmd, 0x1B, dr<<5, 0, 0, 0, 0); ! 142: if(s_io(0, &cmd, 0, &ret, 0, err)) ! 143: return(-1); ! 144: return(0); ! 145: } ! 146: extern j_read(int, unsigned long, char *, int, char *); ! 147: extern j_write(int, unsigned long, char *, int, char *); ! 148: extern j_capacity(int, unsigned long *, unsigned long *); ! 149: ! 150: j_load_unloaded(int dr, char *err) ! 151: { ! 152: /* this is wrong; ! 153: we should do a status every time to see ifthere are any temps ! 154: */ ! 155: if(j_sh_to_dr(127, SIDEA, dr, err)) ! 156: return(0); ! 157: else ! 158: return(1); ! 159: } ! 160: ! 161: void ! 162: j_reset(void) ! 163: { ! 164: struct scsi_cmd cmd; ! 165: struct scsi_return ret; ! 166: char err[1024]; ! 167: ! 168: set6(cmd, 0, 0, 0, 0, 0, 0); ! 169: cmd.bus_id = s_id; ! 170: cmd.flags |= SCSI_RESET | SCSI_BRESET; ! 171: /* should probably test for some kind of error... */ ! 172: ss_io(0, &cmd, 0, &ret, 0, err); ! 173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.