|
|
1.1 ! root 1: /* ! 2: /* format disk on Xylogics controller - fsd/smd/fujitsu type */ ! 3: /**/ ! 4: ! 5: #include "../machine/mtpr.h" ! 6: #include "../h/param.h" ! 7: #include "../h/inode.h" ! 8: #include "../h/xpreg.h" ! 9: #include "saio.h" ! 10: ! 11: char disk[10] ; /* disk type (smd/fsd/fuj) */ ! 12: char drive[10] ; /* drive number */ ! 13: char start[10]; ! 14: char buf[512]; /* format data buffer */ ! 15: ! 16: int vdebug = 1; ! 17: ! 18: long xpstand[] = { ! 19: 0x0fee40 }; ! 20: ! 21: struct xp_iopb *iopb = &iopbx; ! 22: int dsktype; ! 23: int nsect,ncyl,ntrack; ! 24: ! 25: #define XY_SHORT(x) (short)((((x) >> 8) & 0xff) + (((x) << 8) & 0xff00)) ! 26: #define b_cylin b_resid ! 27: int xytimeout; ! 28: #define POLLTILLDONE(x) { xytimeout = 1000*(x); \ ! 29: while (xpaddr->xpcsr & XP_GBSY) { \ ! 30: DELAY(1000); \ ! 31: xytimeout--; \ ! 32: if (xytimeout <= 0) { \ ! 33: printf("XY timeout\n"); \ ! 34: return(0); \ ! 35: } \ ! 36: } \ ! 37: } ! 38: ! 39: main() ! 40: { ! 41: int j, c, i, n; ! 42: ! 43: printf("Drive type [fsd/smd/fuj]: "); ! 44: gets(disk); ! 45: printf("Drive number [0-3]: "); ! 46: gets(drive); ! 47: j = number(drive); ! 48: if ((strcmp(disk,"fsd") || strcmp(disk,"smd") || ! 49: strcmp(disk,"fuj")) && ( j <= 3)) ! 50: { ! 51: if (xpstart(disk,j) == 0) { ! 52: printf("Initialization failed (drive not ready?), giving up!\n"); ! 53: return; ! 54: } ! 55: printf("Type <return> to start formatting "); ! 56: gets(start); ! 57: if (xpformat(disk,j)); ! 58: printf("Formatting completed. \n"); ! 59: } ! 60: else if (j>3) printf("Illegal drive number\n"); ! 61: else printf("Illegal drive type\n"); ! 62: } ! 63: ! 64: int number (response) ! 65: char *response; ! 66: { ! 67: int i, j; ! 68: ! 69: j = 0; /* Total */ ! 70: while (*response == ' ' || *response == '\t') response++; ! 71: while (*response >= '0' && *response <= '9') { ! 72: j = j*10 + *response - '0'; ! 73: response++; ! 74: } ! 75: return (j); ! 76: } ! 77: ! 78: xpstart(disk,unit) ! 79: char *disk; ! 80: int unit; ! 81: { ! 82: struct xpdevice *xpaddr; ! 83: int ret; ! 84: ! 85: /* ! 86: * Check if a drive is really there. (NOP selects the drive and ! 87: * returns DRDY status ! 88: */ ! 89: xpmkiopb(XP_NOP,unit,0,0,0,0,0,0); ! 90: iopb->io_comm &= ~XP_IEN; /* disable interrupts */ ! 91: ! 92: xpaddr = (struct xpdevice *)(xpstand[0] + IOBASE); /* formatting on cntl 0 */ ! 93: ret = xpaddr->xpreset; /* reset controller */ ! 94: DELAY(400); /* wait 400 ns */ ! 95: xpdgo(xpaddr,iopb); /* start the controller */ ! 96: DELAY(200); /* wait 200 ns before checking CSR for completion */ ! 97: ! 98: POLLTILLDONE(1) ! 99: DELAY(200); ! 100: uncache((char *)&iopb->io_status); ! 101: if ((XY_SHORT(iopb->io_status) != 5) || /* 5 = no errors, xy450, DONE */ ! 102: !(xpaddr->xpcsr & XP_DRDY) || /* drive is not ready */ ! 103: (xpaddr->xpcsr & (XP_ERR | XP_DERR))) { /* errors? */ ! 104: printf("XY start error. Status = %x, xpcsr= %x\n", ! 105: XY_SHORT(iopb->io_status),xpaddr->xpcsr); ! 106: return(0); ! 107: } ! 108: /* ! 109: * now set the drive size parameters in the controller ! 110: */ ! 111: if (strcmp(disk,"fsd")) { ! 112: xpmkiopb(XP_DSIZE,unit,9,822,31,0,0,0); /* 160M fsd */ ! 113: dsktype = 0; ! 114: nsect = 32; ! 115: ncyl = 823; ! 116: ntrack = 10; ! 117: } ! 118: else ! 119: if (strcmp(disk,"smd")) { ! 120: xpmkiopb(XP_DSIZE,unit,18,822,31,0,0,0x40); /* 300M smd */ ! 121: dsktype = 0x40; ! 122: nsect = 32; ! 123: ncyl = 823; ! 124: ntrack = 19; ! 125: } ! 126: else { ! 127: xpmkiopb(XP_DSIZE,unit,19,841,45,0,0,0x80); /* 474M Fujitsu */ ! 128: dsktype = 0x80; ! 129: nsect = 46; ! 130: ncyl = 842; ! 131: ntrack = 20; ! 132: } ! 133: iopb->io_comm &= ~XP_IEN; /* disable interrupts */ ! 134: xpdgo(xpaddr,iopb); ! 135: DELAY(200); ! 136: ! 137: POLLTILLDONE(1) ! 138: DELAY(200); ! 139: uncache((char *)&iopb->io_status); ! 140: if ((XY_SHORT(iopb->io_status) != 5) || /* errors */ ! 141: !(xpaddr->xpcsr & XP_DRDY) || ! 142: (xpaddr->xpcsr & (XP_ERR | XP_DERR))) ! 143: { ! 144: printf("XY set size error. status= %x, drive $d, type %s\n", ! 145: XY_SHORT(iopb->io_status),unit,disk); ! 146: return(0); ! 147: } ! 148: else return(1); ! 149: } ! 150: ! 151: xpformat(disk,unit) ! 152: char disk[10]; ! 153: int unit; ! 154: { ! 155: struct xpdevice *xpaddr; ! 156: int i,j,flag; ! 157: ! 158: xpaddr = (struct xpdevice *)(xpstand[0] + IOBASE); /* formatting on cntl 0 */ ! 159: xpmkiopb(XP_FORMAT,unit,0,0,0,nsect,0,dsktype); ! 160: for (i=0; i<ncyl; i++) { ! 161: iopb->io_comm &= ~XP_IEN; /* disable interrupts */ ! 162: iopb->io_status = 0; ! 163: iopb->io_sect = 0; ! 164: iopb->io_scnt = XY_SHORT(nsect*ntrack); ! 165: iopb->io_cyl = XY_SHORT(i); ! 166: iopb->io_head = 0; ! 167: xpdgo(xpaddr,iopb); ! 168: DELAY(200); ! 169: ! 170: POLLTILLDONE(1*60) ! 171: DELAY(200); ! 172: uncache((char *)&iopb->io_status); ! 173: if ((XY_SHORT(iopb->io_status) != 5) || ! 174: (xpaddr->xpcsr & (XP_ERR | XP_DERR)) ) ! 175: { ! 176: printf("XY format error %x, drive $d, type %s\n", ! 177: XY_SHORT(iopb->io_status),unit,disk); ! 178: return(0); ! 179: } ! 180: printf("."); ! 181: } ! 182: return(1); ! 183: } ! 184: ! 185: strcmp(str1,str2) ! 186: char *str1; ! 187: char *str2; ! 188: { ! 189: ! 190: while (*str1++ && *str2++ ) ! 191: if (*str1 != *str2) return(0) ; ! 192: return(1); ! 193: } ! 194: ! 195: /* ! 196: * Now all ready to go, stuff the registers. ! 197: */ ! 198: xpdgo(xpaddr, iopb) ! 199: register struct xpdevice *xpaddr; ! 200: register struct xp_iopb *iopb; ! 201: { ! 202: xpmovob( (u_char)((int)iopb >> 24),&xpaddr->xpmrel ); ! 203: DELAY(5); ! 204: xpmovob( (u_char)((int)iopb >> 16),&xpaddr->xplrel ); ! 205: DELAY(5); ! 206: xpmovob( (u_char)((int)iopb >> 8),&xpaddr->xpmba ); ! 207: DELAY(5); ! 208: xpmovob( (u_char)((int)iopb),&xpaddr->xplba ); ! 209: DELAY(5); ! 210: xpmovob( XP_GBSY,&xpaddr->xpcsr) ; ! 211: } ! 212: ! 213: /* ! 214: * Fill the iopb with the appropriate data. ! 215: */ ! 216: xpmkiopb(cmd,unit,head,cylinder,sector,scount,baddr,xptype) ! 217: unsigned int cmd, unit, head, cylinder, sector, scount, xptype; ! 218: caddr_t baddr; ! 219: { ! 220: iopb->io_comm = cmd | XP_RELO ; ! 221: iopb->io_imode = XPM_ASR | XPM_EEF | XPM_ECC; ! 222: iopb->io_throt = XPT_T128; ! 223: iopb->io_drive = xptype | unit; ! 224: iopb->io_head = head; ! 225: iopb->io_sect = sector; ! 226: iopb->io_cyl = XY_SHORT(cylinder); ! 227: iopb->io_scnt = XY_SHORT(scount); ! 228: iopb->io_mladdr = XY_SHORT((int)baddr & 0xffff); ! 229: iopb->io_mhaddr = XY_SHORT(((int)baddr >> 16) & 0xffff); ! 230: iopb->io_status = 0; ! 231: } ! 232: ! 233: xpmovob(byte, destination) ! 234: long byte, destination; ! 235: { ! 236: asm("movob 7(fp),*8(fp);"); ! 237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.