X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/961945a80c6f995f4567dbce8881af0bbdee211c..4f02060de42f75eaa81062312b361dd25811d0de:/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 646d36fa6a..420df5c932 100644 --- a/usr/src/sys/vax/if/if_acc.c +++ b/usr/src/sys/vax/if/if_acc.c @@ -1,28 +1,45 @@ -/* if_acc.c 4.32 82/12/17 */ +/* + * Copyright (c) 1982, 1986, 1988 Regents of the University of California. + * All rights reserved. + * + * 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. + * + * @(#)if_acc.c 7.5 (Berkeley) %G% + */ #include "acc.h" -#ifdef NACC > 0 +#if NACC > 0 /* * ACC LH/DH ARPAnet IMP interface driver. */ #include "../machine/pte.h" -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/mbuf.h" -#include "../h/buf.h" -#include "../h/protosw.h" -#include "../h/socket.h" -#include "../h/vmmac.h" +#include "param.h" +#include "systm.h" +#include "mbuf.h" +#include "buf.h" +#include "protosw.h" +#include "socket.h" +#include "vmmac.h" #include "../net/if.h" #include "../netimp/if_imp.h" #include "../vax/cpu.h" #include "../vax/mtpr.h" -#include "../vaxif/if_accreg.h" -#include "../vaxif/if_uba.h" +#include "if_accreg.h" +#include "if_uba.h" #include "../vaxuba/ubareg.h" #include "../vaxuba/ubavar.h" @@ -31,9 +48,8 @@ struct uba_device *accinfo[NACC]; u_short accstd[] = { 0 }; struct uba_driver accdriver = { accprobe, 0, accattach, 0, accstd, "acc", accinfo }; -#define ACCUNIT(x) minor(x) -int accinit(), accstart(), accreset(); +int accinit(), accoutput(), accdown(), accreset(); /* * "Lower half" of IMP interface driver. @@ -53,8 +69,7 @@ int accinit(), accstart(), accreset(); * e.g. IP, interact with the IMP driver, rather than the ACC. */ struct acc_softc { - struct ifnet *acc_if; /* pointer to IMP's ifnet struct */ - struct impcb *acc_ic; /* data structure shared with IMP */ + struct imp_softc *acc_imp; /* data structure shared with IMP */ struct ifuba acc_ifuba; /* UNIBUS resources */ struct mbuf *acc_iq; /* input reassembly queue */ short acc_olen; /* size of last message sent */ @@ -83,9 +98,6 @@ accprobe(reg) addr->ocsr = 0; if (cvec && cvec != 0x200) /* transmit -> receive */ cvec -= 4; -#ifdef ECHACK - br = 0x16; -#endif return (1); } @@ -95,22 +107,18 @@ accprobe(reg) * the back pointers to common data structures. */ accattach(ui) - struct uba_device *ui; + register struct uba_device *ui; { register struct acc_softc *sc = &acc_softc[ui->ui_unit]; register struct impcb *ip; - struct ifimpcb { - struct ifnet ifimp_if; - struct impcb ifimp_impcb; - } *ifimp; - - if ((ifimp = (struct ifimpcb *)impattach(ui, accreset)) == 0) - panic("accattach"); - sc->acc_if = &ifimp->ifimp_if; - ip = &ifimp->ifimp_impcb; - sc->acc_ic = ip; + + if ((sc->acc_imp = impattach(ui->ui_driver->ud_dname, ui->ui_unit, + accreset)) == 0) + return; + ip = &sc->acc_imp->imp_cb; ip->ic_init = accinit; - ip->ic_start = accstart; + ip->ic_output = accoutput; + ip->ic_down = accdown; sc->acc_ifuba.ifu_flags = UBA_CANTWAIT; #ifdef notdef sc->acc_ifuba.ifu_flags |= UBA_NEEDBDP; @@ -132,8 +140,10 @@ accreset(unit, uban) return; printf(" acc%d", unit); sc = &acc_softc[unit]; + sc->acc_imp->imp_if.if_flags &= ~IFF_RUNNING; + accoflush(unit); /* must go through IMP to allow it to set state */ - (*sc->acc_if->if_init)(unit); + (*sc->acc_imp->imp_if.if_init)(sc->acc_imp->imp_if.if_unit); } /* @@ -162,12 +172,14 @@ accinit(unit) * sizeof(struct imp_leader), then the if_ routines * would asssume we handle it on input and output. */ - if (if_ubainit(&sc->acc_ifuba, ui->ui_ubanum, 0, - (int)btoc(IMPMTU)) == 0) { + if ((sc->acc_imp->imp_if.if_flags & IFF_RUNNING) == 0 && + if_ubainit(&sc->acc_ifuba, ui->ui_ubanum, 0, + (int)btoc(IMP_RCVBUF)) == 0) { printf("acc%d: can't initialize\n", unit); - ui->ui_alive = 0; + sc->acc_imp->imp_if.if_flags &= ~(IFF_UP | IFF_RUNNING); return (0); } + sc->acc_imp->imp_if.if_flags |= IFF_RUNNING; addr = (struct accdevice *)ui->ui_addr; /* @@ -186,11 +198,11 @@ accinit(unit) * Put up a read. We can't restart any outstanding writes * until we're back in synch with the IMP (i.e. we've flushed * the NOOPs it throws at us). - * Note: IMPMTU includes the leader. + * Note: IMP_RCVBUF includes the leader. */ info = sc->acc_ifuba.ifu_r.ifrw_info; addr->iba = (u_short)info; - addr->iwc = -(IMPMTU >> 1); + addr->iwc = -((IMP_RCVBUF) >> 1); #ifdef LOOPBACK addr->ocsr |= OUT_BBACK; #endif @@ -221,34 +233,47 @@ accinputreset(addr, unit) return (0); } +/* + * Drop the host ready line to mark host down. + */ +accdown(unit) + int unit; +{ + register struct accdevice *addr; + + addr = (struct accdevice *)(accinfo[unit]->ui_addr); + addr->ocsr = ACC_RESET; + DELAY(5000); + addr->ocsr = OUT_BBACK; /* reset host master ready */ + accoflush(unit); + return (1); +} + +accoflush(unit) + int unit; +{ + register struct acc_softc *sc = &acc_softc[unit]; + + sc->acc_imp->imp_cb.ic_oactive = 0; + if (sc->acc_ifuba.ifu_xtofree) { + m_freem(sc->acc_ifuba.ifu_xtofree); + sc->acc_ifuba.ifu_xtofree = 0; + } +} + /* * Start output on an interface. */ -accstart(dev) - dev_t dev; +accoutput(unit, m) + int unit; + struct mbuf *m; { - int unit = ACCUNIT(dev), info; + int info; register struct acc_softc *sc = &acc_softc[unit]; register struct accdevice *addr; - struct mbuf *m; u_short cmd; - if (sc->acc_ic->ic_oactive) - goto restart; - - /* - * Not already active, deqeue a request and - * map it onto the UNIBUS. If no more - * requeusts, just return. - */ - IF_DEQUEUE(&sc->acc_if->if_snd, m); - if (m == 0) { - sc->acc_ic->ic_oactive = 0; - return; - } sc->acc_olen = if_wubaput(&sc->acc_ifuba, m); - -restart: /* * Have request mapped to UNIBUS for * transmission; start the output. @@ -264,7 +289,7 @@ restart: cmd |= OUT_BBACK; #endif addr->ocsr = cmd; - sc->acc_ic->ic_oactive = 1; + sc->acc_imp->imp_cb.ic_oactive = 1; } /* @@ -277,24 +302,23 @@ accxint(unit) register struct accdevice *addr; addr = (struct accdevice *)accinfo[unit]->ui_addr; - if (sc->acc_ic->ic_oactive == 0) { + if (sc->acc_imp->imp_cb.ic_oactive == 0) { printf("acc%d: stray xmit interrupt, csr=%b\n", unit, addr->ocsr, ACC_OUTBITS); return; } - sc->acc_if->if_opackets++; - sc->acc_ic->ic_oactive = 0; + sc->acc_imp->imp_if.if_opackets++; + sc->acc_imp->imp_cb.ic_oactive = 0; if (addr->ocsr & ACC_ERR) { printf("acc%d: output error, ocsr=%b, icsr=%b\n", unit, addr->ocsr, ACC_OUTBITS, addr->icsr, ACC_INBITS); - sc->acc_if->if_oerrors++; + sc->acc_imp->imp_if.if_oerrors++; } if (sc->acc_ifuba.ifu_xtofree) { m_freem(sc->acc_ifuba.ifu_xtofree); sc->acc_ifuba.ifu_xtofree = 0; } - if (sc->acc_if->if_snd.ifq_head) - accstart(unit); + impstart(sc->acc_imp); } /* @@ -309,7 +333,7 @@ accrint(unit) int len, info; addr = (struct accdevice *)accinfo[unit]->ui_addr; - sc->acc_if->if_ipackets++; + sc->acc_imp->imp_if.if_ipackets++; /* * Purge BDP; flush message if error indicated. @@ -319,7 +343,7 @@ accrint(unit) if (addr->icsr & ACC_ERR) { printf("acc%d: input error, csr=%b\n", unit, addr->icsr, ACC_INBITS); - sc->acc_if->if_ierrors++; + sc->acc_imp->imp_if.if_ierrors++; sc->acc_flush = 1; } @@ -328,18 +352,18 @@ accrint(unit) sc->acc_flush = 0; goto setup; } - len = IMPMTU + (addr->iwc << 1); - if (len < 0 || len > IMPMTU) { - printf("acc%d: bad length=%d\n", len); - sc->acc_if->if_ierrors++; + len = IMP_RCVBUF + (addr->iwc << 1); + if (len < 0 || len > IMP_RCVBUF) { + printf("acc%d: bad length=%d\n", unit, len); + sc->acc_imp->imp_if.if_ierrors++; goto setup; } /* - * The last parameter is always 0 since using + * The offset parameter is always 0 since using * trailers on the ARPAnet is insane. */ - m = if_rubaget(&sc->acc_ifuba, len, 0); + m = if_rubaget(&sc->acc_ifuba, len, 0, &sc->acc_imp->imp_if); if (m == 0) goto setup; if ((addr->icsr & IN_EOM) == 0) { @@ -362,7 +386,7 @@ setup: */ info = sc->acc_ifuba.ifu_r.ifrw_info; addr->iba = (u_short)info; - addr->iwc = -(IMPMTU >> 1); + addr->iwc = -((IMP_RCVBUF)>> 1); addr->icsr = IN_MRDY | ACC_IE | IN_WEN | ((info & 0x30000) >> 12) | ACC_GO; }