make depend
[unix-history] / usr / src / sys / vax / stand / uda.c
index 5f66b7e..b0c2077 100644 (file)
@@ -1,4 +1,10 @@
-/*     uda.c   4.4     82/12/17        */
+/*
+ * Copyright (c) 1982 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)uda.c       6.3 (Berkeley) %G%
+ */
 
 /*
  * UDA50/RAxx disk device driver
 
 /*
  * UDA50/RAxx disk device driver
@@ -24,7 +30,7 @@
 #include "../vaxuba/ubareg.h"
 #include "../vax/mscp.h"
 
 #include "../vaxuba/ubareg.h"
 #include "../vax/mscp.h"
 
-u_short udastd[] = { 0777550 };
+u_short udastd[] = { 0772150 };
 
 struct iob     cudbuf;
 
 
 struct iob     cudbuf;
 
@@ -42,43 +48,53 @@ int uda_off[] = { 0, 15884, 0, -1, -1, -1, 49324, 131404 };
 
 struct mscp *udcmd();
 
 
 struct mscp *udcmd();
 
-udopen(io)
+raopen(io)
        register struct iob *io;
 {
        register struct mscp *mp;
        register struct iob *io;
 {
        register struct mscp *mp;
+       static int udainit;
        int i;
 
        if (udaddr == 0)
                udaddr = (struct udadevice *)ubamem(io->i_unit, udastd[0]);
        if (ud_ubaddr == 0) {
        int i;
 
        if (udaddr == 0)
                udaddr = (struct udadevice *)ubamem(io->i_unit, udastd[0]);
        if (ud_ubaddr == 0) {
+               /*
+                * Initialise cudbuf.i_unit so that controllers
+                * on UNIBUSes other than 0 can be used.
+                */
+               cudbuf.i_unit = io->i_unit;
                cudbuf.i_ma = (caddr_t)&uda;
                cudbuf.i_cc = sizeof(uda);
                ud_ubaddr = (struct uda *)ubasetup(&cudbuf, 2);
        }
                cudbuf.i_ma = (caddr_t)&uda;
                cudbuf.i_cc = sizeof(uda);
                ud_ubaddr = (struct uda *)ubasetup(&cudbuf, 2);
        }
-       udaddr->udaip = 0;
-       while ((udaddr->udasa & UDA_STEP1) == 0)
-               ;
-       udaddr->udasa = UDA_ERR;
-       while ((udaddr->udasa & UDA_STEP2) == 0)
-               ;
-       udaddr->udasa = (short)&ud_ubaddr->uda_ca.ca_ringbase;
-       while ((udaddr->udasa & UDA_STEP3) == 0)
-               ;
-       udaddr->udasa = (short)(((int)&ud_ubaddr->uda_ca.ca_ringbase) >> 16);
-       while ((udaddr->udasa & UDA_STEP4) == 0)
-               ;
-       udaddr->udasa = UDA_GO;
-       uda.uda_ca.ca_rspdsc[0] = (long)&ud_ubaddr->uda_rsp.mscp_cmdref;
-       uda.uda_ca.ca_cmddsc[0] = (long)&ud_ubaddr->uda_cmd.mscp_cmdref;
-       uda.uda_cmd.mscp_cntflgs = 0;
-       if (udcmd(M_OP_STCON) == 0) {
-               _stop("ra: open error, STCON");
-               return;
-       }
-       uda.uda_cmd.mscp_unit = io->i_unit&7;
-       if (udcmd(M_OP_ONLIN) == 0) {
-               _stop("ra: open error, ONLIN");
-               return;
+       if (udainit == 0) {
+               udaddr->udaip = 0;
+               while ((udaddr->udasa & UDA_STEP1) == 0)
+                       ;
+               udaddr->udasa = UDA_ERR;
+               while ((udaddr->udasa & UDA_STEP2) == 0)
+                       ;
+               udaddr->udasa = (short)&ud_ubaddr->uda_ca.ca_ringbase;
+               while ((udaddr->udasa & UDA_STEP3) == 0)
+                       ;
+               udaddr->udasa =
+                       (short)(((int)&ud_ubaddr->uda_ca.ca_ringbase) >> 16);
+               while ((udaddr->udasa & UDA_STEP4) == 0)
+                       ;
+               udaddr->udasa = UDA_GO;
+               uda.uda_ca.ca_rspdsc[0] = (long)&ud_ubaddr->uda_rsp.mscp_cmdref;
+               uda.uda_ca.ca_cmddsc[0] = (long)&ud_ubaddr->uda_cmd.mscp_cmdref;
+               uda.uda_cmd.mscp_cntflgs = 0;
+               if (udcmd(M_OP_STCON) == 0) {
+                       _stop("ra: open error, STCON");
+                       return;
+               }
+               uda.uda_cmd.mscp_unit = io->i_unit&7;
+               if (udcmd(M_OP_ONLIN) == 0) {
+                       _stop("ra: open error, ONLIN");
+                       return;
+               }
+               udainit = 1;
        }
        if (io->i_boff < 0 || io->i_boff > 7 || uda_off[io->i_boff] == -1)
                _stop("ra: bad unit");
        }
        if (io->i_boff < 0 || io->i_boff > 7 || uda_off[io->i_boff] == -1)
                _stop("ra: bad unit");
@@ -112,7 +128,7 @@ udcmd(op)
        return(mp);
 }
 
        return(mp);
 }
 
-udstrategy(io, func)
+rastrategy(io, func)
        register struct iob *io;
 {
        register struct mscp *mp;
        register struct iob *io;
 {
        register struct mscp *mp;
@@ -132,3 +148,13 @@ udstrategy(io, func)
        ubafree(io, ubinfo);
        return(io->i_cc);
 }
        ubafree(io, ubinfo);
        return(io->i_cc);
 }
+
+/*ARGSUSED*/
+raioctl(io, cmd, arg)
+       struct iob *io;
+       int cmd;
+       caddr_t arg;
+{
+
+       return (ECMD);
+}