X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/e431883ee1aad86d532240efa0da8b7de0e591f3..667b32867c6dffc35ca4222282de798640f1aaf2:/usr/src/sys/vax/if/if_acc.c diff --git a/usr/src/sys/vax/if/if_acc.c b/usr/src/sys/vax/if/if_acc.c index 534470009e..8adb258cd6 100644 --- a/usr/src/sys/vax/if/if_acc.c +++ b/usr/src/sys/vax/if/if_acc.c @@ -1,30 +1,36 @@ -/* if_acc.c 4.11 82/03/19 */ +/* + * Copyright (c) 1982 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + * + * @(#)if_acc.c 6.5 (Berkeley) %G% + */ #include "acc.h" -#ifdef NACC > 0 +#if NACC > 0 /* * ACC LH/DH ARPAnet IMP interface driver. */ +#include "../machine/pte.h" + +#include "param.h" +#include "systm.h" +#include "mbuf.h" +#include "buf.h" +#include "protosw.h" +#include "socket.h" +#include "vmmac.h" -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/mbuf.h" -#include "../h/pte.h" -#include "../h/buf.h" -#include "../h/protosw.h" -#include "../h/socket.h" -#include "../h/ubareg.h" -#include "../h/ubavar.h" -#include "../h/cpu.h" -#include "../h/mtpr.h" -#include "../h/vmmac.h" -#include "../net/in.h" -#include "../net/in_systm.h" #include "../net/if.h" -#include "../net/if_acc.h" -#include "../net/if_imp.h" -#include "../net/if_uba.h" +#include "../netimp/if_imp.h" + +#include "../vax/cpu.h" +#include "../vax/mtpr.h" +#include "if_accreg.h" +#include "if_uba.h" +#include "../vaxuba/ubareg.h" +#include "../vaxuba/ubavar.h" int accprobe(), accattach(), accrint(), accxint(); struct uba_device *accinfo[NACC]; @@ -71,7 +77,6 @@ accprobe(reg) register int br, cvec; /* r11, r10 value-result */ register struct accdevice *addr = (struct accdevice *)reg; -COUNT(ACCPROBE); #ifdef lint br = 0; cvec = br; br = cvec; accrint(0); accxint(0); @@ -102,16 +107,16 @@ accattach(ui) struct impcb ifimp_impcb; } *ifimp; -COUNT(ACCATTACH); - if ((ifimp = (struct ifimpcb *)impattach(ui)) == 0) + if ((ifimp = (struct ifimpcb *)impattach(ui, accreset)) == 0) panic("accattach"); sc->acc_if = &ifimp->ifimp_if; ip = &ifimp->ifimp_impcb; sc->acc_ic = ip; ip->ic_init = accinit; ip->ic_start = accstart; + sc->acc_ifuba.ifu_flags = UBA_CANTWAIT; #ifdef notdef - sc->acc_ifuba.ifu_flags = UBA_NEEDBDP; + sc->acc_ifuba.ifu_flags |= UBA_NEEDBDP; #endif } @@ -125,12 +130,12 @@ accreset(unit, uban) register struct uba_device *ui; struct acc_softc *sc; -COUNT(ACCRESET); if (unit >= NACC || (ui = accinfo[unit]) == 0 || ui->ui_alive == 0 || ui->ui_ubanum != uban) return; printf(" acc%d", unit); sc = &acc_softc[unit]; + sc->acc_if->if_flags &= ~IFF_RUNNING; /* must go through IMP to allow it to set state */ (*sc->acc_if->if_init)(unit); } @@ -147,9 +152,8 @@ accinit(unit) register struct acc_softc *sc; register struct uba_device *ui; register struct accdevice *addr; - int x, info; + int info; -COUNT(ACCINIT); if (unit >= NACC || (ui = accinfo[unit]) == 0 || ui->ui_alive == 0) { printf("acc%d: not alive\n", unit); return (0); @@ -165,35 +169,22 @@ COUNT(ACCINIT); if (if_ubainit(&sc->acc_ifuba, ui->ui_ubanum, 0, (int)btoc(IMPMTU)) == 0) { printf("acc%d: can't initialize\n", unit); - goto down; + ui->ui_alive = 0; + return (0); } + sc->acc_if->if_flags |= IFF_RUNNING; addr = (struct accdevice *)ui->ui_addr; /* * Reset the imp interface; * the delays are pure guesswork. */ - x = spl5(); - addr->icsr = ACC_RESET; DELAY(5000); addr->ocsr = ACC_RESET; DELAY(5000); addr->ocsr = OUT_BBACK; DELAY(5000); /* reset host master ready */ addr->ocsr = 0; - splx(x); - addr->icsr = IN_MRDY | IN_WEN; /* close the relay */ - DELAY(10000); - /* YECH!!! */ - x = 500; - while (x-- > 0) { - if ((addr->icsr & IN_HRDY) || - (addr->icsr & (IN_RMR | IN_IMPBSY)) == 0) - break; - addr->icsr = IN_MRDY | IN_WEN; DELAY(10000); - /* keep turning IN_RMR off */ - } - if (x <= 0) { - printf("acc%d: imp doesn't respond, icsr=%b\n", unit, - addr->icsr, ACC_INBITS); - goto down; + if (accinputreset(addr, unit) == 0) { + ui->ui_alive = 0; + return (0); } /* @@ -202,7 +193,6 @@ COUNT(ACCINIT); * the NOOPs it throws at us). * Note: IMPMTU includes the leader. */ - x = spl5(); info = sc->acc_ifuba.ifu_r.ifrw_info; addr->iba = (u_short)info; addr->iwc = -(IMPMTU >> 1); @@ -211,10 +201,28 @@ COUNT(ACCINIT); #endif addr->icsr = IN_MRDY | ACC_IE | IN_WEN | ((info & 0x30000) >> 12) | ACC_GO; - splx(x); return (1); -down: - ui->ui_alive = 0; +} + +accinputreset(addr, unit) + register struct accdevice *addr; + register int unit; +{ + register int i; + + addr->icsr = ACC_RESET; DELAY(5000); + addr->icsr = IN_MRDY | IN_WEN; /* close the relay */ + DELAY(10000); + /* YECH!!! */ + for (i = 0; i < 500; i++) { + if ((addr->icsr & IN_HRDY) || + (addr->icsr & (IN_RMR | IN_IMPBSY)) == 0) + return (1); + addr->icsr = IN_MRDY | IN_WEN; DELAY(10000); + /* keep turning IN_RMR off */ + } + printf("acc%d: imp doesn't respond, icsr=%b\n", unit, + addr->icsr, ACC_INBITS); return (0); } @@ -230,7 +238,6 @@ accstart(dev) struct mbuf *m; u_short cmd; -COUNT(ACCSTART); if (sc->acc_ic->ic_oactive) goto restart; @@ -269,21 +276,22 @@ restart: * Output interrupt handler. */ accxint(unit) + int unit; { register struct acc_softc *sc = &acc_softc[unit]; register struct accdevice *addr; -COUNT(ACCXINT); + addr = (struct accdevice *)accinfo[unit]->ui_addr; if (sc->acc_ic->ic_oactive == 0) { - printf("acc%d: stray xmit interrupt\n", unit); + printf("acc%d: stray xmit interrupt, csr=%b\n", unit, + addr->ocsr, ACC_OUTBITS); return; } - addr = (struct accdevice *)accinfo[unit]->ui_addr; sc->acc_if->if_opackets++; sc->acc_ic->ic_oactive = 0; if (addr->ocsr & ACC_ERR) { - printf("acc%d: output error, csr=%b\n", unit, - addr->ocsr, ACC_OUTBITS); + printf("acc%d: output error, ocsr=%b, icsr=%b\n", unit, + addr->ocsr, ACC_OUTBITS, addr->icsr, ACC_INBITS); sc->acc_if->if_oerrors++; } if (sc->acc_ifuba.ifu_xtofree) { @@ -298,13 +306,14 @@ COUNT(ACCXINT); * Input interrupt handler */ accrint(unit) + int unit; { register struct acc_softc *sc = &acc_softc[unit]; register struct accdevice *addr; struct mbuf *m; int len, info; -COUNT(ACCRINT); + addr = (struct accdevice *)accinfo[unit]->ui_addr; sc->acc_if->if_ipackets++; /* @@ -312,7 +321,6 @@ COUNT(ACCRINT); */ if (sc->acc_ifuba.ifu_flags & UBA_NEEDBDP) UBAPURGE(sc->acc_ifuba.ifu_uba, sc->acc_ifuba.ifu_r.ifrw_bdp); - addr = (struct accdevice *)accinfo[unit]->ui_addr; if (addr->icsr & ACC_ERR) { printf("acc%d: input error, csr=%b\n", unit, addr->icsr, ACC_INBITS);