summaryrefslogtreecommitdiffstats
path: root/wifi/java/android/net
diff options
context:
space:
mode:
authorRobert Greenwalt <robdroid@android.com>2009-10-22 17:03:47 -0700
committerRobert Greenwalt <robdroid@android.com>2009-10-23 11:12:47 -0700
commitf75aa36fc86989ca3bae2f46207e6b897a32d7ae (patch)
tree9db13e2a175d53dada59b02d977e53ad9343532b /wifi/java/android/net
parent9069aa31accee9c23a4cf228ca27fe8fa8506a56 (diff)
downloadframeworks_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.java2
-rw-r--r--wifi/java/android/net/wifi/WifiStateTracker.java47
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;