|
|
1.1 root 1: #include <stdio.h>
2: #include "../scsi.h"
3: #include "../scsish.h"
4: #include "fns.h"
5:
6: int
7: gen_sense(int niargs, int *iargs, int ncargs, char **cargs, char *err)
8: {
9: struct scsi_cmd cmd;
10: struct scsi_return ret;
11: int n;
12:
13: #pragma ref ncargs
14: #pragma ref cargs
15:
16: if(niargs == 0)
17: iargs[0] = 0;
18: set6(cmd, 0x03, iargs[0]<<5, 0, 0, 4, 0);
19: if(n = s_io(0, &cmd, 0, &ret, 4, err))
20: return(n);
21: printf("sense(%d,%d): ", s_id, iargs[0]);
22: if((ret.data[0]&0x7F) == 0)
23: printf("no error\n");
24: else {
25: printf("error class=0x%x, code=0x%x, sense=0x%x",
26: (ret.data[0]>>4)&7, ret.data[0]&0xF, ret.data[2]&0xF);
27: if(ret.data[0]&0x80)
28: printf(", addr=0x%x", ret.data[3]+256L*ret.data[2]+256L*256*ret.data[1]);
29: printf("\n");
30: }
31: return(0);
32: }
33:
34: static char *exstab[16] =
35: {
36: "no sense",
37: "recovered error",
38: "not ready",
39: "medium error",
40: "hardware error",
41: "illegal request",
42: "unit attention",
43: "data protect",
44: "blank check",
45: "vendor specific (#9)",
46: "copy aborted",
47: "aborted command",
48: "equal",
49: "volume overflow",
50: "miscompare",
51: "reserved (#f)",
52: };
53:
54: void
55: gen_extsense(uchar *data, char *dest, int ndata)
56: {
57: int class;
58:
59: class = (data[0]>>4)&7;
60: if(class == 7){
61: if(data[0]&0x80)
62: sprintf(dest, "extended sense: %s info=#%2.2x#%2.2x#%2.2x#%2.2x", exstab[data[2]&0xF], data[3], data[4], data[5], data[6]);
63: else
64: sprintf(dest, "extended sense: %s", exstab[data[2]&0xF]);
65: } else {
66: sprintf(dest, "sense: class=#%x, code=#%x", class, data[0]&0xF);
67: }
68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.