|
|
1.1 root 1: #include <stdio.h>
2: #include "../scsi.h"
3: #include "../scsish.h"
4: #include "../tcl.h"
5: #include "fns.h"
6: #include "wren.h"
7:
8: int
9: wr_mpage(int pcf, int page, Field **fields, char *err)
10: {
11: struct scsi_cmd cmd;
12: struct scsi_return ret;
13: int ndata;
14: int m, msk;
15: Field *f, **fp;
16: static int mask[8] = { 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F };
17:
18: set6(cmd, 0x1A, 0, (pcf<<6)|page, 0, 60, 0);
19: if(s_io(0, &cmd, 0, &ret, -72, err))
20: return(-1);
21: ndata = ret.nread;
22: if(((ret.data[12]&0x3F) != page) || (ret.data[13]+14!= ndata))
23: printf("pg=#%x(#%x) data=#%x(#%x)\n", ret.data[12], page, ret.data[13], ndata);
24:
25: printf("setting");
26: for(fp = fields; f = *fp; fp++)
27: printf(" %s '%s'=%d", ((*fp)->len==1)? "bit":"count", (*fp)->name, (*fp)->nval);
28: printf("; kill me if that's wrong\n");
29: fflush(stdout);
30: sleep(5);
31: for(fp = fields; f = *fp; fp++)
32: switch(f->len)
33: {
34: case 8:
35: ret.data[f->byteoff+12] = f->nval;
36: break;
37: case 16:
38: ret.data[f->byteoff+11] = f->nval>>8;
39: ret.data[f->byteoff+12] = f->nval;
40: break;
41: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
42: msk = mask[f->len]<<f->bitoff;
43: m = ret.data[f->byteoff+12]&~msk;
44: ret.data[f->byteoff+12] = m|((f->nval<<f->bitoff) & msk);
45: break;
46: default:
47: printf("unknown size %d for field %s\n", f->len, f->name);
48: return(-1);
49: }
50: memcpy(cmd.data, ret.data, ndata);
51: cmd.data[0] = cmd.data[2] = 0;
52: cmd.data[12] &= 0x3F; /* clear out top two bits */
53: set6(cmd, 0x15, 0x11, 0, 0, ndata, 0);
54: if(s_io(0, &cmd, ndata, &ret, 0, err))
55: return(-1);
56: return(TCL_OK);
57: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.