diff options
| author | Irfan Sheriff <isheriff@google.com> | 2012-05-14 14:26:07 -0700 |
|---|---|---|
| committer | Irfan Sheriff <isheriff@google.com> | 2012-05-14 16:21:10 -0700 |
| commit | f91d4e7bdd6923b6f724b7956c0a87714e61fd13 (patch) | |
| tree | a47baf05367eef835debe71cca843bfd19210a3f /wifi/java/android | |
| parent | 0fa152912e55f2d08f0a8d1260332a81e5706694 (diff) | |
| download | frameworks_base-f91d4e7bdd6923b6f724b7956c0a87714e61fd13.zip frameworks_base-f91d4e7bdd6923b6f724b7956c0a87714e61fd13.tar.gz frameworks_base-f91d4e7bdd6923b6f724b7956c0a87714e61fd13.tar.bz2 | |
Add work around to restart driver on failure
A driver start can fail and device can stay stuck in that state.
Add a work around to retry once after a period of time and then
reload wifi if that does not work.
Bug: 6005966
Change-Id: I930554ac96ac25da2a38e49630d375656e32f6f6
Diffstat (limited to 'wifi/java/android')
| -rw-r--r-- | wifi/java/android/net/wifi/WifiStateMachine.java | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index b099202..2903faa 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -182,6 +182,14 @@ public class WifiStateMachine extends StateMachine { /* Tracks sequence number on a tether notification time out */ private int mTetherToken = 0; + /** + * Driver start time out. + */ + private static final int DRIVER_START_TIME_OUT_MSECS = 10000; + + /* Tracks sequence number on a driver time out */ + private int mDriverStartToken = 0; + private LinkProperties mLinkProperties; /* Tracks sequence number on a periodic scan message */ @@ -250,7 +258,8 @@ public class WifiStateMachine extends StateMachine { static final int CMD_STOP_SUPPLICANT_FAILED = BASE + 17; /* Delayed stop to avoid shutting down driver too quick*/ static final int CMD_DELAYED_STOP_DRIVER = BASE + 18; - + /* A delayed message sent to start driver when it fail to come up */ + static final int CMD_DRIVER_START_TIMED_OUT = BASE + 19; /* Start the soft access point */ static final int CMD_START_AP = BASE + 21; @@ -1837,6 +1846,7 @@ public class WifiStateMachine extends StateMachine { case CMD_START_DRIVER: case CMD_STOP_DRIVER: case CMD_DELAYED_STOP_DRIVER: + case CMD_DRIVER_START_TIMED_OUT: case CMD_START_AP: case CMD_START_AP_SUCCESS: case CMD_START_AP_FAILURE: @@ -2476,10 +2486,16 @@ public class WifiStateMachine extends StateMachine { } class DriverStartingState extends State { + private int mTries; @Override public void enter() { if (DBG) log(getName() + "\n"); EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName()); + + mTries = 1; + /* Send ourselves a delayed message to start driver a second time */ + sendMessageDelayed(obtainMessage(CMD_DRIVER_START_TIMED_OUT, + ++mDriverStartToken, 0), DRIVER_START_TIME_OUT_MSECS); } @Override public boolean processMessage(Message message) { @@ -2495,6 +2511,24 @@ public class WifiStateMachine extends StateMachine { transitionTo(mDriverStartedState); } break; + case CMD_DRIVER_START_TIMED_OUT: + if (message.arg1 == mDriverStartToken) { + if (mTries >= 2) { + loge("Failed to start driver after " + mTries); + transitionTo(mDriverStoppedState); + } else { + loge("Driver start failed, retrying"); + mWakeLock.acquire(); + mWifiNative.startDriver(); + mWakeLock.release(); + + ++mTries; + /* Send ourselves a delayed message to start driver again */ + sendMessageDelayed(obtainMessage(CMD_DRIVER_START_TIMED_OUT, + ++mDriverStartToken, 0), DRIVER_START_TIME_OUT_MSECS); + } + } + break; /* Queue driver commands & connection events */ case CMD_START_DRIVER: case CMD_STOP_DRIVER: |
