X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/48db90de184058a9c0588855d38139fafa6825ad..4fce3bf9816218d3cead81ad945ddd9e9f5f27e6:/usr/src/sys/vax/if/if_ec.c diff --git a/usr/src/sys/vax/if/if_ec.c b/usr/src/sys/vax/if/if_ec.c index 2bfc401183..97526b4034 100644 --- a/usr/src/sys/vax/if/if_ec.c +++ b/usr/src/sys/vax/if/if_ec.c @@ -1,4 +1,4 @@ -/* if_ec.c 4.20 82/06/23 */ +/* if_ec.c 4.29 82/11/13 */ #include "ec.h" @@ -13,24 +13,29 @@ #include "../h/buf.h" #include "../h/protosw.h" #include "../h/socket.h" -#include "../h/ubareg.h" -#include "../h/ubavar.h" -#include "../h/ecreg.h" -#include "../h/cpu.h" -#include "../h/mtpr.h" #include "../h/vmmac.h" -#include "../net/in.h" -#include "../net/in_systm.h" +#include + #include "../net/if.h" -#include "../net/if_ec.h" -#include "../net/if_uba.h" -#include "../net/ip.h" -#include "../net/ip_var.h" -#include "../net/pup.h" +#include "../net/netisr.h" #include "../net/route.h" -#include +#include "../netinet/in.h" +#include "../netinet/in_systm.h" +#include "../netinet/ip.h" +#include "../netinet/ip_var.h" +#include "../netpup/pup.h" + +#include "../vax/cpu.h" +#include "../vax/mtpr.h" +#include "../vaxif/if_ec.h" +#include "../vaxif/if_ecreg.h" +#include "../vaxif/if_uba.h" +#include "../vaxuba/ubareg.h" +#include "../vaxuba/ubavar.h" #define ECMTU 1500 +#define ECMIN (60-14) +#define ECMEM 0000000 int ecprobe(), ecattach(), ecrint(), ecxint(), eccollide(); struct uba_device *ecinfo[NEC]; @@ -41,7 +46,7 @@ u_char ec_iltop[3] = { 0x02, 0x07, 0x01 }; #define ECUNIT(x) minor(x) int ecinit(),ecoutput(),ecreset(); -struct mbuf *ecget(); +struct mbuf *ecget(); extern struct ifnet loif; @@ -62,7 +67,7 @@ struct ec_softc { struct ifuba es_ifuba; /* UNIBUS resources */ short es_mask; /* mask for current output delay */ short es_oactive; /* is output active? */ - caddr_t es_buf[16]; /* virtual addresses of buffers */ + u_char *es_buf[16]; /* virtual addresses of buffers */ u_char es_enaddr[6]; /* board's ethernet address */ } ec_softc[NEC]; @@ -75,7 +80,7 @@ ecprobe(reg) { register int br, cvec; /* r11, r10 value-result */ register struct ecdevice *addr = (struct ecdevice *)reg; - register caddr_t ecbuf = (caddr_t) &umem[0][0600000]; + register caddr_t ecbuf = (caddr_t) &umem[numuba][ECMEM]; #ifdef lint br = 0; cvec = br; br = cvec; @@ -85,20 +90,37 @@ ecprobe(reg) * Make sure memory is turned on */ addr->ec_rcr = EC_AROM; + /* + * Disable map registers for ec unibus space, + * but don't allocate yet. + */ + (void) ubamem(numuba, ECMEM, 32*2, 0); /* * Check for existence of buffers on Unibus. - * This won't work on a 780 until more work is done. */ - if (badaddr((caddr_t) ecbuf, 2)) { - printf("ec: buffer mem not found"); + if (badaddr((caddr_t)ecbuf, 2)) { + bad1: + printf("ec: buffer mem not found\n"); + bad2: + (void) ubamem(numuba, 0, 0, 0); /* reenable map (780 only) */ + addr->ec_rcr = EC_MDISAB; /* disable memory */ return (0); } +#if VAX780 + if (cpu == VAX_780 && uba_hd[numuba].uh_uba->uba_sr) { + uba_hd[numuba].uh_uba->uba_sr = uba_hd[numuba].uh_uba->uba_sr; + goto bad1; + } +#endif /* * Tell the system that the board has memory here, so it won't * attempt to allocate the addresses later. */ - ubamem(0, 0600000, 32*2); + if (ubamem(numuba, ECMEM, 32*2, 1) == 0) { + printf("ecprobe: cannot reserve uba addresses\n"); + goto bad2; + } /* * Make a one byte packet in what should be buffer #0. @@ -112,8 +134,13 @@ ecprobe(reg) DELAY(100000); addr->ec_xcr = EC_XCLR; if (cvec > 0 && cvec != 0x200) { - cvec -= 010; - br += 2; /* rcv is xmit + 2 */ + if (cvec & 04) { /* collision interrupt */ + cvec -= 04; + br += 1; /* rcv is collision + 1 */ + } else { /* xmit interrupt */ + cvec -= 010; + br += 2; /* rcv is xmit + 2 */ + } } return (1); } @@ -172,9 +199,9 @@ ecattach(ui) ifp->if_init = ecinit; ifp->if_output = ecoutput; - ifp->if_ubareset = ecreset; + ifp->if_reset = ecreset; for (i=0; i<16; i++) - es->es_buf[i] = &umem[ui->ui_ubanum][0600000+2048*i]; + es->es_buf[i] = (u_char *)&umem[ui->ui_ubanum][ECMEM+2048*i]; if_attach(ifp); } @@ -191,6 +218,7 @@ ecreset(unit, uban) ui->ui_ubanum != uban) return; printf(" ec%d", unit); + (void) ubamem(uban, ECMEM, 32*2, 0); /* mr disable (no alloc) */ ecinit(unit); } @@ -234,11 +262,10 @@ ecinit(unit) ecstart(dev) dev_t dev; { - int unit = ECUNIT(dev), dest; + int unit = ECUNIT(dev); struct ec_softc *es = &ec_softc[unit]; struct ecdevice *addr; struct mbuf *m; - caddr_t ecbuf; if (es->es_oactive) goto restart; @@ -346,7 +373,7 @@ ecdocoll(unit) /* * Clear the controller's collision flag, thus enabling retransmit. */ - addr->ec_xcr = EC_JINTEN|EC_XINTEN|EC_JCLR; + addr->ec_xcr = EC_CLEAR; } /* @@ -374,15 +401,15 @@ ecread(unit) struct ecdevice *addr = (struct ecdevice *)ecinfo[unit]->ui_addr; register struct ec_header *ec; struct mbuf *m; - int len, off, resid, ecoff, buf; + int len, off, resid, ecoff, rbuf; register struct ifqueue *inq; - caddr_t ecbuf; + u_char *ecbuf; es->es_if.if_ipackets++; - buf = addr->ec_rcr & EC_RBN; - if (buf < ECRLBF || buf > ECRHBF) + rbuf = addr->ec_rcr & EC_RBN; + if (rbuf < ECRLBF || rbuf > ECRHBF) panic("ecrint"); - ecbuf = es->es_buf[buf]; + ecbuf = es->es_buf[rbuf]; ecoff = *(short *)ecbuf; if (ecoff <= ECRDOFF || ecoff > 2046) { es->es_if.if_ierrors++; @@ -455,7 +482,7 @@ setup: /* * Reset for next packet. */ - addr->ec_rcr = EC_READ|EC_RCLR|buf; + addr->ec_rcr = EC_READ|EC_RCLR|rbuf; } /* @@ -485,7 +512,7 @@ ecoutput(ifp, m0, dst) case AF_INET: dest = ((struct sockaddr_in *)dst)->sin_addr.s_addr; if ((dest &~ 0xff) == 0) - mcopy = m_copy(m, 0, M_COPYALL); + mcopy = m_copy(m, 0, (int)M_COPYALL); else if (dest == ((struct sockaddr_in *)&es->es_if.if_addr)-> sin_addr.s_addr) { mcopy = m; @@ -594,8 +621,11 @@ bad: } /* - * Routine to copy from mbuf chain to transmitter + * Routine to copy from mbuf chain to transmit * buffer in UNIBUS memory. + * If packet size is less than the minimum legal size, + * the buffer is expanded. We probably should zero out the extra + * bytes for security, but that would slow things down. */ ecput(ecbuf, m) u_char *ecbuf; @@ -607,6 +637,8 @@ ecput(ecbuf, m) for (off = 2048, mp = m; mp; mp = mp->m_next) off -= mp->m_len; + if (2048 - off < ECMIN + sizeof (struct ec_header)) + off = 2048 - ECMIN - sizeof (struct ec_header); *(u_short *)ecbuf = off; bp = (u_char *)(ecbuf + off); for (mp = m; mp; mp = mp->m_next) {