add CCI credit, rm unneeded wakup; how can 2 closes
[unix-history] / usr / src / sys / tahoe / vba / mp.c
index dbd5bad..40b3678 100644 (file)
@@ -1,4 +1,24 @@
-/*     mp.c    1.1     87/11/17        */
+/*
+ * Copyright (c) 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Computer Consoles Inc.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *     @(#)mp.c        7.6 (Berkeley) %G%
+ */
 
 #include "mp.h"
 #if NMP > 0
 
 #include "mp.h"
 #if NMP > 0
@@ -6,9 +26,6 @@
  * Multi Protocol Communications Controller (MPCC).
  * Asynchronous Terminal Protocol Support.
  */
  * Multi Protocol Communications Controller (MPCC).
  * Asynchronous Terminal Protocol Support.
  */
-#include "../machine/pte.h"
-#include "../machine/mtpr.h"
-
 #include "param.h"
 #include "ioctl.h"
 #include "tty.h"
 #include "param.h"
 #include "ioctl.h"
 #include "tty.h"
@@ -25,6 +42,9 @@
 #include "kernel.h"
 #include "clist.h"
 
 #include "kernel.h"
 #include "clist.h"
 
+#include "../machine/pte.h"
+#include "../machine/mtpr.h"
+
 #include "../tahoevba/vbavar.h"
 #include "../tahoevba/mpreg.h"
 
 #include "../tahoevba/vbavar.h"
 #include "../tahoevba/mpreg.h"
 
@@ -92,6 +112,7 @@ mpprobe(reg, vi)
 #ifdef lint
        br = 0; cvec = br; br = cvec;
        mpintr(0);
 #ifdef lint
        br = 0; cvec = br; br = cvec;
        mpintr(0);
+       mpdlintr(0);
 #endif
        if (badaddr(reg, 2))
                return (0);
 #endif
        if (badaddr(reg, 2))
                return (0);
@@ -107,7 +128,7 @@ mpprobe(reg, vi)
        ms->ms_mb = (struct mblok *)ms->ms_buf.vb_rawbuf;
        ms->ms_ivec = MPINTRBASE + 2*vi->ui_unit;       /* XXX */
        br = 0x14, cvec = ms->ms_ivec;                  /* XXX */
        ms->ms_mb = (struct mblok *)ms->ms_buf.vb_rawbuf;
        ms->ms_ivec = MPINTRBASE + 2*vi->ui_unit;       /* XXX */
        br = 0x14, cvec = ms->ms_ivec;                  /* XXX */
-       return (sizeof (struct mblok));
+       return (sizeof (*reg));
 }
 
 mpattach(vi)
 }
 
 mpattach(vi)
@@ -129,6 +150,7 @@ mpattach(vi)
 /*
  * Open an mpcc port.
  */
 /*
  * Open an mpcc port.
  */
+/* ARGSUSED */
 mpopen(dev, mode)
        dev_t dev;
 {
 mpopen(dev, mode)
        dev_t dev;
 {
@@ -157,39 +179,32 @@ mpopen(dev, mode)
                sleep((caddr_t)&tp->t_canq, TTIPRI);
        while (tp->t_state & TS_WOPEN) 
                sleep((caddr_t)&tp->t_canq, TTIPRI);
                sleep((caddr_t)&tp->t_canq, TTIPRI);
        while (tp->t_state & TS_WOPEN) 
                sleep((caddr_t)&tp->t_canq, TTIPRI);
-       if (tp->t_state & TS_ISOPEN) {
-               splx(s);
-               return (0);
-       }
        tp->t_state |= TS_WOPEN;
        tp->t_addr = (caddr_t)ms;
        tp->t_oproc = mpstart;
        tp->t_dev = dev;
        tp->t_state |= TS_WOPEN;
        tp->t_addr = (caddr_t)ms;
        tp->t_oproc = mpstart;
        tp->t_dev = dev;
-       ttychars(tp);
-       if (tp->t_ispeed == 0) {
-               tp->t_ispeed = B9600;
-               tp->t_ospeed = B9600;
-               tp->t_flags |= ODDP|EVENP|ECHO;
-       }
-       /*
-        * Initialize port state: init MPCC interface
-        * structures for port and setup modem control.
-        */
-       mp->mp_proto = MPPROTO_ASYNC;           /* XXX */
-       error = mpportinit(ms, mp, port);
-       if (error)
-               goto bad;
-       ev = mpparam(unit);
-       if (ev == 0) {
-               error = ENOBUFS;
-               goto bad;
+       if ((tp->t_state & TS_ISOPEN) == 0) {
+               ttychars(tp);
+               if (tp->t_ispeed == 0) {
+                       tp->t_ispeed = B9600;
+                       tp->t_ospeed = B9600;
+                       tp->t_flags = ODDP|EVENP|ECHO;
+               }
+               /*
+                * Initialize port state: init MPCC interface
+                * structures for port and setup modem control.
+                */
+               mp->mp_proto = MPPROTO_ASYNC;           /* XXX */
+               error = mpportinit(ms, mp, port);
+               if (error)
+                       goto bad;
+               ev = mpparam(unit);
+               if (ev == 0) {
+                       error = ENOBUFS;
+                       goto bad;
+               }
+               mpcmd(ev, EVCMD_OPEN, 0, ms->ms_mb, port);
        }
        }
-       mpcmd(ev, EVCMD_OPEN, 0, ms->ms_mb, port);
-       while ((tp->t_state & TS_CARR_ON) == 0)
-               sleep((caddr_t)&tp->t_rawq, TTIPRI);
-       error = mpmodem(unit, MMOD_ON);
-       if (error)
-               goto bad;
        while ((tp->t_state & TS_CARR_ON) == 0)
                sleep((caddr_t)&tp->t_rawq, TTIPRI);
        error = (*linesw[tp->t_line].l_open)(dev,tp);
        while ((tp->t_state & TS_CARR_ON) == 0)
                sleep((caddr_t)&tp->t_rawq, TTIPRI);
        error = (*linesw[tp->t_line].l_open)(dev,tp);
@@ -207,7 +222,8 @@ bad:
 /*
  * Close an mpcc port.
  */
 /*
  * Close an mpcc port.
  */
-mpclose(dev)
+/* ARGSUSED */
+mpclose(dev, flag)
        dev_t dev;
 {
        register struct tty *tp;
        dev_t dev;
 {
        register struct tty *tp;
@@ -222,7 +238,7 @@ mpclose(dev)
        mb = mp_softc[MPUNIT(unit)].ms_mb;
        mp = &mb->mb_port[port];
        s = spl8();
        mb = mp_softc[MPUNIT(unit)].ms_mb;
        mp = &mb->mb_port[port];
        s = spl8();
-       if (mp->mp_flags & MP_PROGRESS) {               /* close in progress */
+       if (mp->mp_flags & MP_PROGRESS) {       /* close in progress??? */
                if (mp->mp_flags & MP_REMBSY) {
                        mp->mp_flags &= ~MP_REMBSY;
                        splx(s);
                if (mp->mp_flags & MP_REMBSY) {
                        mp->mp_flags &= ~MP_REMBSY;
                        splx(s);
@@ -234,20 +250,18 @@ mpclose(dev)
        error = 0;
        mp->mp_flags |= MP_PROGRESS;
        (*linesw[tp->t_line].l_close)(tp);
        error = 0;
        mp->mp_flags |= MP_PROGRESS;
        (*linesw[tp->t_line].l_close)(tp);
-       if (tp->t_state & TS_HUPCLS || (tp->t_state & TS_ISOPEN) == 0) 
-               if (error = mpmodem(unit, MMOD_OFF)) {
-                       mp->mp_flags &= ~MP_PROGRESS;
-                       goto out;
-               }
-       while (tp->t_state & TS_FLUSH)                  /* ??? */
-               sleep((caddr_t)&tp->t_state, TTOPRI);   /* ??? */
-       ttyclose(tp);
        ev = mp_getevent(mp, unit);
        if (ev == 0) {
        ev = mp_getevent(mp, unit);
        if (ev == 0) {
-                error = ENOBUFS;
-                goto out;
+               error = ENOBUFS;
+               mp->mp_flags &= ~MP_PROGRESS;
+               goto out;
        }
        }
+       if (tp->t_state & TS_HUPCLS || (tp->t_state & TS_ISOPEN) == 0)
+               mpmodem(unit, MMOD_OFF);
+       else
+               mpmodem(unit, MMOD_ON);
        mpcmd(ev, EVCMD_CLOSE, 0, mb, port);
        mpcmd(ev, EVCMD_CLOSE, 0, mb, port);
+       ttyclose(tp);
 out:
        if (mp->mp_flags & MP_REMBSY)
                mpclean(mb, port);
 out:
        if (mp->mp_flags & MP_REMBSY)
                mpclean(mb, port);
@@ -305,7 +319,7 @@ mpioctl(dev, cmd, data, flag)
        error = ttioctl(tp, cmd, data, flag);
        if (error >= 0) {
                if (cmd == TIOCSETP || cmd == TIOCSETN || cmd == TIOCLBIS ||
        error = ttioctl(tp, cmd, data, flag);
        if (error >= 0) {
                if (cmd == TIOCSETP || cmd == TIOCSETN || cmd == TIOCLBIS ||
-                   cmd == TIOCLBIC || cmd == TIOCLSET) {
+                   cmd == TIOCLBIC || cmd == TIOCLSET || cmd == TIOCSETC) {
                        ev = mpparam(unit);
                        if (ev == 0)
                                error = ENOBUFS;
                        ev = mpparam(unit);
                        if (ev == 0)
                                error = ENOBUFS;
@@ -363,11 +377,13 @@ mpparam(unit)
        tp = &mp_tty[unit];
        /* YUCK */
        asp = &ms->ms_async[port][mp->mp_on?mp->mp_on-1:MPINSET-1];
        tp = &mp_tty[unit];
        /* YUCK */
        asp = &ms->ms_async[port][mp->mp_on?mp->mp_on-1:MPINSET-1];
-       asp->ap_xon = tp->t_startc;
-       asp->ap_xoff = tp->t_stopc;
-       asp->ap_xena =
-           (tp->t_flags & (RAW|TANDEM)) == TANDEM ? MPA_ENA : MPA_DIS;
-       asp->ap_xany = (tp->t_flags & DECCTQ ? MPA_DIS : MPA_ENA);
+       asp->ap_xon = (u_char)tp->t_startc;
+       asp->ap_xoff = (u_char)tp->t_stopc;
+       if ((tp->t_flags & RAW) || (tp->t_stopc == -1) || (tp->t_startc == -1))
+               asp->ap_xena = MPA_DIS;
+       else
+               asp->ap_xena = MPA_ENA;
+       asp->ap_xany = ((tp->t_flags & DECCTQ) ? MPA_DIS : MPA_ENA);
 #ifdef notnow
        if (tp->t_flags & (RAW|LITOUT|PASS8)) {
 #endif
 #ifdef notnow
        if (tp->t_flags & (RAW|LITOUT|PASS8)) {
 #endif
@@ -452,7 +468,7 @@ mpstart(tp)
                                break;
                        }
                }
                                break;
                        }
                }
-               hxp->dblock[i] = (caddr_t)vtoph(0, (int)outq.c_cf);
+               hxp->dblock[i] = (caddr_t)kvtophys(outq.c_cf);
                hxp->size[i] = n;
                xcnt++;         /* count of xmts to send */
                ndadvance(&outq, n);
                hxp->size[i] = n;
                xcnt++;         /* count of xmts to send */
                ndadvance(&outq, n);
@@ -516,13 +532,12 @@ out:
 /*
  * Stop output on a line, e.g. for ^S/^Q or output flush.
  */
 /*
  * Stop output on a line, e.g. for ^S/^Q or output flush.
  */
+/* ARGSUSED */
 mpstop(tp, rw)
        register struct tty *tp;
        int rw;
 {
 mpstop(tp, rw)
        register struct tty *tp;
        int rw;
 {
-       int s, port;
-       struct mpevent *ev;
-       struct mblok *mb;
+       int s;
 
        s = spl8();
        /* XXX: DISABLE TRANSMITTER */
 
        s = spl8();
        /* XXX: DISABLE TRANSMITTER */
@@ -556,8 +571,8 @@ mpportinit(ms, mp, port)
                ev->ev_error = 0;
                ev->ev_flags = 0;
                ev->ev_count = 0;
                ev->ev_error = 0;
                ev->ev_flags = 0;
                ev->ev_count = 0;
-               ev->ev_un.hxl = (struct hxmtl *) vtoph(0, &ms->ms_hxl[port]);
-               ev->ev_params = (caddr_t) vtoph(0, &ms->ms_async[port][i]);
+               ev->ev_un.hxl = (struct hxmtl *) kvtophys(&ms->ms_hxl[port]);
+               ev->ev_params = (caddr_t) kvtophys(&ms->ms_async[port][i]);
        }
        ev = &mp->mp_sendq[0];
        for (i = 0; ev < &mp->mp_sendq[MPOUTSET]; ev++, i++) {
        }
        ev = &mp->mp_sendq[0];
        for (i = 0; ev < &mp->mp_sendq[MPOUTSET]; ev++, i++) {
@@ -569,8 +584,8 @@ mpportinit(ms, mp, port)
                ev->ev_flags = 0;
                ev->ev_count = 0;
                ptr = (caddr_t) &ms->ms_cbuf[port][i][0];
                ev->ev_flags = 0;
                ev->ev_count = 0;
                ptr = (caddr_t) &ms->ms_cbuf[port][i][0];
-               ev->ev_un.rcvblk = (u_char *)vtoph(0, ptr);
-               ev->ev_params = (caddr_t) vtoph(0, ptr);
+               ev->ev_un.rcvblk = (u_char *)kvtophys(ptr);
+               ev->ev_params = (caddr_t) kvtophys(ptr);
        }
        return (0);
 }
        }
        return (0);
 }
@@ -613,7 +628,7 @@ mp_getevent(mp, unit)
         * If not a close request, verify one extra
         * event is available for closing the port.
         */
         * If not a close request, verify one extra
         * event is available for closing the port.
         */
-       if ((mp->mp_flags && MP_PROGRESS) == 0) {
+       if ((mp->mp_flags & MP_PROGRESS) == 0) {
                if ((i = mp->mp_on + 1) >= MPINSET)
                        i = 0;
                if (mp->mp_recvq[i].ev_status != EVSTATUS_FREE)
                if ((i = mp->mp_on + 1) >= MPINSET)
                        i = 0;
                if (mp->mp_recvq[i].ev_status != EVSTATUS_FREE)
@@ -640,14 +655,9 @@ mpmodem(unit, flag)
        struct mpsoftc *ms = &mp_softc[MPUNIT(unit)];
        int port = MPPORT(unit);
        register struct mpport *mp;
        struct mpsoftc *ms = &mp_softc[MPUNIT(unit)];
        int port = MPPORT(unit);
        register struct mpport *mp;
-       register struct mpevent *ev;
        register struct asyncparam *asp;
 
        mp = &ms->ms_mb->mb_port[port];
        register struct asyncparam *asp;
 
        mp = &ms->ms_mb->mb_port[port];
-       ev = mp_getevent(mp, unit);
-       if (ev == 0)
-               return (ENOBUFS);
-       /* YUCK */
        asp = &ms->ms_async[port][mp->mp_on?mp->mp_on-1:MPINSET-1];
        if (flag == MMOD_ON) {
                if (ms->ms_softCAR & (1 << port))
        asp = &ms->ms_async[port][mp->mp_on?mp->mp_on-1:MPINSET-1];
        if (flag == MMOD_ON) {
                if (ms->ms_softCAR & (1 << port))
@@ -659,8 +669,6 @@ mpmodem(unit, flag)
                setm(&asp->ap_modem, 0, DROP);
                seti(&asp->ap_intena, 0);
        }
                setm(&asp->ap_modem, 0, DROP);
                seti(&asp->ap_intena, 0);
        }
-       mpcmd(ev, EVCMD_IOCTL, A_MDMCHG, ms->ms_mb, port);
-       return (0);
 }
 
 /*
 }
 
 /*
@@ -719,13 +727,11 @@ mpcleanport(mb, port)
        mp = &mb->mb_port[port];
        if (mp->mp_proto == MPPROTO_ASYNC) {
                mp->mp_flags = MP_REMBSY;
        mp = &mb->mb_port[port];
        if (mp->mp_proto == MPPROTO_ASYNC) {
                mp->mp_flags = MP_REMBSY;
-               /* flush I/O queues and send hangup signals */
+               /* signal loss of carrier and close */
                tp = &mp_tty[mb->mb_unit*MPCHUNK+port];
                tp = &mp_tty[mb->mb_unit*MPCHUNK+port];
-               tp->t_state &= ~TS_CARR_ON;
                ttyflush(tp, FREAD|FWRITE);
                ttyflush(tp, FREAD|FWRITE);
-               gsignal(tp->t_pgrp, SIGHUP);
-               gsignal(tp->t_pgrp, SIGKILL);
-               mpclose(tp->t_dev, 0);
+               (void) (*linesw[tp->t_line].l_modem)(tp, 0);
+               (void) mpclose(tp->t_dev, 0);
        }
 }
 
        }
 }
 
@@ -736,7 +742,7 @@ mpclean(mb, port)
        register struct mpport *mp;
        register struct mpevent *ev;
        register int i;
        register struct mpport *mp;
        register struct mpevent *ev;
        register int i;
-       char list[2], *cp;
+       u_char list[2];
        int unit;
 
        mp = &mb->mb_port[port];
        int unit;
 
        mp = &mb->mb_port[port];
@@ -780,7 +786,6 @@ mpintr(mpcc)
 {
        register struct mblok *mb;
        register struct his *his;
 {
        register struct mblok *mb;
        register struct his *his;
-       register int i;
 
        mb = mp_softc[mpcc].ms_mb;
        if (mb == 0) {
 
        mb = mp_softc[mpcc].ms_mb;
        if (mb == 0) {
@@ -805,7 +810,7 @@ mpintr(mpcc)
  * Handler for processing completion of transmitted events.
  */
 mpxintr(unit, list)
  * Handler for processing completion of transmitted events.
  */
 mpxintr(unit, list)
-       register char *list;
+       register u_char *list;
 {
        register struct mpport *mp;
        register struct mpevent *ev;
 {
        register struct mpport *mp;
        register struct mpevent *ev;
@@ -828,7 +833,7 @@ mpxintr(unit, list)
                for(; ev->ev_status & EVSTATUS_DONE; ev = nextevent(mp)) {
                        /* YUCK */
                        ap = &ms->ms_async[port][mp->mp_off];
                for(; ev->ev_status & EVSTATUS_DONE; ev = nextevent(mp)) {
                        /* YUCK */
                        ap = &ms->ms_async[port][mp->mp_off];
-                       mppurge(ap, sizeof (*ap));
+                       mppurge((caddr_t)ap, (int)sizeof (*ap));
                        switch (ev->ev_cmd) {
                        case EVCMD_OPEN:
                                /*
                        switch (ev->ev_cmd) {
                        case EVCMD_OPEN:
                                /*
@@ -856,7 +861,7 @@ mpxintr(unit, list)
                                mp->mp_on = mp->mp_off = mp->mp_nextrcv = 0;
                                mp->mp_flags &= ~MP_PROGRESS;
                                mp->mp_proto = MPPROTO_UNUSED;
                                mp->mp_on = mp->mp_off = mp->mp_nextrcv = 0;
                                mp->mp_flags &= ~MP_PROGRESS;
                                mp->mp_proto = MPPROTO_UNUSED;
-                               wakeup((caddr_t)&tp->t_canq);   /* ??? */
+                               wakeup((caddr_t)&tp->t_canq);
                                goto done;
                        case EVCMD_IOCTL:
                                /*
                                goto done;
                        case EVCMD_IOCTL:
                                /*
@@ -869,16 +874,15 @@ mpxintr(unit, list)
                                 * state and restart output.
                                 */
                                tp->t_state &= ~TS_BUSY;
                                 * state and restart output.
                                 */
                                tp->t_state &= ~TS_BUSY;
-                               if (tp->t_state & TS_FLUSH) {
+                               if (tp->t_state & TS_FLUSH)
                                        tp->t_state &= ~TS_FLUSH;
                                        tp->t_state &= ~TS_FLUSH;
-                                       wakeup((caddr_t)&tp->t_state);
-                               } else {
-                                       register int cc = 0, i;
+                               else {
+                                       register int cc = 0, n;
                                        struct hxmtl *hxp;
 
                                        hxp = &ms->ms_hxl[port];
                                        struct hxmtl *hxp;
 
                                        hxp = &ms->ms_hxl[port];
-                                       for(i = 0; i < ev->ev_count; i++)
-                                               cc += hxp->size[i];
+                                       for(n = 0; n < ev->ev_count; n++)
+                                               cc += hxp->size[n];
                                        ndflush(&tp->t_outq, cc);
                                }
                                switch (ev->ev_error) {
                                        ndflush(&tp->t_outq, cc);
                                }
                                switch (ev->ev_error) {
@@ -892,7 +896,7 @@ mpxintr(unit, list)
                                mpstart(tp);
                                break;
                        default:
                                mpstart(tp);
                                break;
                        default:
-                               mplog(unit, port, A_INVCMD, ev->ev_cmd);  
+                               mplog(unit, port, A_INVCMD, (int)ev->ev_cmd);  
                                break;
                        }
                        /* re-init all values in this entry */
                                break;
                        }
                        /* re-init all values in this entry */
@@ -915,7 +919,7 @@ done:
  * Handler for processing received events.
  */
 mprintr(unit, list)
  * Handler for processing received events.
  */
 mprintr(unit, list)
-       char *list;
+       u_char *list;
 {
        register struct tty *tp;
        register struct mpport *mp;
 {
        register struct tty *tp;
        register struct mpport *mp;
@@ -938,7 +942,7 @@ mprintr(unit, list)
                        if (ev->ev_cmd != EVCMD_READ &&
                            ev->ev_cmd != EVCMD_STATUS) {
                                mplog(unit, port, "unexpected command",
                        if (ev->ev_cmd != EVCMD_READ &&
                            ev->ev_cmd != EVCMD_STATUS) {
                                mplog(unit, port, "unexpected command",
-                                   ev->ev_cmd);
+                                   (int)ev->ev_cmd);
                                goto next;
                        }
                        if (ev->ev_cmd == EVCMD_STATUS) {
                                goto next;
                        }
                        if (ev->ev_cmd == EVCMD_STATUS) {
@@ -952,7 +956,7 @@ mprintr(unit, list)
                                else
                                        mplog(unit, port,
                                            "unexpect status command",
                                else
                                        mplog(unit, port,
                                            "unexpect status command",
-                                           ev->ev_opts);
+                                           (int)ev->ev_opts);
                                goto next;
                        }
                        /*
                                goto next;
                        }
                        /*
@@ -982,17 +986,16 @@ mprintr(unit, list)
                        }
                        /* setup for next read */
                        ptr = (caddr_t)&mp_softc[unit].ms_cbuf[port][mp->mp_nextrcv][0];
                        }
                        /* setup for next read */
                        ptr = (caddr_t)&mp_softc[unit].ms_cbuf[port][mp->mp_nextrcv][0];
-                       ev->ev_un.rcvblk = (u_char *)vtoph(0, ptr);
-                       ev->ev_params = (caddr_t) vtoph(0, ptr);
-                        switch(ev->ev_error) {
-                        case RCVDTA:    /* Normal (good) rcv data */
-                                rcverr = (char *)0;
-                               break;
-                       case PARERR:    /* parity error */
-                               rcverr = "parity error";
-                               break;
+                       ev->ev_un.rcvblk = (u_char *)kvtophys(ptr);
+                       ev->ev_params = (caddr_t) kvtophys(ptr);
+                       switch(ev->ev_error) {
+                       case RCVDTA:    /* Normal (good) rcv data */
+                                       /* do not report the following */
+                                       /* they are "normal" errors */
                        case FRAMERR:   /* frame error */
                        case FRAMERR:   /* frame error */
-                               rcverr = "frame error";
+                       case BRKASRT:   /* Break condition */
+                       case PARERR:    /* parity error */
+                               rcverr = (char *)0;
                                break;
                        case OVRNERR:   /* Overrun error */
                                rcverr = "overrun error";
                                break;
                        case OVRNERR:   /* Overrun error */
                                rcverr = "overrun error";
@@ -1004,7 +1007,7 @@ mprintr(unit, list)
                                rcverr = "undefined rcv error";
                        }
                        if (rcverr != (char *)0)
                                rcverr = "undefined rcv error";
                        }
                        if (rcverr != (char *)0)
-                               mplog(unit, port, rcverr, ev->ev_error);
+                               mplog(unit, port, rcverr, (int)ev->ev_error);
                next:
                        ev->ev_cmd = 0;
                        ev->ev_opts = 0;
                next:
                        ev->ev_cmd = 0;
                        ev->ev_opts = 0;
@@ -1047,7 +1050,6 @@ mptimeint(mb)
  */
 mpintmpcc(mb, port)
        register struct mblok *mb;
  */
 mpintmpcc(mb, port)
        register struct mblok *mb;
-       u_short port;
 {
 
         mb->mb_intr[port] |= MPSEMA_WORK;
 {
 
         mb->mb_intr[port] |= MPSEMA_WORK;
@@ -1055,12 +1057,12 @@ mpintmpcc(mb, port)
                 mb->mb_mpintcnt = 0;
                *(u_short *)mpinfo[mb->mb_unit]->ui_addr = 2;
                 if (mb->mb_mpintclk) {
                 mb->mb_mpintcnt = 0;
                *(u_short *)mpinfo[mb->mb_unit]->ui_addr = 2;
                 if (mb->mb_mpintclk) {
-                        untimeout(mptimeint, mb);
+                        untimeout(mptimeint, (caddr_t)mb);
                         mb->mb_mpintclk = 0;
                 }
         } else {
                 if (mb->mb_mpintclk == 0) {
                         mb->mb_mpintclk = 0;
                 }
         } else {
                 if (mb->mb_mpintclk == 0) {
-                        timeout(mptimeint, mb, 4);
+                        timeout(mptimeint, (caddr_t)mb, 4);
                         mb->mb_mpintclk = (caddr_t)1;
                 }
         }
                         mb->mb_mpintclk = (caddr_t)1;
                 }
         }
@@ -1162,8 +1164,8 @@ mpdlwrite(dev, uio)
                return (EFAULT);
        dl = &ms->ms_mb->mb_dl;
        dl->mpdl_count = uio->uio_iov->iov_len;
                return (EFAULT);
        dl = &ms->ms_mb->mb_dl;
        dl->mpdl_count = uio->uio_iov->iov_len;
-       dl->mpdl_data = (caddr_t) vtoph((struct proc *)0, mpdlbuf);
-       if (error = uiomove(mpdlbuf, dl->mpdl_count, UIO_WRITE, uio))
+       dl->mpdl_data = (caddr_t) kvtophys(mpdlbuf);
+       if (error = uiomove(mpdlbuf, (int)dl->mpdl_count, UIO_WRITE, uio))
                return (error);
        uio->uio_resid -= dl->mpdl_count;    /* set up return from write */
        dl->mpdl_cmd = MPDLCMD_NORMAL;
                return (error);
        uio->uio_resid -= dl->mpdl_count;    /* set up return from write */
        dl->mpdl_cmd = MPDLCMD_NORMAL;
@@ -1175,7 +1177,6 @@ mpdlclose(dev)
        dev_t dev;
 {
        register struct mblok *mb = mp_softc[MPUNIT(minor(dev))].ms_mb;
        dev_t dev;
 {
        register struct mblok *mb = mp_softc[MPUNIT(minor(dev))].ms_mb;
-       int ret = 0;
 
        if (mb == 0 || mb->mb_status != MP_DLDONE) {
                mpbogus.status = 0;
 
        if (mb == 0 || mb->mb_status != MP_DLDONE) {
                mpbogus.status = 0;
@@ -1192,13 +1193,14 @@ mpdlclose(dev)
 
 int    mpdltimeout();
 
 
 int    mpdltimeout();
 
+/* ARGSUSED */
 mpdlioctl(dev, cmd, data, flag)
        dev_t dev;
        caddr_t data;
 {
        register struct mblok *mb;
        register struct mpdl *dl;
 mpdlioctl(dev, cmd, data, flag)
        dev_t dev;
        caddr_t data;
 {
        register struct mblok *mb;
        register struct mpdl *dl;
-       int unit, error, s, i, j;
+       int unit, error, s, i;
 
        mb = mp_softc[unit=MPUNIT(minor(dev))].ms_mb;
        if (mb == 0)
 
        mb = mp_softc[unit=MPUNIT(minor(dev))].ms_mb;
        if (mb == 0)
@@ -1229,7 +1231,7 @@ mpdlioctl(dev, cmd, data, flag)
                break;
        case MPIOASYNCNF:
                bcopy(data, mpdlbuf, sizeof (struct abdcf));
                break;
        case MPIOASYNCNF:
                bcopy(data, mpdlbuf, sizeof (struct abdcf));
-               dl->mpdl_data = (caddr_t) vtoph((struct proc *)0, mpdlbuf);
+               dl->mpdl_data = (caddr_t) kvtophys(mpdlbuf);
                dl->mpdl_count = sizeof (struct abdcf);
                dl->mpdl_cmd = MPIOASYNCNF&IOCPARM_MASK;
                error = mpdlwait(dl);
                dl->mpdl_count = sizeof (struct abdcf);
                dl->mpdl_cmd = MPIOASYNCNF&IOCPARM_MASK;
                error = mpdlwait(dl);
@@ -1254,11 +1256,11 @@ mpdlioctl(dev, cmd, data, flag)
                mb->mb_diagswitch[1] = 'P';
                s = spl8();
                *(u_short *)mpinfo[unit]->ui_addr = 2;
                mb->mb_diagswitch[1] = 'P';
                s = spl8();
                *(u_short *)mpinfo[unit]->ui_addr = 2;
-               timeout(mpdltimeout, mb, 30*hz);        /* approx 15 seconds */
+               timeout(mpdltimeout, (caddr_t)mb, 30*hz);
                sleep((caddr_t)&mb->mb_status, PZERO+1);
                splx(s);
                if (mb->mb_status == MP_DLOPEN) {
                sleep((caddr_t)&mb->mb_status, PZERO+1);
                splx(s);
                if (mb->mb_status == MP_DLOPEN) {
-                       untimeout(mpdltimeout, mb);
+                       untimeout(mpdltimeout, (caddr_t)mb);
                } else if (mb->mb_status == MP_DLTIME) {
                        mpbogus.status = 0;
                        error = ETIMEDOUT;
                } else if (mb->mb_status == MP_DLTIME) {
                        mpbogus.status = 0;
                        error = ETIMEDOUT;
@@ -1268,7 +1270,7 @@ mpdlioctl(dev, cmd, data, flag)
                        log(LOG_ERR, "mp%d: start download: unknown status %x",
                            unit, mb->mb_status);
                }
                        log(LOG_ERR, "mp%d: start download: unknown status %x",
                            unit, mb->mb_status);
                }
-               bzero(mb->mb_port, sizeof (mb->mb_port));
+               bzero((caddr_t)mb->mb_port, sizeof (mb->mb_port));
                break;
        case MPIORESETBOARD:
                s = spl8();
                break;
        case MPIORESETBOARD:
                s = spl8();
@@ -1339,7 +1341,7 @@ mpdlintr(mpcc)
                return;
        case MP_DLPEND:
                mb->mb_status = MP_DLOPEN;
                return;
        case MP_DLPEND:
                mb->mb_status = MP_DLOPEN;
-               wakeup(&mb->mb_status);
+               wakeup((caddr_t)&mb->mb_status);
                /* fall thru... */
        case MP_DLTIME:
                return;
                /* fall thru... */
        case MP_DLTIME:
                return;