From owner-p4-projects@FreeBSD.ORG Sun Mar 2 23:53:02 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8AD921065678; Sun, 2 Mar 2008 23:53:02 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4AD1D1065670 for ; Sun, 2 Mar 2008 23:53:02 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 249848FC21 for ; Sun, 2 Mar 2008 23:53:02 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m22Nr2LC047929 for ; Sun, 2 Mar 2008 23:53:02 GMT (envelope-from thompsa@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m22Nr1HY047927 for perforce@freebsd.org; Sun, 2 Mar 2008 23:53:01 GMT (envelope-from thompsa@freebsd.org) Date: Sun, 2 Mar 2008 23:53:01 GMT Message-Id: <200803022353.m22Nr1HY047927@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to thompsa@freebsd.org using -f From: Andrew Thompson To: Perforce Change Reviews Cc: Subject: PERFORCE change 136704 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: Sun, 02 Mar 2008 23:53:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=136704 Change 136704 by thompsa@thompsa_heff on 2008/03/02 23:52:22 MF //depot/user/benjsc/wpi/sys/dev/wpi/if_wpi.c@134347 Poll the HW switch. Affected files ... .. //depot/projects/wifi/sys/dev/wpi/if_wpi.c#13 edit .. //depot/projects/wifi/sys/dev/wpi/if_wpivar.h#4 edit Differences ... ==== //depot/projects/wifi/sys/dev/wpi/if_wpi.c#13 (text+ko) ==== @@ -129,6 +129,7 @@ WPI_DEBUG_TEMP = 0x00000200, /* TXPower/Temp Calibration */ WPI_DEBUG_OPS = 0x00000400, /* wpi_ops taskq debug */ WPI_DEBUG_WATCHDOG = 0x00000800, /* Watch dog debug */ + WPI_DEBUG_HWSWITCH = 0x00001000, /* Watch hwswitch callout */ WPI_DEBUG_ANY = 0xffffffff }; @@ -201,10 +202,6 @@ static uint8_t wpi_plcp_signal(int); static int wpi_queue_cmd(struct wpi_softc *, int); static void wpi_tick(void *); -#if 0 -static void wpi_radio_on(void *, int); -static void wpi_radio_off(void *, int); -#endif static int wpi_tx_data(struct wpi_softc *, struct mbuf *, struct ieee80211_node *, int); static void wpi_start(struct ifnet *); @@ -246,6 +243,7 @@ static void wpi_power_calibration(struct wpi_softc *, int); static int wpi_get_power_index(struct wpi_softc *, struct wpi_power_group *, struct ieee80211_channel *, int); +static void wpi_radio(void *); static const char *wpi_cmd_str(int); static int wpi_probe(device_t); static int wpi_attach(device_t); @@ -539,16 +537,13 @@ #endif /* Create the tasks that can be queued */ -#if 0 - TASK_INIT(&sc->sc_radioontask, 0, wpi_radio_on, sc); - TASK_INIT(&sc->sc_radioofftask, 0, wpi_radio_off, sc); -#endif TASK_INIT(&sc->sc_opstask, 0, wpi_ops, sc); TASK_INIT(&sc->sc_restarttask, 0, wpi_restart, sc); WPI_LOCK_INIT(sc); WPI_CMD_LOCK_INIT(sc); + callout_init_mtx(&sc->hwswitch_to, &sc->sc_mtx, 0); callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0); callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0); @@ -778,6 +773,7 @@ wpi_stop(sc); callout_drain(&sc->watchdog_to); callout_drain(&sc->calib_to); + callout_drain(&sc->hwswitch_to); bpfdetach(ifp); ieee80211_ifdetach(ic); } @@ -1851,6 +1847,7 @@ device_printf(sc->sc_dev, "Radio transmitter is switched off\n"); sc->flags |= WPI_FLAG_HW_RADIO_OFF; + /* XXX Do something? */ break; } sc->flags &= ~WPI_FLAG_HW_RADIO_OFF; @@ -3183,7 +3180,7 @@ /* At this point the firmware is up and running. If the hardware * RF switch is turned off thermal calibration will fail, though * the card is still happy to continue to accept commands, catch - * this case and record the hw is disabled. + * this case and schedule a task to watch for it to be turned on. */ wpi_mem_lock(sc); tmp = wpi_mem_read(sc, WPI_MEM_HW_RADIO_OFF); @@ -3194,6 +3191,7 @@ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; device_printf(sc->sc_dev,"Radio Transmitter is switched off\n"); + callout_reset(&sc->hwswitch_to, hz, wpi_tick, sc); goto fail; } @@ -3601,23 +3599,41 @@ #undef fdivround } -#if 0 +/** + * Called from a callout, wpi_radio checks the state of hw switch and + * if it's enabled restarts the device. The hardware doesn't give us an + * interupt when the hw switch is toggled on, only off hence we poll + * the device checking. Calling callout locks mtx; + */ static void -wpi_radio_on(void *arg, int pending) +wpi_radio(void *arg) { struct wpi_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + int tmp; - device_printf(sc->sc_dev, "radio turned on\n"); -} + wpi_mem_lock(sc); + tmp = wpi_mem_read(sc, WPI_MEM_HW_RADIO_OFF); + wpi_mem_unlock(sc); + + DPRINTFN(WPI_DEBUG_HWSWITCH, + ("wpi_radio callout: radio %d\n",tmp&0x1)); -static void -wpi_radio_off(void *arg, int pending) -{ - struct wpi_softc *sc = arg; + if (tmp & 0x1) { + // Radio enabled + device_printf(sc->sc_dev, "Hardware Switch Enabled\n"); + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + ifp->if_drv_flags |= IFF_DRV_RUNNING; - device_printf(sc->sc_dev, "radio turned off\n"); + callout_reset(&sc->watchdog_to, hz, wpi_tick, sc); + if (ic->ic_opmode == IEEE80211_M_MONITOR) + ieee80211_new_state(ic, IEEE80211_S_RUN, -1); + else if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL) + ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); + } else + callout_reset(&sc->hwswitch_to, hz, wpi_radio, sc); } -#endif /** * Called by net80211 framework to indicate that a scan ==== //depot/projects/wifi/sys/dev/wpi/if_wpivar.h#4 (text+ko) ==== @@ -142,6 +142,9 @@ struct callout amrr_ch; + /* Hardware switch polling timer */ + struct callout hwswitch_to; + struct resource *irq; struct resource *mem; bus_space_tag_t sc_st;