eliminate floating point from the kernel (from forys@cs.utah.edu)
[unix-history] / usr / src / sys / vax / stand / mba.c
CommitLineData
55b4dbd0 1/*
99152021 2 * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
55b4dbd0
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
c18e27ed 6 * @(#)mba.c 7.7 (Berkeley) %G%
55b4dbd0 7 */
faeec66d 8
c18e27ed 9#include "machine/pte.h"
6810489f 10
39c71180
MK
11#include "param.h"
12#include "inode.h"
13#include "fs.h"
14#include "vm.h"
a031a31b
SL
15
16#include "../vax/mtpr.h"
17#include "../vaxmba/mbareg.h"
514820ed 18#include "../vaxmba/hpreg.h"
a031a31b 19
6810489f 20#include "saio.h"
99fe9747 21#include "savax.h"
6810489f 22
1e07c79f 23mbastart(io, unit, func)
99fe9747 24 register struct iob *io;
1e07c79f 25 int unit, func;
6810489f 26{
1e07c79f
KB
27 struct mba_regs *mba = mbamba(io->i_adapt);
28 struct mba_drv *drv = mbadrv(io->i_adapt, unit);
99fe9747 29 register struct pte *pte = mba->mba_map;
1e07c79f
KB
30 unsigned int v;
31 int npf, o, vaddr;
6810489f 32
6810489f
BJ
33 v = btop(io->i_ma);
34 o = (int)io->i_ma & PGOFSET;
35 npf = btoc(io->i_cc + o);
99fe9747 36 vaddr = o;
6810489f
BJ
37 while (--npf >= 0)
38 *(int *)pte++ = v++ | PG_V;
99fe9747
BJ
39 mba->mba_sr = -1;
40 mba->mba_bcr = -io->i_cc;
41 mba->mba_var = vaddr;
5b34c67b 42 if (io->i_flgs&F_SSI)
ac670a09 43 drv->mbd_of |= HPOF_SSEI;
514820ed
HS
44 switch (io->i_flgs & F_TYPEMASK) {
45
46 case F_RDDATA: /* standard read */
47 drv->mbd_cs1 = MB_RCOM|MB_GO;
1e07c79f 48 mbawait(io, unit);
514820ed
HS
49 return(0);
50
51 case F_WRDATA: /* standard write */
52 drv->mbd_cs1 = MB_WCOM|MB_GO;
1e07c79f 53 mbawait(io, unit);
514820ed
HS
54 return(0);
55
56 /* the following commands apply to disks only */
57
58 case F_HDR|F_RDDATA:
59 drv->mbd_cs1 = HP_RHDR|HP_GO;
60 break;
61
62 case F_HDR|F_WRDATA:
63 drv->mbd_cs1 = HP_WHDR|HP_GO;
64 break;
65
66 case F_CHECK|F_WRDATA:
67 case F_CHECK|F_RDDATA:
68 drv->mbd_cs1 = HP_WCDATA|HP_GO;
69 break;
70
71 case F_HCHECK|F_WRDATA:
72 case F_HCHECK|F_RDDATA:
73 drv->mbd_cs1 = HP_WCHDR|HP_GO;
74 break;
75
76 default:
5b34c67b 77 goto error;
514820ed 78 }
1e07c79f 79 mbawait(io, unit);
514820ed
HS
80 if ((drv->mbd_dt & MBDT_TAP) == 0)
81 return (0);
5b34c67b
SL
82error:
83 io->i_error = ECMD;
84 io->i_flgs &= ~F_TYPEMASK;
85 return (1);
6810489f 86}
56a904c5 87
1e07c79f 88mbawait(io, unit)
5f8a4923 89 register struct iob *io;
1e07c79f 90 int unit;
5f8a4923 91{
1e07c79f
KB
92 struct mba_regs *mba = mbamba(io->i_adapt);
93 struct mba_drv *drv = mbadrv(io->i_adapt, unit);
5f8a4923
SL
94
95 while (mba->mba_sr & MBSR_DTBUSY)
96 DELAY(100);
97}
98
56a904c5
BJ
99mbainit(mbanum)
100 int mbanum;
101{
99152021 102 register struct mba_regs *mba;
56a904c5 103
99152021
MK
104 if (mbanum >= nmba)
105 return (0);
106 mba = mbaddr[mbanum];
0187d43c 107 if (badaddr((char *)mba, sizeof(long)))
80c81fbf 108 return (0);
39c71180
MK
109 if ((mbaact & (1<<mbanum)) == 0) {
110 mba->mba_cr = MBCR_INIT;
111 mbaact |= 1<<mbanum;
112 }
80c81fbf 113 return (1);
56a904c5 114}