Annotation of researchv10no/cmd/worm/scsi/sony/juke.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.