Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Aug 2006 23:13:16 GMT
From:      Paolo Pisati <piso@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 103291 for review
Message-ID:  <200608052313.k75NDGeH064617@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=103291

Change 103291 by piso@piso_newluxor on 2006/08/05 23:12:53

	Use a simple filter function for now while i
	experiment with it: so far it works well, i was able
	to transfer some gigabytes from one box to another
	with no problem.

Affected files ...

.. //depot/projects/soc2006/intr_filter/pci/if_xl.c#4 edit
.. //depot/projects/soc2006/intr_filter/pci/if_xlreg.h#3 edit

Differences ...

==== //depot/projects/soc2006/intr_filter/pci/if_xl.c#4 (text+ko) ====

@@ -233,15 +233,12 @@
 static int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf *);
 static void xl_rxeof(struct xl_softc *);
 static void xl_rxeof_task(void *, int);
-__unused static int xl_rx_resync(struct xl_softc *);
+static int xl_rx_resync(struct xl_softc *);
 static void xl_txeof(struct xl_softc *);
 static void xl_txeof_90xB(struct xl_softc *);
 static void xl_txeoc(struct xl_softc *);
 static void xl_intr(void *);
 static int xl_filter(void *);
-static void xl_stat_tx_complete(void *, int);
-static void xl_stat_adfail(void *, int);
-static void xl_stat_statsoflow(void *, int);
 static void xl_start(struct ifnet *);
 static void xl_start_locked(struct ifnet *);
 static void xl_start_90xB_locked(struct ifnet *);
@@ -1604,14 +1601,6 @@
 		CSR_WRITE_2(sc, XL_W0_MFG_ID, XL_NO_XCVR_PWR_MAGICBITS);
 	}
 
-	sc->xl_tq = taskqueue_create("xl_taskq", M_NOWAIT,
-				     taskqueue_thread_enqueue, &sc->xl_tq);
-	taskqueue_start_threads(&sc->xl_tq, 1, 
-				PI_NET, "%s taskq", ifp->if_xname);	
-	TASK_INIT(&sc->xl_stat_tx_complete, 0, xl_stat_tx_complete, sc);
-	TASK_INIT(&sc->xl_stat_adfail, 0, xl_stat_adfail, sc);
-	TASK_INIT(&sc->xl_stat_statsoflow, 0, xl_stat_statsoflow, sc);
-
 	/*
 	 * Call MI attach routine.
 	 */
@@ -1727,7 +1716,6 @@
 		callout_drain(&sc->xl_stat_callout);
 		ether_ifdetach(ifp);
 	}
-	taskqueue_free(sc->xl_tq);
 	if (sc->xl_miibus)
 		device_delete_child(dev, sc->xl_miibus);
 	bus_generic_detach(dev);
@@ -1764,6 +1752,7 @@
 		    sc->xl_ldata.xl_tx_dmamap);
 		bus_dma_tag_destroy(sc->xl_ldata.xl_tx_tag);
 	}
+
 	mtx_destroy(&sc->xl_mtx);
 
 	return (0);
@@ -1937,7 +1926,7 @@
 	return (0);
 }
 
-__unused static int
+static int
 xl_rx_resync(struct xl_softc *sc)
 {
 	struct xl_chain_onefrag	*pos;
@@ -2285,95 +2274,95 @@
 	}
 }
 
-static void
-xl_stat_tx_complete(void *_sc, int p __unused) {
-	struct xl_softc		*sc = _sc;
-	struct ifnet		*ifp = sc->xl_ifp;
+static int
+xl_filter(void *arg)
+{
+	struct xl_softc		*sc = arg;
+	u_int16_t		status;
 
-	XL_LOCK(sc);
-	ifp->if_oerrors++;
-	xl_txeoc(sc);
-	XL_UNLOCK(sc);
-}
+	status = CSR_READ_2(sc, XL_STATUS);
+	if (status == 0xFFFF || !(status & XL_INTRS)) {
+		printf("xl stray intr\n");
+		return (FILTER_STRAY);	
+	}
 
-static void
-xl_stat_adfail(void *_sc, int p __unused) {
-	struct xl_softc		*sc = _sc;
+#if 0	
+	/* Disable interrupts */
+	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|0);
+#endif
 
-	XL_LOCK(sc);
-	xl_reset(sc);
-	xl_init_locked(sc);
-	XL_UNLOCK(sc);
+	return (FILTER_HANDLED | FILTER_SCHEDULE_THREAD);
 }
 
 static void
-xl_stat_statsoflow(void *_sc, int p __unused) {
-	struct xl_softc		*sc = _sc;
-
-	XL_LOCK(sc);
-	sc->xl_stats_no_timeout = 1;
-	xl_stats_update_locked(sc);
-	sc->xl_stats_no_timeout = 0;	
-	XL_UNLOCK(sc);
-}
-
-static int
-xl_filter(void *arg)
+xl_intr(void *arg)
 {
 	struct xl_softc		*sc = arg;
+	struct ifnet		*ifp = sc->xl_ifp;
 	u_int16_t		status;
-	int                     ret = FILTER_HANDLED;
 
-	status = CSR_READ_2(sc, XL_STATUS); 
-	status &= XL_INTRS;
+	XL_LOCK(sc);
 
-	if (status == 0xFFFF)
-		return (FILTER_STRAY);
+#ifdef DEVICE_POLLING
+	if (ifp->if_capenable & IFCAP_POLLING) {
+		XL_UNLOCK(sc);
+		return;
+	}
+#endif
 
-	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|(status & XL_INTRS));
-		    
-	if (status & XL_STAT_UP_COMPLETE)
-		ret |= FILTER_SCHEDULE_THREAD;
+	while ((status = CSR_READ_2(sc, XL_STATUS)) & XL_INTRS &&
+	    status != 0xFFFF) {
+		CSR_WRITE_2(sc, XL_COMMAND,
+		    XL_CMD_INTR_ACK|(status & XL_INTRS));
 
-	if (status & XL_STAT_DOWN_COMPLETE)
-		ret |= FILTER_SCHEDULE_THREAD;
+		if (status & XL_STAT_UP_COMPLETE) {
+			int	curpkts;
 
-	if (status & XL_STAT_TX_COMPLETE)
-		taskqueue_enqueue(sc->xl_tq, &sc->xl_stat_tx_complete);
+			curpkts = ifp->if_ipackets;
+			xl_rxeof(sc);
+			if (curpkts == ifp->if_ipackets) {
+				while (xl_rx_resync(sc))
+					xl_rxeof(sc);
+			}
+		}
 
-	if (status & XL_STAT_ADFAIL)
-		taskqueue_enqueue(sc->xl_tq, &sc->xl_stat_adfail);
+		if (status & XL_STAT_DOWN_COMPLETE) {
+			if (sc->xl_type == XL_TYPE_905B)
+				xl_txeof_90xB(sc);
+			else
+				xl_txeof(sc);
+		}
 
-	if (status & XL_STAT_STATSOFLOW)
-		taskqueue_enqueue(sc->xl_tq, &sc->xl_stat_statsoflow);
+		if (status & XL_STAT_TX_COMPLETE) {
+			ifp->if_oerrors++;
+			xl_txeoc(sc);
+		}
 
-	/* Disable interrupts */
-	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|0);
+		if (status & XL_STAT_ADFAIL) {
+			xl_reset(sc);
+			xl_init_locked(sc);
+		}
 
-	return (ret);
-}
+		if (status & XL_STAT_STATSOFLOW) {
+			sc->xl_stats_no_timeout = 1;
+			xl_stats_update_locked(sc);
+			sc->xl_stats_no_timeout = 0;
+		}
+	}
 
-static void
-xl_intr(void *arg) {
-	struct xl_softc		*sc = arg;
-	struct ifnet		*ifp = sc->xl_ifp;
-
-	XL_LOCK(sc);	
-	xl_rxeof(sc);
-	if (sc->xl_type == XL_TYPE_905B)
-		xl_txeof_90xB(sc);
-	else
-		xl_txeof(sc);	
-	
-	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
+#if 0
+	/*
+	 * Enable interrupts.
+	 */
+	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|0xFF);
+	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_STAT_ENB|XL_INTRS);
+#endif
+	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { 
 		if (sc->xl_type == XL_TYPE_905B)
 			xl_start_90xB_locked(ifp);
 		else
 			xl_start_locked(ifp);
 	}
-	/* Enable interrupts */
-	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|0xFF);
-	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|XL_INTRS);
 	XL_UNLOCK(sc);
 }
 

==== //depot/projects/soc2006/intr_filter/pci/if_xlreg.h#3 (text+ko) ====

@@ -608,10 +608,6 @@
 	bus_space_tag_t		xl_ftag;
 	struct mtx		xl_mtx;
 	struct task		xl_task;
-	struct taskqueue        *xl_tq;
-	struct task             xl_stat_tx_complete;
-	struct task             xl_stat_adfail;
-	struct task             xl_stat_statsoflow;
 #ifdef DEVICE_POLLING
 	int			rxcycles;
 #endif



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608052313.k75NDGeH064617>