|
|
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.