diff options
author | dg <dg@FreeBSD.org> | 1995-03-23 06:53:39 +0000 |
---|---|---|
committer | dg <dg@FreeBSD.org> | 1995-03-23 06:53:39 +0000 |
commit | 929c346a80d298cf51bb80bcf95bdda074df9da1 (patch) | |
tree | 2cfd5e9920535affd65bcc3215ca6fb11087c9a6 /sys/dev/ep | |
parent | 1823ec6c2e04fb97540b834ed337e4e449160b8f (diff) | |
download | FreeBSD-src-929c346a80d298cf51bb80bcf95bdda074df9da1.zip FreeBSD-src-929c346a80d298cf51bb80bcf95bdda074df9da1.tar.gz |
Patches from Serge Babkin to fix interrupt handling bugs.
Submitted by: Serge Babkin
Diffstat (limited to 'sys/dev/ep')
-rw-r--r-- | sys/dev/ep/if_ep.c | 33 | ||||
-rw-r--r-- | sys/dev/ep/if_epreg.h | 3 |
2 files changed, 28 insertions, 8 deletions
diff --git a/sys/dev/ep/if_ep.c b/sys/dev/ep/if_ep.c index 9aaaf76..0a45fc1 100644 --- a/sys/dev/ep/if_ep.c +++ b/sys/dev/ep/if_ep.c @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: if_ep.c,v 1.18 1995/01/08 10:47:23 davidg Exp $ + * $Id: if_ep.c,v 1.19 1995/01/24 20:53:45 davidg Exp $ */ /* @@ -451,8 +451,12 @@ epinit(unit) outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); - outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | - FIL_GROUP | FIL_BRDCST); + if(ep_ftst(F_PROMISC)) + outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | + FIL_GROUP | FIL_BRDCST | FIL_ALL); + else + outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | + FIL_GROUP | FIL_BRDCST); /* * you can `ifconfig ep0 (bnc|aui)' to get the following @@ -643,8 +647,8 @@ epintr(unit) struct ifnet *ifp = &sc->arpcom.ac_if; struct mbuf *m; - outw(BASE + EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ - outw(BASE + EP_COMMAND, C_INTR_LATCH); /* ACK int Latch */ +rescan: + /* outw(BASE + EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ while ((status = inw(BASE + EP_STATUS)) & S_5_INTS) { if (status & (S_RX_COMPLETE | S_RX_EARLY)) { @@ -672,7 +676,7 @@ epintr(unit) sc->rx_no_first, sc->rx_no_mbuf, sc->rx_bpf_disc, sc->rx_overrunf, sc->rx_overrunl, sc->tx_underrun); #else - printf("ep%d: Status: %x\n", unit, status); + printf("ep%d: Status: %x\n", unit, status); #endif epinit(unit); return; @@ -716,7 +720,12 @@ epintr(unit) } /* end TX_COMPLETE */ } /* re-enable ints */ - outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); + /* outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); */ + + outw(BASE + EP_COMMAND, C_INTR_LATCH); /* ACK int Latch */ + + if ((status = inw(BASE + EP_STATUS)) & S_5_INTS) + goto rescan; } void @@ -1016,6 +1025,16 @@ epioctl(ifp, cmd, data) } if (ifp->if_flags & IFF_UP && (ifp->if_flags & IFF_RUNNING) == 0) epinit(ifp->if_unit); + + if ( (ifp->if_flags & IFF_PROMISC) && !ep_ftst(F_PROMISC) ) { + ep_fset(F_PROMISC); + epinit(ifp->if_unit); + } + else if( !(ifp->if_flags & IFF_PROMISC) && ep_ftst(F_PROMISC) ) { + ep_frst(F_PROMISC); + epinit(ifp->if_unit); + } + break; #ifdef notdef case SIOCGHWADDR: diff --git a/sys/dev/ep/if_epreg.h b/sys/dev/ep/if_epreg.h index 2dc7a98..86942a8 100644 --- a/sys/dev/ep/if_epreg.h +++ b/sys/dev/ep/if_epreg.h @@ -19,7 +19,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: if_epreg.h,v 1.2 1994/01/10 19:13:50 ats Exp $ Modified by: + * $Id: if_epreg.h,v 1.4 1994/11/13 10:12:37 gibbs Exp $ Modified by: * October 2, 1994 @@ -55,6 +55,7 @@ struct ep_softc { #define F_RX_FIRST 0x1 #define F_WAIT_TRAIL 0x2 #define F_RX_TRAILER 0x4 +#define F_PROMISC 0x8 #define F_ACCESS_32_BITS 0x100 |