PERFORCE change 136704 for review
Andrew Thompson
thompsa at FreeBSD.org
Sun Mar 2 23:53:02 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=136704
Change 136704 by thompsa at thompsa_heff on 2008/03/02 23:52:22
MF //depot/user/benjsc/wpi/sys/dev/wpi/if_wpi.c at 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;
More information about the p4-projects
mailing list