|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <stddef.h> ! 3: #include "../scsi.h" ! 4: #include "../scsish.h" ! 5: #include "fns.h" ! 6: ! 7: static int cnts[256]; ! 8: static char *cmsg[256]; ! 9: ! 10: sony_media1(int drive, long lbn, int lower, struct scsi_return *ret, char *err) ! 11: { ! 12: struct scsi_cmd cmd; ! 13: int n; ! 14: ! 15: set6(cmd, 0x1D, drive<<5, 0, 0, 10, 0); ! 16: cmd.data[0] = 0x0A; /* error margin check */ ! 17: cmd.data[1] = lower? 2:1; ! 18: cmd.data[2] = 0; ! 19: cmd.data[3] = 0; ! 20: cmd.data[4] = drive; ! 21: cmd.data[5] = lbn; ! 22: cmd.data[6] = lbn>>8; ! 23: cmd.data[7] = lbn>>16; ! 24: cmd.data[8] = 0; ! 25: cmd.data[9] = 0; ! 26: if(n = s_io(0, &cmd, 10, ret, 0, err)) ! 27: return(n); ! 28: setdiag(cmd, drive, 256); ! 29: if(n = s_io(0, &cmd, 0, ret, 256, err)) ! 30: return(n); ! 31: return(0); ! 32: } ! 33: ! 34: int ! 35: sony_media(int niargs, int *iargs, int ncargs, char **cargs, char *err) ! 36: { ! 37: struct scsi_return ret; ! 38: uchar *d; ! 39: int bn, c; ! 40: char buf[256]; ! 41: int lower; ! 42: int nline; ! 43: int cur, curb; ! 44: int drive = iargs[0]; ! 45: long lbn = iargs[1]; ! 46: int count = iargs[2]; ! 47: extern char *strdup(char *); ! 48: int verbose = 0; ! 49: FILE *fp = 0; ! 50: ! 51: #pragma ref niargs ! 52: ! 53: if(ncargs == 1){ ! 54: if(strcmp(cargs[0], "-v") == 0) ! 55: verbose = 1; ! 56: else if((fp = fopen(cargs[0], "w")) == NULL){ ! 57: pperror(err, cargs[0]); ! 58: return(1); ! 59: } ! 60: } ! 61: if(sony_istatus(&ret, err)) ! 62: return(1); ! 63: if((ret.data[100]&0x80) && (drive == (ret.data[100]&7))) ! 64: lower = 0; ! 65: else if((ret.data[101]&0x80) && (drive == (ret.data[101]&7))) ! 66: lower = 1; ! 67: else { ! 68: sprintf(err, "drive %d not occupied and ready\n", drive); ! 69: return(1); ! 70: } ! 71: printf("media margin check for %d blocks [%d-%d] on %s drive (%d,%d):", ! 72: count, lbn, lbn+count-1, lower? "lower":"upper", s_id, drive); ! 73: if(fp) ! 74: printf(" stored in '%s'", cargs[0]); ! 75: putchar('\n'); ! 76: if(cmsg[0] == 0){ ! 77: for(bn = 0; bn < 256; bn++){ ! 78: sprintf(buf, "rare error 0x%x", bn); ! 79: cmsg[bn] = strdup(buf); ! 80: } ! 81: cmsg[0] = "good"; ! 82: cmsg[0x40] = "seek error 1 (alternated)"; ! 83: cmsg[0x41] = "seek error 2 (alternated)"; ! 84: cmsg[0x42] = "seek error 3 (alternated)"; ! 85: cmsg[0x44] = "read error 1 (alternated)"; ! 86: cmsg[0x45] = "unwritten"; ! 87: cmsg[0x46] = "read error 3 (alternated)"; ! 88: cmsg[0x81] = "<50% burst"; ! 89: cmsg[0x82] = "50-96% burst (alternated)"; ! 90: cmsg[0x83] = ">96% burst (alternated)"; ! 91: cmsg[0x84] = "uncorrectable (alternated)"; ! 92: } ! 93: #define DO(ch,cp) if(fp) putc(ch,fp); else if(ch != cur){\ ! 94: int newb = bn+cp-ret.data;\ ! 95: if(verbose && (curb>=0)){\ ! 96: printf("%d %s@%d, ", newb-curb, cmsg[cur], curb);\ ! 97: if(++nline == 5){nline = 0; putchar('\n');}\ ! 98: }\ ! 99: cur = ch;\ ! 100: curb = newb;\ ! 101: } ! 102: cur = 256; ! 103: curb = -1; ! 104: nline = 0; ! 105: for(bn = 0; bn < 256; bn++) ! 106: cnts[bn] = 0; ! 107: for(bn = lbn, c = count; c >= 256; c -= 256, bn += 256){ ! 108: if(sony_media1(drive, bn, lower, &ret, err)) ! 109: return(1); ! 110: for(d = ret.data; d < &ret.data[256];){ ! 111: DO(*d, d); ! 112: cnts[*d++]++; ! 113: } ! 114: } ! 115: if(c){ ! 116: if(sony_media1(drive, bn, lower, &ret, err)) ! 117: return(1); ! 118: for(d = ret.data; c; c--){ ! 119: DO(*d, d); ! 120: cnts[*d++]++; ! 121: } ! 122: } ! 123: DO(256, d); ! 124: if(nline) ! 125: putchar('\n'); ! 126: printf("\t"); ! 127: for(c = 0; c < 256; c++) ! 128: if(cnts[c]) ! 129: printf("%d %s, ", cnts[c], cmsg[c]); ! 130: printf("\n"); ! 131: return(0); ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.