summaryrefslogtreecommitdiffstats
path: root/sys/dev/ep
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1995-03-23 06:53:39 +0000
committerdg <dg@FreeBSD.org>1995-03-23 06:53:39 +0000
commit929c346a80d298cf51bb80bcf95bdda074df9da1 (patch)
tree2cfd5e9920535affd65bcc3215ca6fb11087c9a6 /sys/dev/ep
parent1823ec6c2e04fb97540b834ed337e4e449160b8f (diff)
downloadFreeBSD-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.c33
-rw-r--r--sys/dev/ep/if_epreg.h3
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
OpenPOWER on IntegriCloud