diff options
author | Robert Greenwalt <robdroid@android.com> | 2009-10-22 17:03:47 -0700 |
---|---|---|
committer | Robert Greenwalt <robdroid@android.com> | 2009-10-23 11:12:47 -0700 |
commit | f75aa36fc86989ca3bae2f46207e6b897a32d7ae (patch) | |
tree | 9db13e2a175d53dada59b02d977e53ad9343532b /wifi/java/android/net | |
parent | 9069aa31accee9c23a4cf228ca27fe8fa8506a56 (diff) | |
download | frameworks_base-f75aa36fc86989ca3bae2f46207e6b897a32d7ae.zip frameworks_base-f75aa36fc86989ca3bae2f46207e6b897a32d7ae.tar.gz frameworks_base-f75aa36fc86989ca3bae2f46207e6b897a32d7ae.tar.bz2 |
Add wifi "HANGED" driver state triggering reload.
The driver can now report to us that they are hosed and we'll shut
down wifi and restart it - only to be used as a last resort.
Also fixing synch problem with updateWifiState.
bug: 2173119
Diffstat (limited to 'wifi/java/android/net')
-rw-r--r-- | wifi/java/android/net/wifi/WifiMonitor.java | 2 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiStateTracker.java | 47 |
2 files changed, 37 insertions, 12 deletions
diff --git a/wifi/java/android/net/wifi/WifiMonitor.java b/wifi/java/android/net/wifi/WifiMonitor.java index fc750e2..1e322bd 100644 --- a/wifi/java/android/net/wifi/WifiMonitor.java +++ b/wifi/java/android/net/wifi/WifiMonitor.java @@ -255,6 +255,8 @@ public class WifiMonitor { mWifiStateTracker.notifyDriverStopped(); } else if (state.equals("STARTED")) { mWifiStateTracker.notifyDriverStarted(); + } else if (state.equals("HANGED")) { + mWifiStateTracker.notifyDriverHung(); } } diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java index d8538ea..66552e4 100644 --- a/wifi/java/android/net/wifi/WifiStateTracker.java +++ b/wifi/java/android/net/wifi/WifiStateTracker.java @@ -87,12 +87,19 @@ public class WifiStateTracker extends NetworkStateTracker { /** * The driver is started or stopped. The object will be the state: true for * started, false for stopped. - */ + */ private static final int EVENT_DRIVER_STATE_CHANGED = 12; private static final int EVENT_PASSWORD_KEY_MAY_BE_INCORRECT = 13; private static final int EVENT_MAYBE_START_SCAN_POST_DISCONNECT = 14; /** + * The driver state indication. + */ + private static final int DRIVER_STARTED = 0; + private static final int DRIVER_STOPPED = 1; + private static final int DRIVER_HUNG = 2; + + /** * Interval in milliseconds between polling for connection * status items that are not sent via asynchronous events. * An example is RSSI (signal strength). @@ -556,7 +563,7 @@ public class WifiStateTracker extends NetworkStateTracker { mRunState = RUN_STATE_STOPPED; // Send a driver stopped message to our handler - Message.obtain(this, EVENT_DRIVER_STATE_CHANGED, 0, 0).sendToTarget(); + Message.obtain(this, EVENT_DRIVER_STATE_CHANGED, DRIVER_STOPPED, 0).sendToTarget(); } /** @@ -565,9 +572,17 @@ public class WifiStateTracker extends NetworkStateTracker { */ void notifyDriverStarted() { // Send a driver started message to our handler - Message.obtain(this, EVENT_DRIVER_STATE_CHANGED, 1, 0).sendToTarget(); + Message.obtain(this, EVENT_DRIVER_STATE_CHANGED, DRIVER_STARTED, 0).sendToTarget(); } - + + /** + * Send the tracker a notification that the Wi-Fi driver has hung and needs restarting. + */ + void notifyDriverHung() { + // Send a driver hanged message to our handler + Message.obtain(this, EVENT_DRIVER_STATE_CHANGED, DRIVER_HUNG, 0).sendToTarget(); + } + /** * Set the interval timer for polling connection information * that is not delivered asynchronously. @@ -1149,15 +1164,14 @@ public class WifiStateTracker extends NetworkStateTracker { break; case EVENT_DRIVER_STATE_CHANGED: - boolean driverStarted = msg.arg1 != 0; - // Wi-Fi driver state changed: - // [31- 1] Reserved for future use - // [ 0- 0] Driver start (1) or stopped (0) - eventLogParam = driverStarted ? 1 : 0; - EventLog.writeEvent(EVENTLOG_DRIVER_STATE_CHANGED, eventLogParam); - - if (driverStarted) { + // 0 STARTED + // 1 STOPPED + // 2 HUNG + EventLog.writeEvent(EVENTLOG_DRIVER_STATE_CHANGED, msg.arg1); + + switch (msg.arg1) { + case DRIVER_STARTED: /** * Set the number of allowed radio channels according * to the system setting, since it gets reset by the @@ -1176,6 +1190,15 @@ public class WifiStateTracker extends NetworkStateTracker { } } } + break; + case DRIVER_HUNG: + Log.e(TAG, "Wifi Driver reports HUNG - reloading."); + /** + * restart the driver - toggle off and on + */ + mWM.setWifiEnabled(false); + mWM.setWifiEnabled(true); + break; } noteRunState(); break; |