From e6f2b8e9f3897008b05850c9fe699171d3439741 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 21 Sep 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-09-21 --- mpc/etherwavelan.c | 28 +++++++++++++++++++++------- mpc/trap.c | 2 +- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/mpc/etherwavelan.c b/mpc/etherwavelan.c index 9f15dd277d77ef8cf30c1c64ccba5fb67e42b72f..9659da81b67aa4b218710c3d0e6589a75ec598c1 100644 --- a/mpc/etherwavelan.c +++ b/mpc/etherwavelan.c @@ -19,7 +19,7 @@ #include "etherwavelan.h" -static void wavelan_receive(Ether *ether); +static int wavelan_receive(Ether *ether); static int txstart(Ether *ether); static void @@ -291,6 +291,8 @@ wavelan_hardware_send_packet(Ether *ether, void *buf, short length) ctlr = ether->ctlr; base = ctlr->port; +print("%ld: send packet %d\n", m->ticks, length); + outb(PIORL(base), xmtdata_base & 0xff); outb(PIORH(base), ((xmtdata_base >> 8) & PIORH_MASK) | PIORH_SEL_TX); outb(PIOP(base), length & 0xff); /* lsb */ @@ -396,7 +398,7 @@ static void wavelan_read(Ether *ether, int fd_p, int sksize) ctlr->rx_packets++; - if ((bp = rbpalloc(allocb)) == 0){ + if ((bp = rbpalloc(iallocb)) == 0){ print("wavelan: could not rbpalloc(%d).\n", sksize); ctlr->rx_dropped++; return; @@ -415,7 +417,7 @@ static void wavelan_read(Ether *ether, int fd_p, int sksize) } } /* wavelan_read */ -static void +static int wavelan_receive(Ether *ether) { Ctlr *ctlr; @@ -442,12 +444,13 @@ wavelan_receive(Ether *ether) newrfp |= inb(RPLH(base)) << 8; newrfp %= RX_SIZE; -// print("wavelan_cs: i593_rfp %d stop %d newrfp %d ctlr->rfp %d\n", -// i593_rfp, ctlr->stop, newrfp, ctlr->rfp); +if(0) print("before wavelan_cs: i593_rfp %d stop %d newrfp %d ctlr->rfp %d\n", i593_rfp, ctlr->stop, newrfp, ctlr->rfp); - if (newrfp == ctlr->rfp) + if (newrfp == ctlr->rfp) { print("wavelan_cs: odd RFPs: i593_rfp %d stop %d newrfp %d ctlr->rfp %d\n", i593_rfp, ctlr->stop, newrfp, ctlr->rfp); + return 0; + } while(newrfp != ctlr->rfp) { rp = newrfp; @@ -466,6 +469,7 @@ wavelan_receive(Ether *ether) status = c[0] | (c[1] << 8); len = c[2] | (c[3] << 8); +print("%ld: len = %d status = %ux %ux %ux\n", m->ticks, len, status, newrfp, rp); if(!(status & RX_RCV_OK)) { if(status & RX_NO_SFD) ctlr->rx_no_sfd++; if(status & RX_CRC_ERR) ctlr->rx_crc++; @@ -483,9 +487,18 @@ wavelan_receive(Ether *ether) * per packet. */ ctlr->stop = (i593_rfp + RX_SIZE - ((RX_SIZE / 64) * 3)) % RX_SIZE; +//print("ctlr->stop = %ux\n", ctlr->stop); outb(LCCR(base), OP0_SWIT_TO_PORT_1 | CR0_CHNL); outb(LCCR(base), CR1_STOP_REG_UPDATE | (ctlr->stop >> RX_SIZE_SHIFT)); outb(LCCR(base), OP1_SWIT_TO_PORT_0); + + newrfp = inb(RPLL(base)); + newrfp |= inb(RPLH(base)) << 8; + newrfp %= RX_SIZE; + +if(newrfp != ctlr->rfp) +print("after wavelan_cs: left over = %d\n", (newrfp - ctlr->rfp + RX_SIZE) % RX_SIZE); + return 1; } /* wavelan_receive */ static void @@ -505,7 +518,8 @@ interrupt(Ureg*, void* arg) outb(LCCR(base), CR0_STATUS_0 | OP0_NOP); interrupt_handler(ether, inb(LCSR(base))); - +outb(LCCR(base), CR0_STATUS_0 | OP0_NOP); +print("status = %ux\n", inb(LCSR(base))); iunlock(&ctlr->wlock); }; /* wavelan interrupt */ diff --git a/mpc/trap.c b/mpc/trap.c index 8ce9d828a6b7c775f7fe25081e33a56fbde3909b..a82a6decca8c2574a2a836a34f511224d01effa7 100644 --- a/mpc/trap.c +++ b/mpc/trap.c @@ -676,7 +676,7 @@ notify(Ureg* ur) ulong s, sp; Note *n; -print("***notify\n"); +print("***notify %ld\n", up->pid); if(up->procctl) procctl(up);