void cmdSonicRead(void) { char out[128]; unsigned int sonic_val; //myStringPut("cmdSonicRead() called"); sonic_val=sonic_read(); myStringPut("sonic_val="); ltoa( (long) sonic_val,out); myStringPut(out); myStringPut(", "); ltoa( (long) (sonic_val/50000),out); myStringPut(out); myStringPut(" [ms]"); myNLPut(); }
/* * Receive interrupt routine */ static void sonicrxint(struct sn_softc *sc) { void * rda; int orra; int len; int rramark; int rdamark; uint16_t rxpkt_ptr; rda = (char *)sc->p_rda + (sc->sc_rxmark * RXPKT_SIZE(sc)); while (SRO(bitmode, rda, RXPKT_INUSE) == 0) { u_int status = SRO(bitmode, rda, RXPKT_STATUS); orra = RBASEQ(SRO(bitmode, rda, RXPKT_SEQNO)) & RRAMASK; rxpkt_ptr = SRO(bitmode, rda, RXPKT_PTRLO); len = SRO(bitmode, rda, RXPKT_BYTEC) - FCSSIZE; if (status & RCR_PRX) { void *pkt = (char *)sc->rbuf[orra & RBAMASK] + (rxpkt_ptr & PGOFSET); if (sonic_read(sc, pkt, len)) sc->sc_if.if_ipackets++; else sc->sc_if.if_ierrors++; } else sc->sc_if.if_ierrors++; /* * give receive buffer area back to chip. * * If this was the last packet in the RRA, give the RRA to * the chip again. * If sonic read didnt copy it out then we would have to * wait !! * (dont bother add it back in again straight away) * * Really, we're doing p_rra[rramark] = p_rra[orra] but * we have to use the macros because SONIC might be in * 16 or 32 bit mode. */ if (status & RCR_LPKT) { void *tmp1, *tmp2; rramark = sc->sc_rramark; tmp1 = sc->p_rra[rramark]; tmp2 = sc->p_rra[orra]; SWO(bitmode, tmp1, RXRSRC_PTRLO, SRO(bitmode, tmp2, RXRSRC_PTRLO)); SWO(bitmode, tmp1, RXRSRC_PTRHI, SRO(bitmode, tmp2, RXRSRC_PTRHI)); SWO(bitmode, tmp1, RXRSRC_WCLO, SRO(bitmode, tmp2, RXRSRC_WCLO)); SWO(bitmode, tmp1, RXRSRC_WCHI, SRO(bitmode, tmp2, RXRSRC_WCHI)); /* zap old rra for fun */ SWO(bitmode, tmp2, RXRSRC_WCHI, 0); SWO(bitmode, tmp2, RXRSRC_WCLO, 0); sc->sc_rramark = (++rramark) & RRAMASK; NIC_PUT(sc, SNR_RWP, LOWER(sc->v_rra[rramark])); wbflush(); } /* * give receive descriptor back to chip simple * list is circular */ rdamark = sc->sc_rdamark; SWO(bitmode, rda, RXPKT_INUSE, 1); SWO(bitmode, rda, RXPKT_RLINK, SRO(bitmode, rda, RXPKT_RLINK) | EOL); SWO(bitmode, ((char *)sc->p_rda + (rdamark * RXPKT_SIZE(sc))), RXPKT_RLINK, SRO(bitmode, ((char *)sc->p_rda + (rdamark * RXPKT_SIZE(sc))), RXPKT_RLINK) & ~EOL); sc->sc_rdamark = sc->sc_rxmark; if (++sc->sc_rxmark >= sc->sc_nrda) sc->sc_rxmark = 0; rda = (char *)sc->p_rda + (sc->sc_rxmark * RXPKT_SIZE(sc)); } }