From owner-p4-projects@FreeBSD.ORG Tue Jan 2 02:41:29 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 2B48016A415; Tue, 2 Jan 2007 02:41:29 +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 E097716A40F for ; Tue, 2 Jan 2007 02:41:28 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id D21B713C448 for ; Tue, 2 Jan 2007 02:41:28 +0000 (UTC) (envelope-from kmacy@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 l022fSeX071430 for ; Tue, 2 Jan 2007 02:41:28 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l022fSAm071426 for perforce@freebsd.org; Tue, 2 Jan 2007 02:41:28 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 2 Jan 2007 02:41:28 GMT Message-Id: <200701020241.l022fSAm071426@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 112409 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: Tue, 02 Jan 2007 02:41:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=112409 Change 112409 by kmacy@kmacy_serendipity:sam_wifi on 2007/01/02 02:40:36 - use taskqueue to handle scanning actions to avoid issues with locking - scanning now works, but ural bails out under load complaining about not being able to read / write the MAC register - we may need an interlock between calls to the taskqueue Affected files ... .. //depot/projects/wifi/sys/dev/usb/if_ural.c#12 edit .. //depot/projects/wifi/sys/dev/usb/if_uralvar.h#7 edit Differences ... ==== //depot/projects/wifi/sys/dev/usb/if_ural.c#12 (text+ko) ==== @@ -112,6 +112,7 @@ static void ural_free_rx_list(struct ural_softc *); static int ural_media_change(struct ifnet *); static void ural_task(void *); +static void ural_scantask(void *); static int ural_newstate(struct ieee80211com *, enum ieee80211_state, int); static int ural_rxrate(struct ural_rx_desc *); @@ -425,6 +426,8 @@ MTX_DEF | MTX_RECURSE); usb_init_task(&sc->sc_task, ural_task, sc); + usb_init_task(&sc->sc_scantask, ural_scantask, sc); + callout_init(&sc->amrr_ch, 0); /* retrieve RT2570 rev. no */ @@ -791,6 +794,28 @@ sc->sc_newstate(ic, sc->sc_state, -1); } +static void +ural_scantask(void *arg) +{ + struct ural_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + + if (sc->sc_scan_action == URAL_SCAN_START) { + /* abort TSF synchronization */ + ural_write(sc, RAL_TXRX_CSR19, 0); + ural_set_bssid(sc, ifp->if_broadcastaddr); + } else if (sc->sc_scan_action == URAL_SET_CHANNEL) { + mtx_lock(&Giant); + ural_set_chan(sc, ic->ic_curchan); + mtx_unlock(&Giant); + } else { + ural_enable_tsf_sync(sc); + /* XXX keep local copy */ + ural_set_bssid(sc, ic->ic_bss->ni_bssid); + } +} + static int ural_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) { @@ -1732,34 +1757,40 @@ static void ural_scan_start(struct ieee80211com *ic) { - struct ifnet *ifp = ic->ic_ifp; - struct ural_softc *sc = ifp->if_softc; + struct ural_softc *sc = ic->ic_ifp->if_softc; + + usb_rem_task(sc->sc_udev, &sc->sc_scantask); + + /* do it in a process context */ + sc->sc_scan_action = URAL_SCAN_START; + usb_add_task(sc->sc_udev, &sc->sc_scantask, USB_TASKQ_DRIVER); - /* abort TSF synchronization */ - ural_write(sc, RAL_TXRX_CSR19, 0); - ural_set_bssid(sc, ifp->if_broadcastaddr); } static void ural_scan_end(struct ieee80211com *ic) { - struct ifnet *ifp = ic->ic_ifp; - struct ural_softc *sc = ifp->if_softc; + struct ural_softc *sc = ic->ic_ifp->if_softc; + + usb_rem_task(sc->sc_udev, &sc->sc_scantask); + + /* do it in a process context */ + sc->sc_scan_action = URAL_SCAN_END; + usb_add_task(sc->sc_udev, &sc->sc_scantask, USB_TASKQ_DRIVER); - ural_enable_tsf_sync(sc); - /* XXX keep local copy */ - ural_set_bssid(sc, ic->ic_bss->ni_bssid); } static void ural_set_channel(struct ieee80211com *ic) { - struct ifnet *ifp = ic->ic_ifp; - struct ural_softc *sc = ifp->if_softc; + + struct ural_softc *sc = ic->ic_ifp->if_softc; + + usb_rem_task(sc->sc_udev, &sc->sc_scantask); - mtx_lock(&Giant); - ural_set_chan(sc, ic->ic_curchan); - mtx_unlock(&Giant); + /* do it in a process context */ + sc->sc_scan_action = URAL_SET_CHANNEL; + usb_add_task(sc->sc_udev, &sc->sc_scantask, USB_TASKQ_DRIVER); } static void ==== //depot/projects/wifi/sys/dev/usb/if_uralvar.h#7 (text+ko) ==== @@ -20,6 +20,11 @@ #define RAL_RX_LIST_COUNT 1 #define RAL_TX_LIST_COUNT 1 +#define URAL_SCAN_START 1 +#define URAL_SCAN_END 2 +#define URAL_SET_CHANNEL 3 + + struct ural_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; uint8_t wr_flags; @@ -98,7 +103,9 @@ usbd_pipe_handle sc_tx_pipeh; enum ieee80211_state sc_state; + int sc_scan_action; /* should be an enum */ struct usb_task sc_task; + struct usb_task sc_scantask; struct ural_amrr amrr;