b43: Add simple firmware watchdog
PATCH 1/1 b43: Add simple firmware watchdog
This adds a simple firmware watchdog for the opensource firmware. This will check every 15 seconds, if the firmware zeroed out the watchdog register. The firmware will do this in its eventloop.
Signed-off-by Michael Buesch <[email protected]>
---
John, please queue for 2.6.27
drivers/net/wireless/b43/main.c +15 -0
@@ -2805,12 +2805,27 @@ static void b43_periodic_every30sec(strub43_calculate_link_quality (dev); }static void b43_periodic_every15sec (struct b43_wldev *dev) {struct b43_phy *phy = &dev->phy; +u16 wdr; + +if (dev->fw.opensource) { +/* Check if the firmware is still alive. +* It will reset the watchdog counter to 0 in its idle loop. */ + wdr =b43_shm_read16 (dev,B43_SHM_SCRATCH ,B43_WATCHDOG_REG ); +if (unlikely (wdr)) { +b43err (dev->wl,"Firmware watchdog: The firmware died!\n" ); +b43_controller_restart (dev,"Firmware watchdog" ); +return ; + }else { +b43_shm_write16 (dev,B43_SHM_SCRATCH , +B43_WATCHDOG_REG ,1 ); + } + }if (phy->type ==B43_PHYTYPE_G ) {//TODO: update_aci_moving_average if (phy->aci_enable && phy->aci_wlan_automatic) {b43_mac_suspend (dev);if (!phy->aci_enable &&1 /*TODO: not scanning? */ ) {
drivers/net/wireless/b43/b43.h +2 -0
@@ -438,12 +438,14 @@ enum {/* The firmware register to fetch the panic reason from. */ #define B43_FWPANIC_REASON_REG 3/* Firmware panic reason codes */ #define B43_FWPANIC_DIE 0/* Firmware died. Don't auto-restart it. */ #define B43_FWPANIC_RESTART 1/* Firmware died. Schedule a controller reset. */ +/* The firmware register that contains the watchdog counter. */ +#define B43_WATCHDOG_REG 1/* Device specific rate values. * The actual values defined here are (rate_in_mbps * 2). * Some code depends on this. Don't change it. */ #define B43_CCK_RATE_1MB 0x02#define B43_CCK_RATE_2MB 0x04