|
|
1.1 root 1: #include "scsi.h"
2:
3: static int cnts[256];
4: static char *cmsg[256];
5:
6: s_media(drive, lbn, count, verbose)
7: {
8: struct scsi_o o;
9: int bn, c;
10: register unsigned char *d;
11: char buf[256];
12: int lower;
13:
14: if(s_istatus(drive, &o))
15: return(1);
16: if((o.data[100]&0x80) && (drive == (o.data[100]&7)))
17: lower = 0;
18: else if((o.data[101]&0x80) && (drive == (o.data[101]&7)))
19: lower = 1;
20: else {
21: fprint(2, "drive %d not occupied\n", drive);
22: return(1);
23: }
24: Fprint(1, "drive %d: %smedia check for %d blocks [%d-%d], %s drive\n",
25: drive, verbose?"detailed ":"", count, lbn, lbn+count-1,
26: lower? "lower" : "upper");
27: if(cmsg[0] == 0){
28: for(bn = 0; bn < 256; bn++){
29: sprint(buf, "rare error 0x%x", bn);
30: cmsg[bn] = strdup(buf);
31: }
32: cmsg[0] = "good";
33: cmsg[0x45] = "unwritten";
34: cmsg[0x81] = "<50% burst";
35: cmsg[0x82] = "50-96% burst";
36: cmsg[0x83] = ">96% burst";
37: cmsg[0x84] = "uncorrectable";
38: }
39: for(bn = 0; bn < 256; bn++)
40: cnts[bn] = 0;
41: for(bn = lbn, c = count; c >= 256; c -= 256, bn += 256){
42: if(s_media1(drive, bn, lower, &o))
43: return(1);
44: for(d = o.data; d < &o.data[256];){
45: if(verbose && *d)
46: Fprint(1, "lbn %d: %s\n", bn+(d-o.data), cmsg[*d]);
47: cnts[*d++]++;
48: }
49: }
50: if(c){
51: if(s_media1(drive, bn, lower, &o))
52: return(1);
53: for(d = o.data; c; c--){
54: if(verbose && *d)
55: Fprint(1, "lbn %d: %s\n", bn+(d-o.data), cmsg[*d]);
56: cnts[*d++]++;
57: }
58: }
59: for(c = 0; c < 256; c++)
60: if(cnts[c])
61: Fprint(1, "%d %s, ", cnts[c], cmsg[c]);
62: Fprint(1, "\n");
63: return(0);
64: }
65:
66: s_mediaf(drive, lbn, count, file)
67: char *file;
68: {
69: struct scsi_o o;
70: int bn, c;
71: char buf[256];
72: int lower;
73: int fd;
74:
75: if(s_istatus(drive, &o))
76: return(1);
77: if((o.data[100]&0x80) && (drive == (o.data[100]&7)))
78: lower = 0;
79: else if((o.data[101]&0x80) && (drive == (o.data[101]&7)))
80: lower = 1;
81: else {
82: fprint(2, "drive %d not occupied\n", drive);
83: return(1);
84: }
85: if((fd = creat(file, 0666)) < 0){
86: perror(file);
87: return(1);
88: }
89: Finit(fd, (char *)0);
90: fprint(1, "drive %d: media check for %d blocks [%d-%d], %s drive on file %s\n",
91: drive, count, lbn, lbn+count-1,
92: lower? "lower" : "upper", file);
93: for(bn = lbn, c = count; c >= 256; c -= 256, bn += 256){
94: if(s_media1(drive, bn, lower, &o))
95: return(1);
96: Fwrite(fd, o.data, 256);
97: }
98: if(c){
99: if(s_media1(drive, bn, lower, &o))
100: return(1);
101: Fwrite(fd, o.data, c);
102: }
103: Fflush(fd);
104: close(fd);
105: fprint(1, "done\n");
106: return(0);
107: }
108:
109: s_media1(drive, lbn, lower, o)
110: struct scsi_o *o;
111: {
112: struct scsi_i input;
113:
114: input.bus_id = 1<<scsi_id;
115: input.cmd[0] = 0x1D;
116: input.cmd[1] = drive<<5;
117: input.cmd[2] = 0;
118: input.cmd[3] = 0;
119: input.cmd[4] = 10;
120: input.cmd[5] = 0;
121: input.data[0] = 0x0A; /* error margin check */
122: input.data[1] = lower? 2:1;
123: input.data[2] = 0;
124: input.data[3] = 0;
125: input.data[4] = drive;
126: input.data[5] = lbn;
127: input.data[6] = lbn>>8;
128: input.data[7] = lbn>>16;
129: input.data[8] = 0;
130: input.data[9] = 0;
131: if(scsiio(&input, o, 10, "media") < 0)
132: return(1);
133: s_diag(drive, 256, o);
134: if(CHECK(*o)){
135: scsidump(o);
136: return(1);
137: }
138: return(0);
139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.