diff options
author | Michael Shalayeff <mickey@cvs.openbsd.org> | 1996-05-03 09:10:29 +0000 |
---|---|---|
committer | Michael Shalayeff <mickey@cvs.openbsd.org> | 1996-05-03 09:10:29 +0000 |
commit | 595cbd2e050401adf0cab2bab6ce52f902dfbb54 (patch) | |
tree | 8474c159022572bb93d15b7f2c287d1044321bc1 /sys/arch/vax/boot/ctu.c | |
parent | 3472e7ae763d3e453e57b218243b6d60ece25b43 (diff) |
sync w/ 0430
Diffstat (limited to 'sys/arch/vax/boot/ctu.c')
-rw-r--r-- | sys/arch/vax/boot/ctu.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/sys/arch/vax/boot/ctu.c b/sys/arch/vax/boot/ctu.c new file mode 100644 index 00000000000..26f29525160 --- /dev/null +++ b/sys/arch/vax/boot/ctu.c @@ -0,0 +1,181 @@ +/* $NetBSD: ctu.c,v 1.1 1996/02/17 18:23:20 ragge Exp $ */ +/* + * Copyright (c) 1996 Ludd, University of Lule}, Sweden. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed at Ludd, University of + * Lule}, Sweden and its contributors. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Standalone device driver for 11/750 Console TU58. + * It can only handle reads, and doesn't calculate checksum. + */ + +#include <sys/param.h> + +#include <lib/libsa/stand.h> + +#include <machine/mtpr.h> +#include <machine/rsp.h> + +enum tu_state { + SC_INIT, + SC_READY, + SC_SEND_CMD, + SC_GET_RESP, +}; + +volatile struct tu_softc { + enum tu_state sc_state; + char sc_rsp[15]; /* Should be struct rsb; but don't work */ + u_char *sc_xfptr; /* Current char to xfer */ + int sc_nbytes; /* Number of bytes to xfer */ + int sc_xbytes; /* Number of xfer'd bytes */ + int sc_bbytes; /* Number of xfer'd bytes this block */ +} tu_sc; + +void ctutintr __P(()); +void cturintr __P(()); + +int +ctuopen(f, adapt, ctlr, unit, part) + struct open_file *f; + int ctlr, unit, part; +{ + + tu_sc.sc_state = SC_INIT; + + mtpr(RSP_TYP_INIT, PR_CSTD); + cturintr(); + tu_sc.sc_state = SC_READY; + return 0; + +} + +int +ctustrategy(ra, func, dblk, size, buf, rsize) + struct ra_softc *ra; + int func; + daddr_t dblk; + char *buf; + u_int size, *rsize; +{ + int s; + + struct rsp *rsp = (struct rsp *)tu_sc.sc_rsp; + + tu_sc.sc_xfptr = buf; + tu_sc.sc_nbytes = size; + tu_sc.sc_xbytes = tu_sc.sc_bbytes = 0; + + rsp->rsp_typ = RSP_TYP_COMMAND; + rsp->rsp_sz = 012; + rsp->rsp_op = RSP_OP_READ; + rsp->rsp_mod = 0; + rsp->rsp_drv = 0; + rsp->rsp_sw = rsp->rsp_xx1 = rsp->rsp_xx2 = 0; + rsp->rsp_cnt = tu_sc.sc_nbytes; + rsp->rsp_blk = dblk; + rsp->rsp_sum = ctu_cksum(rsp, 6); + tu_sc.sc_state = SC_SEND_CMD; + while (tu_sc.sc_state != SC_GET_RESP) + ctutintr(); + while (tu_sc.sc_state != SC_READY) + cturintr(); + *rsize = size; + return 0; +} + +void +cturintr() +{ + int status; + + while ((mfpr(PR_CSRS) & 0x80) == 0) + ; + + status = mfpr(PR_CSRD); + + switch (tu_sc.sc_state) { + + case SC_INIT: + break; + + case SC_GET_RESP: + if (tu_sc.sc_xbytes == tu_sc.sc_nbytes) { + tu_sc.sc_bbytes++; + if (tu_sc.sc_bbytes == 146) + tu_sc.sc_state = SC_READY; + break; + } + tu_sc.sc_bbytes++; + if (tu_sc.sc_bbytes < 3) /* Data header */ + break; + if (tu_sc.sc_bbytes == 132) { /* Finished */ + tu_sc.sc_bbytes = 0; + break; + } + if (tu_sc.sc_bbytes == 131) /* First checksum */ + break; + tu_sc.sc_xfptr[tu_sc.sc_xbytes++] = status; + break; + + } + +} + +void +ctutintr() +{ + int c; + + while ((mfpr(PR_CSTS) & 0x80) == 0) + ; + + c = tu_sc.sc_rsp[tu_sc.sc_xbytes++] & 0xff; + mtpr(c, PR_CSTD); + if (tu_sc.sc_xbytes > 13) { + tu_sc.sc_state = SC_GET_RESP; + tu_sc.sc_xbytes = 0; + } +} + +ctu_cksum(buf, words) + unsigned short *buf; + int words; +{ + int i, cksum; + + for (i = cksum = 0; i < words; i++) + cksum += buf[i]; + +hej: if (cksum > 65535) { + cksum = (cksum & 65535) + (cksum >> 16); + goto hej; + } + return cksum; +} |