BSD 4_2 development
[unix-history] / .ref-BSD-4_1c_2 / a / sys / vaxuba / rl.c
CommitLineData
207438d8
C
1/* rl.c 4.1 83/02/08 */
2
3#include "rl.h"
4#if NHL > 0
5/*
6 * UNIBUS RL02 disk driver
7 * (not yet converted to 4.1c)
8 */
9
10#include "../h/param.h"
11#include "../h/systm.h"
12#include "../h/cpu.h"
13#include "../h/nexus.h"
14#include "../h/dk.h"
15#include "../h/buf.h"
16#include "../h/conf.h"
17#include "../h/dir.h"
18#include "../h/user.h"
19#include "../h/map.h"
20#include "../h/pte.h"
21#include "../h/mtpr.h"
22#include "../h/vm.h"
23#include "../h/ubavar.h"
24#include "../h/ubareg.h"
25#include "../h/cmap.h"
26
27#include "../h/rlreg.h"
28
29/* Pending Controller items and statistics */
30struct rl_softc {
31 int rl_softas; /* Attention sumary, (seeks pending) */
32 int rl_ndrive; /* Number of drives on controller */
33 int rl_wticks; /* Monitor time for function */
34} rl_softc[NHL];
35
36/*
37 * this struct is used to keep the state of the controller for the last
38 * transfer done. Since only one transfer can be done at a time per
39 * controller, only allocate one for each controller.
40 */
41struct rl_stat {
42 short rl_cyl[4]; /* Current cylinder for each drive */
43 short rl_dn; /* drive number currently transferring */
44 short rl_cylnhd; /* current cylinder and head of transfer */
45 u_short rl_bleft; /* bytes left to transfer */
46 u_short rl_bpart; /* bytes transferred */
47} rl_stat[NHL];
48
49/* THIS SHOULD BE READ OFF THE PACK, PER DRIVE */
50struct size {
51 daddr_t nblocks;
52 int cyloff;
53} rl02_sizes[8] = {
54 14440, 0, /* A=cyl 0 thru 360 */
55 6040, 361, /* B=cyl 361 thru 511 */
56 20480, 0, /* C=cyl 0 thru 511 */
57 0, 0, /* D= Not Defined */
58 0, 0, /* E= Not Defined */
59 0, 0, /* F= Not Defined */
60 0, 0, /* G= Not Defined */
61 0, 0, /* H= Not Defined */
62};
63/* END OF STUFF WHICH SHOULD BE READ IN PER DISK */
64
65int rlprobe(), rlslave(), rlattach(), rldgo(), rlintr();
66struct uba_ctlr *rlminfo[NHL];
67struct uba_device *rldinfo[NRL];
68struct uba_device *rlip[NHL][4];
69
70/* RL02 driver structure */
71u_short rlstd[] = { 0174400 };
72struct uba_driver hldriver =
73 { rlprobe, rlslave, rlattach, rldgo, rlstd, "rl", rldinfo, "hl", rlminfo };
74
75/* User table per controller */
76struct buf rlutab[NRL];
77
78/* RL02 drive structure */
79struct RL02 {
80 short nbpt; /* Number of 512 byte blocks/track */
81 short ntrak;
82 short nbpc; /* Number of 512 byte blocks/cylinder */
83 short ncyl;
84 short btrak; /* Number of bytes/track */
85 struct size *sizes;
86} rl02 = {
87 20, 2, 40, 512, 20*512, rl02_sizes /* rl02/DEC*/
88};
89
90struct buf rrlbuf[NRL];
91
92#define b_cylin b_resid /* Last seek as CYL<<1 | HD */
93
94#ifdef INTRLVE
95daddr_t dkblock();
96#endif
97
98int rlwstart, rlwatch(); /* Have started guardian */
99
100/* Check that controller exists */
101/*ARGSUSED*/
102rlprobe(reg)
103 caddr_t reg;
104{
105 register int br, cvec;
106
107#ifdef lint
108 br = 0; cvec = br; br = cvec;
109#endif
110 ((struct rldevice *)reg)->rlcs = RL_IE | RL_NOOP; /* Enable intrpt */
111 DELAY(10); /* Ensure interrupt takes place (10 microsec ) */
112 ((struct rldevice *)reg)->rlcs &= ~RL_IE; /* Disable intrpt */
113 return (1);
114}
115
116/* Check that drive exists and is functional*/
117rlslave(ui, reg)
118 struct uba_device *ui;
119 caddr_t reg;
120{
121 register struct rldevice *rladdr = (struct rldevice *)reg;
122 short ctr = 0;
123
124 /*
125 * DEC reports that:
126 * For some unknown reason the RL02 (seems to be only drive 1)
127 * does not return a valid drive status the first time that a
128 * GET STATUS request is issued for the drive, in fact it can
129 * take up to three or more GET STATUS requests to obtain the
130 * correct status.
131 * In order to overcome this, the driver has been modified to
132 * issue a GET STATUS request and validate the drive status
133 * returned. If a valid status is not returned after eight
134 * attempts, then an error message is printed.
135 */
136 do {
137 rladdr->rlda.getstat = RL_RESET;
138 rladdr->rlcs = (ui->ui_slave <<8) | RL_GETSTAT; /* Get status*/
139 rlwait(rladdr);
140 } while( (rladdr->rlmp.getstat&RLMP_STATUS) != RLMP_STATOK && ++ctr<8 );
141
142
143 if ((rladdr->rlcs & RL_DE) || (ctr >= 8))
144 return (0); /* Error return */
145 if ((rladdr->rlmp.getstat & RLMP_DT) == 0 ) { /* NO RL01'S */
146 printf("rl01 drives not supported (drive %d)\n", ui->ui_slave );
147 return(0);
148 }
149 return (1);
150}
151
152/* Initialize controller */
153rlattach(ui)
154 register struct uba_device *ui;
155{
156 register struct rldevice *rladdr;
157
158 if (rlwstart == 0) {
159 timeout(rlwatch, (caddr_t)0, hz); /* Watch for lost intr */
160 rlwstart++;
161 }
162 /* Initialize iostat values */
163 if (ui->ui_dk >= 0)
164 dk_mspw[ui->ui_dk] = .000003906; /* 16bit transfer time? */
165 rlip[ui->ui_ctlr][ui->ui_slave] = ui;
166 rl_softc[ui->ui_ctlr].rl_ndrive++; /* increment device/ctrl */
167 rladdr = (struct rldevice *)ui->ui_addr;
168
169 /* reset controller */
170 rladdr->rlda.getstat = RL_RESET; /* SHOULD BE REPEATED? */
171 rladdr->rlcs = (ui->ui_slave << 8) | RL_GETSTAT; /* Reset DE bit */
172 rlwait(rladdr);
173
174 /* Determine disk posistion */
175 rladdr->rlcs = (ui->ui_slave << 8) | RL_RHDR;
176 rlwait(rladdr);
177
178 /* save disk drive posistion */
179 rl_stat[ui->ui_ctlr].rl_cyl[ui->ui_slave] =
180 (rladdr->rlmp.readhdr & 0177700) >> 6;
181 rl_stat[ui->ui_ctlr].rl_dn = -1;
182}
183
184rlstrategy(bp)
185 register struct buf *bp;
186{
187 register struct uba_device *ui;
188 register int drive;
189 register struct buf *dp;
190 int partition = minor(bp->b_dev) & 07;
191 long bn, sz;
192
193 sz = (bp->b_bcount+511) >> 9; /* Blocks to transfer */
194
195 drive = dkunit(bp); /* Drive number */
196 if (drive >= NRL)
197 goto bad;
198 ui = rldinfo[drive]; /* Controller uba_device */
199 if (ui == 0 || ui->ui_alive == 0)
200 goto bad;
201 if (bp->b_blkno < 0 ||
202 (bn = dkblock(bp))+sz > rl02.sizes[partition].nblocks)
203 goto bad;
204
205 /* bn is in 512 byte block size */
206 bp->b_cylin = bn/rl02.nbpc + rl02.sizes[partition].cyloff;
207 (void) spl5();
208 dp = &rlutab[ui->ui_unit];
209 disksort(dp, bp);
210 if (dp->b_active == 0) {
211 (void) rlustart(ui);
212 bp = &ui->ui_mi->um_tab;
213 if (bp->b_actf && bp->b_active == 0)
214 (void) rlstart(ui->ui_mi);
215 }
216 (void) spl0();
217 return;
218
219bad:
220 bp->b_flags |= B_ERROR;
221 iodone(bp);
222 return;
223}
224
225/*
226 * Unit start routine.
227 * Seek the drive to be where the data is
228 * and then generate another interrupt
229 * to actually start the transfer.
230 */
231rlustart(ui)
232 register struct uba_device *ui;
233{
234 register struct buf *bp, *dp;
235 register struct uba_ctlr *um;
236 register struct rldevice *rladdr;
237 daddr_t bn;
238 short cyl, sn, hd, diff;
239
240 if (ui == 0)
241 return (0);
242 um = ui->ui_mi;
243 dk_busy &= ~(1<<ui->ui_dk); /* Kernel define, drives busy */
244 dp = &rlutab[ui->ui_unit];
245 if ((bp = dp->b_actf) == NULL)
246 goto out;
247 /*
248 * If the controller is active, just remember
249 * that this device has to be positioned...
250 */
251 if (um->um_tab.b_active) {
252 rl_softc[um->um_ctlr].rl_softas |= 1<<ui->ui_slave;
253 return (0);
254 }
255 /*
256 * If we have already positioned this drive,
257 * then just put it on the ready queue.
258 */
259 if (dp->b_active)
260 goto done;
261 dp->b_active = 1; /* Posistioning drive */
262 rladdr = (struct rldevice *)um->um_addr;
263
264 /*
265 * Figure out where this transfer is going to
266 * and see if we are seeked correctly.
267 */
268 bn = dkblock(bp); /* Block # desired */
269 /*
270 * these next two look funky... but we need to map
271 * 512 byte logical disk blocks to 256 byte sectors.
272 * (rl02's are stupid).
273 */
274 sn = (bn % rl02.nbpt) << 1; /* Sector # desired */
275 hd = (bn / rl02.nbpt) & 1; /* Get head required */
276
277 diff = (rl_stat[um->um_ctlr].rl_cyl[ui->ui_slave] >> 1) - bp->b_cylin;
278 if ( diff == 0 && (rl_stat[um->um_ctlr].rl_cyl[ui->ui_slave] & 1) == hd)
279 goto done; /* on cylinder and head */
280
281search:
282 /*
283 * Not at correct position.
284 */
285
286 rl_stat[um->um_ctlr].rl_cyl[ui->ui_slave] = (bp->b_cylin << 1) | hd;
287
288 if (diff < 0)
289 rladdr->rlda.seek = -diff << 7 | RLDA_HGH | hd << 4;
290 else
291 rladdr->rlda.seek = diff << 7 | RLDA_LOW | hd << 4;
292 rladdr->rlcs = (ui->ui_slave << 8) | RL_SEEK;
293
294 /*
295 * Mark unit busy for iostat.
296 */
297 if (ui->ui_dk >= 0) {
298 dk_busy |= 1<<ui->ui_dk;
299 dk_seek[ui->ui_dk]++;
300 }
301 rlwait( rladdr );
302
303 /*
304 * fall through since we are now at the correct cylinder
305 */
306done:
307 /*
308 * Device is ready to go.
309 * Put it on the ready queue for the controller
310 * (unless its already there.)
311 */
312 if (dp->b_active != 2) {
313 dp->b_forw = NULL;
314 if (um->um_tab.b_actf == NULL)
315 um->um_tab.b_actf = dp;
316 else
317 um->um_tab.b_actl->b_forw = dp;
318 um->um_tab.b_actl = dp;
319 dp->b_active = 2; /* Request on ready queue */
320 }
321out:
322 return (0);
323}
324
325/*
326 * Start up a transfer on a drive.
327 */
328rlstart(um)
329 register struct uba_ctlr *um;
330{
331 register struct buf *bp, *dp;
332 register struct uba_device *ui;
333 register struct rldevice *rladdr;
334 register struct rl_stat *st = &rl_stat[um->um_ctlr];
335 daddr_t bn;
336 short sn, cyl, cmd;
337
338loop:
339 /*
340 * Pull a request off the controller queue
341 */
342 if ((dp = um->um_tab.b_actf) == NULL) {
343 st->rl_dn = -1;
344 st->rl_cylnhd = 0;
345 st->rl_bleft = 0;
346 st->rl_bpart = 0;
347 return (0);
348 }
349 if ((bp = dp->b_actf) == NULL) {
350 um->um_tab.b_actf = dp->b_forw;
351 goto loop;
352 }
353 /*
354 * Mark controller busy, and
355 * determine destinationst.
356 */
357 um->um_tab.b_active++;
358 ui = rldinfo[dkunit(bp)]; /* Controller */
359 bn = dkblock(bp); /* 512 byte Block number */
360 cyl = bp->b_cylin << 1; /* Cylinder */
361 cyl |= (bn / rl02.nbpt) & 1; /* Get head required */
362 sn = (bn % rl02.nbpt) << 1; /* Sector number */
363 rladdr = (struct rldevice *)ui->ui_addr;
364
365 /*
366 * Check that controller is ready
367 */
368 rlwait( rladdr );
369
370 /*
371 * Setup for the transfer, and get in the
372 * UNIBUS adaptor queue.
373 */
374 rladdr->rlda.rw = cyl<<6 | sn;
375
376 /* save away current transfers drive status */
377 st->rl_dn = ui->ui_slave;
378 st->rl_cylnhd = cyl;
379 st->rl_bleft = bp->b_bcount;
380 st->rl_bpart = rl02.btrak - (sn * NRLBPSC);
381
382 /* RL02 must seek between cylinders and between tracks */
383 /* Determine maximum data transfer at this time */
384 if( st->rl_bleft < st->rl_bpart)
385 st->rl_bpart = st->rl_bleft;
386
387 rladdr->rlmp.rw = -(st->rl_bpart >> 1);
388 if (bp->b_flags & B_READ)
389 cmd = RL_IE | RL_READ | (ui->ui_slave << 8);
390 else
391 cmd = RL_IE | RL_WRITE | (ui->ui_slave << 8);
392 um->um_cmd = cmd;
393 (void) ubago(ui);
394 return (1);
395}
396
397/*
398 * Now all ready to go, stuff the registers.
399 */
400rldgo(um)
401 register struct uba_ctlr *um;
402{
403 register struct rldevice *rladdr = (struct rldevice *)um->um_addr;
404
405
406 /* Place in unibus address for transfer (lower 18 bits of um_ubinfo) */
407 /* Then execute instruction */
408 rladdr->rlba = um->um_ubinfo;
409 rladdr->rlcs = um->um_cmd|((um->um_ubinfo>>12)&RL_BAE);
410}
411
412/*
413 * Handle a disk interrupt.
414 */
415rlintr(rl21)
416 register rl21;
417{
418 register struct buf *bp, *dp;
419 register struct uba_ctlr *um = rlminfo[rl21];
420 register struct uba_device *ui;
421 register struct rldevice *rladdr = (struct rldevice *)um->um_addr;
422 register unit;
423 struct rl_softc *rl = &rl_softc[um->um_ctlr];
424 struct rl_stat *st = &rl_stat[um->um_ctlr];
425 int as = rl->rl_softas;
426 int needie = 1, waitdry, status;
427
428 rl->rl_wticks = 0;
429 rl->rl_softas = 0;
430
431 /*
432 * Get device and block structures, and a pointer
433 * to the uba_device for the drive.
434 */
435 dp = um->um_tab.b_actf;
436 bp = dp->b_actf;
437 ui = rldinfo[dkunit(bp)];
438 dk_busy &= ~(1 << ui->ui_dk); /* Clear busy bit */
439
440 /*
441 * Check for and process errors on
442 * either the drive or the controller.
443 */
444 if (rladdr->rlcs & RL_ERR) {
445 u_short err;
446 rlwait( rladdr );
447
448 err = rladdr->rlcs;
449
450 /* get staus and reset controller */
451 rladdr->rlda.getstat = RL_GSTAT;
452 rladdr->rlcs = (ui->ui_slave << 8) | RL_GETSTAT;
453 rlwait(rladdr);
454 status = rladdr->rlmp.getstat;
455
456 /* reset drive */
457 rladdr->rlda.getstat = RL_RESET;
458 rladdr->rlcs = (ui->ui_slave <<8) | RL_GETSTAT; /* Get status*/
459 rlwait(rladdr);
460
461 if ( (status & RLMP_WL) == RLMP_WL ) {
462 /*
463 * Give up on write protected devices
464 * immediately.
465 */
466 printf("rl%d: write protected\n", dkunit(bp));
467 bp->b_flags |= B_ERROR;
468 } else if (++um->um_tab.b_errcnt > 10) {
469 /*
470 * After 10 retries give up.
471 */
472 harderr(bp, "rl");
473 printf("cs=%b mp=%b\n",
474 err, RLCS_BITS, status, RLER_BITS);
475
476 bp->b_flags |= B_ERROR;
477 } else
478 um->um_tab.b_active = 0; /* force retry */
479
480 /* Determine disk posistion */
481 rladdr->rlcs = (ui->ui_slave << 8) | RL_RHDR;
482 rlwait(rladdr);
483
484 /* save disk drive posistion */
485 st->rl_cyl[ui->ui_slave] = (rladdr->rlmp.readhdr & 0177700) >> 6;
486 }
487
488 /*
489 * If still ``active'', then don't need any more retries.
490 */
491 if (um->um_tab.b_active) {
492 /* RL02 check if more data from previous request */
493 if ( (bp->b_flags & B_ERROR) == 0 &&
494 (st->rl_bleft -= st->rl_bpart) > 0 ) {
495 /*
496 * the following code was modeled from the rk07
497 * driver when an ECC error occured. It has to
498 * fix the bits then restart the transfer which is
499 * what we have to do (restart transfer).
500 */
501 int reg, npf, o, cmd, ubaddr, diff, head;
502
503
504 /* seek to next head/track */
505
506 /* increment head and/or cylinder */
507 st->rl_cylnhd++;
508 diff = (st->rl_cyl[ui->ui_slave] >> 1) -
509 (st->rl_cylnhd >> 1);
510 st->rl_cyl[ui->ui_slave] = st->rl_cylnhd;
511 head = st->rl_cylnhd & 1;
512 rlwait( rladdr );
513
514 if ( diff < 0 )
515 rladdr->rlda.seek = -diff << 7 | RLDA_HGH | head << 4;
516 else
517 rladdr->rlda.seek = diff << 7 | RLDA_LOW | head << 4;
518 rladdr->rlcs = (ui->ui_slave << 8) | RL_SEEK;
519
520 npf = btop( bp->b_bcount - st->rl_bleft );
521 reg = btop(um->um_ubinfo&0x3ffff) + npf;
522 o = (int)bp->b_un.b_addr & PGOFSET;
523 ubapurge(um);
524 um->um_tab.b_active++;
525
526 rlwait( rladdr );
527 rladdr->rlda.rw = st->rl_cylnhd << 6;
528 if ( st->rl_bleft < (st->rl_bpart = rl02.btrak) )
529 st->rl_bpart = st->rl_bleft;
530 rladdr->rlmp.rw = -(st->rl_bpart >> 1);
531 cmd = (bp->b_flags&B_READ ? RL_READ : RL_WRITE) |
532 RL_IE | (ui->ui_slave << 8);
533 ubaddr = (int)ptob(reg) + o;
534 cmd |= ((ubaddr >> 12) & RL_BAE);
535
536 rladdr->rlba = ubaddr;
537 rladdr->rlcs = cmd;
538 return;
539 }
540
541 um->um_tab.b_active = 0;
542 um->um_tab.b_errcnt = 0;
543 dp->b_active = 0;
544 dp->b_errcnt = 0;
545
546 /* "b_resid" words remaining after error */
547 bp->b_resid = st->rl_bleft;
548 um->um_tab.b_actf = dp->b_forw;
549 dp->b_actf = bp->av_forw;
550
551retry:
552 st->rl_dn = -1;
553 st->rl_bpart = st->rl_bleft = 0;
554 iodone(bp);
555 /*
556 * If this unit has more work to do,
557 * then start it up right away.
558 */
559 if (dp->b_actf)
560 if (rlustart(ui))
561 needie = 0;
562 as &= ~(1<<ui->ui_slave);
563 } else
564 as |= (1<<ui->ui_slave);
565 /*
566 * Release unibus resources and flush data paths.
567 */
568 ubadone(um);
569
570 /* reset state info */
571 st->rl_dn = -1;
572 st->rl_cylnhd = st->rl_bpart = st->rl_bleft = 0;
573
574doattn:
575 /*
576 * Process other units which need attention.
577 * For each unit which needs attention, call
578 * the unit start routine to place the slave
579 * on the controller device queue.
580 */
581 while (unit = ffs(as)) {
582 unit--; /* was 1 origin */
583 as &= ~(1<<unit);
584 (void) rlustart(rlip[rl21][unit]);
585 }
586 /*
587 * If the controller is not transferring, but
588 * there are devices ready to transfer, start
589 * the controller.
590 */
591 if (um->um_tab.b_actf && um->um_tab.b_active == 0)
592 (void) rlstart(um);
593}
594
595rlwait( rladdr )
596register struct rldevice *rladdr;
597{
598 while ((rladdr->rlcs & RL_CRDY) == 0)
599 continue; /* Wait */
600}
601
602rlread(dev)
603 dev_t dev;
604{
605 register int unit = minor(dev) >> 3;
606
607 if (unit >= NRL)
608 u.u_error = ENXIO;
609 else
610 physio(rlstrategy, &rrlbuf[unit], dev, B_READ, minphys);
611}
612
613rlwrite(dev)
614 dev_t dev;
615{
616 register int unit = minor(dev) >> 3;
617
618 if (unit >= NRL)
619 u.u_error = ENXIO;
620 else
621 physio(rlstrategy, &rrlbuf[unit], dev, B_WRITE, minphys);
622}
623
624/*
625 * Reset driver after UBA init.
626 * Cancel software state of all pending transfers
627 * and restart all units and the controller.
628 */
629rlreset(uban)
630 int uban;
631{
632 register struct uba_ctlr *um;
633 register struct uba_device *ui;
634 register struct rldevice *rladdr;
635 register struct rl_stat *st;
636 register int rl21, unit;
637
638 for (rl21 = 0; rl21 < NHL; rl21++) {
639 if ((um = rlminfo[rl21]) == 0 || um->um_ubanum != uban ||
640 um->um_alive == 0)
641 continue;
642 printf(" Reset hl%d", rl21);
643 rladdr = (struct rldevice *)um->um_addr;
644 st = &rl_stat[rl21];
645 um->um_tab.b_active = 0;
646 um->um_tab.b_actf = um->um_tab.b_actl = 0;
647 if (um->um_ubinfo) {
648 printf("<%d>", (um->um_ubinfo>>28)&0xf);
649 ubadone(um);
650 }
651
652 /* reset controller */
653 st->rl_dn = -1;
654 st->rl_cylnhd = 0;
655 st->rl_bleft = 0;
656 st->rl_bpart = 0;
657 rlwait( rladdr );
658
659 for (unit = 0; unit < NRL; unit++) {
660 rladdr->rlcs = (unit << 8) | RL_GETSTAT;
661 rlwait( rladdr );
662
663 /* Determine disk posistion */
664 rladdr->rlcs = (unit << 8) | RL_RHDR;
665 rlwait(rladdr);
666
667 /* save disk drive posistion */
668 st->rl_cyl[unit] =
669 (rladdr->rlmp.readhdr & 0177700) >> 6;
670
671 if ((ui = rldinfo[unit]) == 0)
672 continue;
673 if (ui->ui_alive == 0 || ui->ui_mi != um)
674 continue;
675 rlutab[unit].b_active = 0;
676 (void) rlustart(ui);
677 }
678 (void) rlstart(um);
679 }
680}
681
682/*
683 * Wake up every second and if an interrupt is pending
684 * but nothing has happened increment a counter.
685 * If nothing happens for 20 seconds, reset the UNIBUS
686 * and begin anew.
687 */
688rlwatch()
689{
690 register struct uba_ctlr *um;
691 register rl21, unit;
692 register struct rl_softc *rl;
693
694 timeout(rlwatch, (caddr_t)0, hz);
695 for (rl21 = 0; rl21 < NHL; rl21++) {
696 um = rlminfo[rl21];
697 if (um == 0 || um->um_alive == 0)
698 continue;
699 rl = &rl_softc[rl21];
700 if (um->um_tab.b_active == 0) {
701 for (unit = 0; unit < NRL; unit++)
702 if (rlutab[unit].b_active &&
703 rldinfo[unit]->ui_mi == um)
704 goto active;
705 rl->rl_wticks = 0;
706 continue;
707 }
708active:
709 rl->rl_wticks++;
710 if (rl->rl_wticks >= 20) {
711 rl->rl_wticks = 0;
712 printf("hl%d: lost interrupt\n", rl21);
713 ubareset(um->um_ubanum);
714 }
715 }
716}
717
718rldump(dev)
719 dev_t dev;
720{
721 /* don't think there is room on swap for it anyway. */
722}