From owner-p4-projects@FreeBSD.ORG Mon Mar 5 11:19:16 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9DD6616A403; Mon, 5 Mar 2007 11:19:16 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 7578B16A400 for ; Mon, 5 Mar 2007 11:19:16 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 59FAC13C49D for ; Mon, 5 Mar 2007 11:19:16 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l25BJGQr013355 for ; Mon, 5 Mar 2007 11:19:16 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l25BJGuf013352 for perforce@freebsd.org; Mon, 5 Mar 2007 11:19:16 GMT (envelope-from piso@freebsd.org) Date: Mon, 5 Mar 2007 11:19:16 GMT Message-Id: <200703051119.l25BJGuf013352@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 115327 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Mar 2007 11:19:17 -0000 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)