|
|
1.1 ! root 1: /* ethinter.c - ethinter */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <proc.h> ! 6: #include <network.h> ! 7: #include <qbus.h> ! 8: ! 9: /*------------------------------------------------------------------------ ! 10: * ethinter - ethernet interrupt processing procedure ! 11: *------------------------------------------------------------------------ ! 12: */ ! 13: INTPROC ethinter(etptr) ! 14: struct etblk *etptr; ! 15: { ! 16: struct dqregs *dqptr; ! 17: register struct dcmd *dcmptr; ! 18: short csr; ! 19: int pid; ! 20: ! 21: dqptr = etptr->eioaddr; ! 22: dqptr->d_csr = csr = dqptr->d_csr; /* clear RINT, XINT */ ! 23: ! 24: /* check BOTH receive and xmit completion */ ! 25: ! 26: if (csr & DQ_RINT) { ! 27: dcmptr = etptr->ercmd; ! 28: if ( (dcmptr->dc_st1 & DC_LUSE) != DC_ERRU) { ! 29: pid = etptr->etrpid; ! 30: etptr->etrpid = BADPID; ! 31: send(pid, OK); ! 32: } else { /* error, so retry operation */ ! 33: dcmptr->dc_st1 = dcmptr->dc_st2 = DC_INIT; ! 34: dcmptr->dc_flag = DC_NUSED; ! 35: dqptr->d_rcmd = (short) dcmptr; ! 36: dqptr->d_rcmdh = hiQ2low(dcmptr); ! 37: } ! 38: } ! 39: if (csr & DQ_XINT) { ! 40: dcmptr = etptr->ewcmd; ! 41: if ( (dcmptr->dc_st1 & DC_LUSE) != DC_ERRU) { ! 42: if (etptr->etsetup == DC_NORM) { ! 43: etptr->etlen = 0; ! 44: freebuf( lowQ2hi(dcmptr->dc_bufh) | ! 45: dcmptr->dc_buf ); ! 46: signal(etptr->etwsem); ! 47: } ! 48: } else if (etptr->etwtry-- > 0) { /* retry on error */ ! 49: while (! (dqptr->d_csr & DQ_XLI) ) ! 50: ; ! 51: dcmptr->dc_st1 = dcmptr->dc_st2 = DC_INIT; ! 52: dcmptr->dc_flag = DC_NUSED; ! 53: dqptr->d_wcmd = (short) dcmptr; ! 54: dqptr->d_wcmdh = hiQ2low(dcmptr); ! 55: } else { ! 56: if (etptr->etsetup == DC_NORM) { ! 57: freebuf( lowQ2hi(dcmptr->dc_bufh) | ! 58: dcmptr->dc_buf); ! 59: signal(etptr->etwsem); ! 60: } ! 61: } ! 62: } ! 63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.