|
|
1.1 root 1: /* format disk - cmd/smd type */
2:
3: #include "../machine/mtpr.h"
4: #include "../h/param.h"
5: #include "../h/inode.h"
6: #include "../h/fs.h"
7: #include "../vba/udc.h"
8: #include "saio.h"
9:
10: char disk[50] = "xmd(00,000)";
11:
12: main()
13: {
14: int j, c, i, n;
15: char buf[50];
16: int output;
17:
18: do {
19: printf("Device to format: ");
20: gets(disk);
21: output = open(disk, 1);
22: if (output <= 0) printf("Cannot open disk\n", disk);
23: /* dummy call just to get to the local strategy routine */
24: else {
25: printf("Type <return> to start formatting ");
26: gets(buf);
27: write(output,buf,0);
28: printf("Formatting completed. \n");
29: }
30: } while (output <= 0);
31:
32: }
33:
34: /*
35: * Universal disk controller driver for the Motorola M68000/IPC.
36: * Stand-alone version (no interrupts, etc.)
37: */
38:
39:
40: static struct UDPAC udpkt = {
41: 2, 0, 21, 0, 0, 0, 0, SECTSIZ, {0, 0}, 0, 0, 3
42: } ;
43:
44: long udstd[] = { /* May be used some day to boot from any of
45: * several UDC controllers */
46: 0xf0000
47: };
48:
49: /*****************************************************
50: /*
51: /*The next layout of major/minor number assignments are for the UDC
52: /*devices.
53: /*
54: /* 1
55: /* 5 8 7 4 3 2 0
56: /* +----------------+-----+-+-+-----+
57: /* | Major device # | |D|R| FLS |
58: /* +----------------+-----+-+-+-----+
59: /* | | |_____ File system # ( 0-7 )
60: /* | |_________ Fixed (0) or removable(1) media
61: /* |___________ Drive # (0-1)
62: /*
63: /* For the floppy drives, the major / minor assignment will be
64: /* 1
65: /* 5 8 7 4 3 2 0
66: /* +----------------+-----+---+-----+
67: /* | 4 | | D | FLS |
68: /* +----------------+-----+---+-----+
69: /* | |_____ File system # ( 0-7 )
70: /* |____________ Drive # (0-3)
71: /*
72: /****************************************************/
73:
74: #define UDCUNIT(x) ((minor(x) & 0x18) >> 3)
75:
76: udstrategy(io, func)
77: register struct iob *io;
78: long func; /* Known to be 'read' */
79: {
80:
81: register unit = io->i_unit;
82: register bn = io->i_bn;
83: register char *cntaddr ;
84: register char *addr ;
85: register timeout , retries , i;
86:
87: cntaddr = (char *)(udstd[0] + IOBASE); /* Booting from cntrlr 0 */
88: /*
89: * prepare a command packet for the controller.
90: */
91: retries = 3;
92: loop:
93: if (cntaddr[OB1]) {
94: printf("UDC controller not ready, %x=%x\n",OB1+cntaddr,
95: cntaddr[OB1] & 0xff);
96: return(0);
97: }
98: udpkt._pksiz = 7 ;
99: udpkt._pkid = 0xAA ;
100: udpkt._pkdev = UDCUNIT(unit);
101: udpkt._pkcmd = 0x40; /* control command */
102: if (io->i_ino.i_dev == 1) {
103: udpkt._pkdev += 4; /* Floppy */
104: udpkt._pkfnc = 2; /* format floppy */
105: }
106: else udpkt._pkfnc = 2; /* format disk */
107: udpkt._pkcnt = 3 << 8; /* EOT (sort of) */
108: if (movep21(&udpkt,cntaddr+0x105,7)) {
109: cntaddr[OB1] = (char)0x80 ; /* signal packet transmitted */
110: cntaddr[IB2] = (char)0 ; /* clear ACK/NAK field */
111: cntaddr[INT] = (char)0x0 ; /* interrupt the controller */
112: }
113: else {
114: printf ("Wrong command packet arrived at UDC\n");
115: printf ("Original UDC\n");
116: for (i = 0; i < sizeof(udpkt); i++ )
117: printf(" %0x\t%0x\n", ((char *)&udpkt)[i*2] & 0xff,
118: cntaddr[0x105+i*2] & 0xff);
119: }
120: /*
121: *
122: * Wait until done (no interrupts now).
123: *
124: */
125: wait:
126: timeout = 10000;
127: while (cntaddr[IB2] != (char)0x06 && cntaddr[IB2] != (char)0x15) {
128: /**************
129: DELAY(10000);
130: timeout--;
131: if (timeout <= 0) {
132: printf("UDC controller timeout\n");
133: return(0);
134: }
135: *****************/
136: }
137: udpkt._pksiz = 21;
138: if (cntaddr[IB2] == (char)0x15) {
139: if (retries-- < 0) {
140: printf("Too many NAK from UDC - give up\n");
141: return(0);
142: } else goto loop;
143: }
144:
145: while (cntaddr[IB1] != (char)DEVRDY)
146: /* DELAY (10000); /* Wait for his response */;
147:
148:
149: /* Ignore unsolicited status messages */
150: if (cntaddr[PKID] != (char)udpkt._pkid && cntaddr[PKSTT] == (char)0x80)
151: {
152: cntaddr[IB1] = (char)0;
153: cntaddr[OB2] = (char)6;
154: cntaddr[INT] = (char)0x80;
155: goto loop;
156: }
157: if (cntaddr[PKID] != (char)udpkt._pkid ||
158: cntaddr[PKDEV] != (char)udpkt._pkdev ||
159: cntaddr[PKLEN] != (char)19 ||
160: cntaddr[PKCMD] != (char)udpkt._pkcmd ||
161: cntaddr[PKSTT] != (char)0x70 || /* Command completion */
162: cntaddr[STAT1] != (char)0 ||
163: cntaddr[STAT2] != (char)0 ) {
164: printf ("Strange status from UDC:\n");
165: printf("Packet id=%x,unit=%x,original command=%x,status type=%x,status=%x\n",
166: cntaddr[PKID] & 0xff,
167: cntaddr[PKDEV] & 0xff,
168: cntaddr[PKCMD] & 0xff,
169: cntaddr[PKSTT] & 0xff,
170: (cntaddr[STAT1]*256+cntaddr[STAT2]) & 0xffff);
171: if (cntaddr[PKLEN] > 9) {
172: printf("More response info : ");
173: for (i=1; i<=cntaddr[PKLEN]-9; i++)
174: printf("%x ", cntaddr[STAT2+2*i] & 0xff);
175: printf("\n");
176: }
177: cntaddr[IB1] = (char)0;
178: cntaddr[OB2] = (char)6;
179: cntaddr[INT] = (char)0x80;
180: return(0);
181: } else {
182: cntaddr[IB1] = (char)0;
183: cntaddr[OB2] = (char)6;
184: cntaddr[INT] = (char)0x80;
185: mtpr (0, PADC); /* So data will come in right */
186: return(io->i_cc);
187: }
188: }
189:
190: /*
191: * Transfer a 21 bytes packet to the controller.
192: * the message is written to odd addresses, starting from
193: * the given address.
194: * For reliability, read it back and see if it's the same. If not,
195: * return an error code.
196: */
197: movep21(src, dest,cnt)
198:
199: char *src, *dest;
200: int cnt;
201: {
202: register char *running_src, *running_dest;
203: register long running_cnt;
204:
205: running_src = src;
206: running_dest = dest;
207: running_cnt = cnt;
208:
209: for (; running_cnt>0; running_cnt--) {
210: *running_dest++ = *running_src++;
211: running_dest++;
212: }
213: running_src = src;
214: running_dest = dest;
215: running_cnt = cnt;
216: for (; running_cnt>0; running_cnt--) {
217: if (*running_dest++ != *running_src++) return(0);
218: running_dest++;
219: }
220: return(1);
221: }
222:
223: udopen(io)
224: struct iob *io;
225: {
226: register char *cntaddr;
227: /*
228: * Just clean up any junk in the controller's response buffers.
229: */
230: cntaddr = (char *)(udstd[0] + IOBASE); /* Booting from cntrlr 0 */
231: while (cntaddr[IB1] == (char)DEVRDY) {
232: cntaddr[IB1] = (char)0;
233: cntaddr[OB2] = (char)0x06; /* ACK */
234: cntaddr[INT] = (char)0; /* Force him to listen and respond */
235: DELAY(50000);
236: }
237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.