Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Mar 2007 11:19:16 GMT
From:      Paolo Pisati <piso@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 115327 for review
Message-ID:  <200703051119.l25BJGuf013352@repoman.freebsd.org>

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

Change 115327 by piso@piso_longino on 2007/03/05 11:18:40

	Toss the overcomplicated implementation of iwi filtered handler.

Affected files ...

.. //depot/projects/soc2006/intr_filter/dev/iwi/if_iwi.c#12 edit
.. //depot/projects/soc2006/intr_filter/dev/iwi/if_iwivar.h#6 edit

Differences ...

==== //depot/projects/soc2006/intr_filter/dev/iwi/if_iwi.c#12 (text+ko) ====

@@ -143,13 +143,9 @@
 static void	iwi_frame_intr(struct iwi_softc *, struct iwi_rx_data *, int,
 		    struct iwi_frame *);
 static void	iwi_notification_intr(struct iwi_softc *, struct iwi_notif *);
-static void	iwi_rx_intr(void *);
+static void	iwi_rx_intr(struct iwi_softc *);
 static void	iwi_tx_intr(struct iwi_softc *, struct iwi_tx_ring *);
-static void     iwi_tx_intr1(void *c, int p __unused);
-static void     iwi_tx_intr2(void *c, int p __unused);
-static void     iwi_tx_intr3(void *c, int p __unused);
-static void     iwi_tx_intr4(void *c, int p __unused);
-static int      iwi_filter(void *);
+static void	iwi_intr(void *);
 static int	iwi_cmd(struct iwi_softc *, uint8_t, void *, uint8_t);
 static void	iwi_write_ibssnode(struct iwi_softc *, const u_int8_t [], int);
 static int	iwi_tx_start(struct ifnet *, struct mbuf *,
@@ -269,7 +265,7 @@
 
 	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
 	    MTX_DEF);
-	
+
 	sc->sc_unr = new_unrhdr(1, IWI_MAX_IBSSNODE-1, &sc->sc_mtx);
 
 #if __FreeBSD_version >= 700000
@@ -292,10 +288,6 @@
 	TASK_INIT(&sc->sc_setwmetask, 0, iwi_wme_setparams, sc);
 	TASK_INIT(&sc->sc_downtask, 0, iwi_down, sc);
 	TASK_INIT(&sc->sc_restarttask, 0, iwi_restart, sc);
-	TASK_INIT(&sc->sc_tx1_done, 0, iwi_tx_intr1, sc);
-	TASK_INIT(&sc->sc_tx2_done, 0, iwi_tx_intr2, sc);
-	TASK_INIT(&sc->sc_tx3_done, 0, iwi_tx_intr3, sc);
-	TASK_INIT(&sc->sc_tx4_done, 0, iwi_tx_intr4, sc);
 
 	if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
 		device_printf(dev, "chip is in D%d power mode "
@@ -1561,15 +1553,12 @@
 }
 
 static void
-iwi_rx_intr(void *arg)
+iwi_rx_intr(struct iwi_softc *sc)
 {
-	struct iwi_softc *sc = arg;
 	struct iwi_rx_data *data;
 	struct iwi_hdr *hdr;
 	uint32_t hw;
-	IWI_LOCK_DECL;
 
-	IWI_LOCK(sc);
 	hw = CSR_READ_4(sc, IWI_CSR_RX_RIDX);
 
 	for (; sc->rxq.cur != hw;) {
@@ -1604,8 +1593,6 @@
 	/* tell the firmware what we have processed */
 	hw = (hw == 0) ? IWI_RX_RING_COUNT - 1 : hw - 1;
 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, hw);
-	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
-	IWI_UNLOCK(sc);
 }
 
 static void
@@ -1615,9 +1602,7 @@
 	struct ifnet *ifp = ic->ic_ifp;
 	struct iwi_tx_data *data;
 	uint32_t hw;
-	IWI_LOCK_DECL;
 
-	IWI_LOCK(sc);	
 	hw = CSR_READ_4(sc, txq->csr_ridx);
 
 	for (; txq->next != hw;) {
@@ -1646,94 +1631,64 @@
 		iwi_led_event(sc, IWI_LED_TX);
 
 	iwi_start(ifp);
-	IWI_UNLOCK(sc);
 }
 
 static void
-iwi_tx_intr1(void *arg, int p __unused) {
+iwi_intr(void *arg)
+{
 	struct iwi_softc *sc = arg;
-
-	iwi_tx_intr(sc, &sc->txq[0]);
-}
-
-static void
-iwi_tx_intr2(void *arg, int p __unused) {
-	struct iwi_softc *sc = arg;
-
-	iwi_tx_intr(sc, &sc->txq[1]);
-}
-
-static void
-iwi_tx_intr3(void *arg, int p __unused) {
-	struct iwi_softc *sc = arg;
-
-	iwi_tx_intr(sc, &sc->txq[2]);
-}
-
-static void
-iwi_tx_intr4(void *arg, int p __unused) {
-	struct iwi_softc *sc = arg;
+	uint32_t r;
 	IWI_LOCK_DECL;
 
-	IWI_LOCK(sc);		
-	iwi_tx_intr(sc, &sc->txq[3]);
-	IWI_UNLOCK(sc);
-}
+	IWI_LOCK(sc);
 
-static int
-iwi_filter(void *arg)
-{
-	struct iwi_softc *sc = arg;
-	uint32_t r;
-	int ret = FILTER_HANDLED;
-
-	if ((r = CSR_READ_4(sc, IWI_CSR_INTR)) == 0 || r == 0xffffffff)
-		return (FILTER_STRAY);
+	if ((r = CSR_READ_4(sc, IWI_CSR_INTR)) == 0 || r == 0xffffffff) {
+		IWI_UNLOCK(sc);
+		return;
+	}
 
 	/* acknowledge interrupts */
 	CSR_WRITE_4(sc, IWI_CSR_INTR, r);
 
+	if (r & IWI_INTR_FATAL_ERROR) {
+		device_printf(sc->sc_dev, "firmware error\n");
+		taskqueue_enqueue(sc->sc_tq, &sc->sc_restarttask);
+	}
+
 	if (r & IWI_INTR_FW_INITED) {
 		if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
 			wakeup(sc);
 	}
-	
+
+	if (r & IWI_INTR_RADIO_OFF)
+		taskqueue_enqueue(sc->sc_tq, &sc->sc_radiofftask);
+
 	if (r & IWI_INTR_CMD_DONE) {
 		sc->flags &= ~IWI_FLAG_BUSY;
 		wakeup(sc);
 	}
 
-	if (r & IWI_INTR_PARITY_ERROR) {
-		/* XXX rate-limit */
-		device_printf(sc->sc_dev, "parity error\n");
-	}
-
-	if (r & IWI_INTR_FATAL_ERROR) {
-		device_printf(sc->sc_dev, "firmware error\n");
-		taskqueue_enqueue(sc->sc_tq, &sc->sc_restarttask);
-	}
-
-	if (r & IWI_INTR_RADIO_OFF)
-		taskqueue_enqueue(sc->sc_tq, &sc->sc_radiofftask);
-	
 	if (r & IWI_INTR_TX1_DONE)
-		taskqueue_enqueue(sc->sc_tq, &sc->sc_tx1_done);
+		iwi_tx_intr(sc, &sc->txq[0]);
 
 	if (r & IWI_INTR_TX2_DONE)
-		taskqueue_enqueue(sc->sc_tq, &sc->sc_tx2_done);
+		iwi_tx_intr(sc, &sc->txq[1]);
 
 	if (r & IWI_INTR_TX3_DONE)
-		taskqueue_enqueue(sc->sc_tq, &sc->sc_tx3_done);
+		iwi_tx_intr(sc, &sc->txq[2]);
 
 	if (r & IWI_INTR_TX4_DONE)
-		taskqueue_enqueue(sc->sc_tq, &sc->sc_tx4_done);
-	
-	if (r & IWI_INTR_RX_DONE) {	
-		/* disable interrupts */
-		CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
-		ret |= FILTER_SCHEDULE_THREAD;
+		iwi_tx_intr(sc, &sc->txq[3]);
+
+	if (r & IWI_INTR_RX_DONE)
+		iwi_rx_intr(sc);
+
+	if (r & IWI_INTR_PARITY_ERROR) {
+		/* XXX rate-limit */
+		device_printf(sc->sc_dev, "parity error\n");
 	}
-	return (ret);
+
+	IWI_UNLOCK(sc);
 }
 
 static int
@@ -2166,7 +2121,6 @@
 	CSR_WRITE_4(sc, IWI_CSR_RST, tmp | IWI_RST_PRINCETON_RESET);
 
 	sc->flags &= ~IWI_FLAG_FW_INITED;
-	
 }
 
 static int
@@ -3323,7 +3277,6 @@
 
 	IWI_LOCK_CHECK(sc);	/* XXX: pretty sure this triggers */
 	if (sc->sc_softled) {
-		IWI_ASSERT_OWNED(sc);
 		callout_stop(&sc->sc_ledtimer);
 		sc->sc_blinking = 0;
 	}
@@ -3385,14 +3338,11 @@
 iwi_radio_off(void *arg, int pending)
 {
 	struct iwi_softc *sc = arg;
-	IWI_LOCK_DECL;
 
-	IWI_LOCK(sc);
 	device_printf(sc->sc_dev, "radio turned off\n");
 	iwi_stop(sc);
 	sc->sc_rfkill_timer = 2;
 	sc->sc_ifp->if_timer = 1;
-	IWI_UNLOCK(sc);
 }
 
 static int

==== //depot/projects/soc2006/intr_filter/dev/iwi/if_iwivar.h#6 (text+ko) ====

@@ -190,10 +190,6 @@
 	struct task		sc_setwmetask;	/* set wme params processing */
 	struct task		sc_downtask;	/* disassociate processing */
 	struct task		sc_restarttask;	/* restart adapter processing */
-	struct task             sc_tx1_done;
-	struct task             sc_tx2_done;
-	struct task             sc_tx3_done;
-	struct task             sc_tx4_done;
 
 	unsigned int		sc_softled : 1,	/* enable LED gpio status */
 				sc_ledstate: 1,	/* LED on/off state */
@@ -247,7 +243,3 @@
 	if (!__waslocked)			\
 		mtx_unlock(&(sc)->sc_mtx);	\
 } while (0)
-
-#define IWI_ASSERT_OWNED(sc)    do {            \
-        mtx_assert(&(sc)->sc_mtx, MA_OWNED);    \
-} while (0)



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