@@ -182,6 +182,14 @@ public class WifiStateMachine extends StateMachine {
182182 /* Tracks sequence number on a tether notification time out */
183183 private int mTetherToken = 0 ;
184184
185+ /**
186+ * Driver start time out.
187+ */
188+ private static final int DRIVER_START_TIME_OUT_MSECS = 10000 ;
189+
190+ /* Tracks sequence number on a driver time out */
191+ private int mDriverStartToken = 0 ;
192+
185193 private LinkProperties mLinkProperties ;
186194
187195 /* Tracks sequence number on a periodic scan message */
@@ -250,7 +258,8 @@ public class WifiStateMachine extends StateMachine {
250258 static final int CMD_STOP_SUPPLICANT_FAILED = BASE + 17 ;
251259 /* Delayed stop to avoid shutting down driver too quick*/
252260 static final int CMD_DELAYED_STOP_DRIVER = BASE + 18 ;
253-
261+ /* A delayed message sent to start driver when it fail to come up */
262+ static final int CMD_DRIVER_START_TIMED_OUT = BASE + 19 ;
254263
255264 /* Start the soft access point */
256265 static final int CMD_START_AP = BASE + 21 ;
@@ -1837,6 +1846,7 @@ public boolean processMessage(Message message) {
18371846 case CMD_START_DRIVER :
18381847 case CMD_STOP_DRIVER :
18391848 case CMD_DELAYED_STOP_DRIVER :
1849+ case CMD_DRIVER_START_TIMED_OUT :
18401850 case CMD_START_AP :
18411851 case CMD_START_AP_SUCCESS :
18421852 case CMD_START_AP_FAILURE :
@@ -2476,10 +2486,16 @@ public boolean processMessage(Message message) {
24762486 }
24772487
24782488 class DriverStartingState extends State {
2489+ private int mTries ;
24792490 @ Override
24802491 public void enter () {
24812492 if (DBG ) log (getName () + "\n " );
24822493 EventLog .writeEvent (EVENTLOG_WIFI_STATE_CHANGED , getName ());
2494+
2495+ mTries = 1 ;
2496+ /* Send ourselves a delayed message to start driver a second time */
2497+ sendMessageDelayed (obtainMessage (CMD_DRIVER_START_TIMED_OUT ,
2498+ ++mDriverStartToken , 0 ), DRIVER_START_TIME_OUT_MSECS );
24832499 }
24842500 @ Override
24852501 public boolean processMessage (Message message ) {
@@ -2495,6 +2511,24 @@ public boolean processMessage(Message message) {
24952511 transitionTo (mDriverStartedState );
24962512 }
24972513 break ;
2514+ case CMD_DRIVER_START_TIMED_OUT :
2515+ if (message .arg1 == mDriverStartToken ) {
2516+ if (mTries >= 2 ) {
2517+ loge ("Failed to start driver after " + mTries );
2518+ transitionTo (mDriverStoppedState );
2519+ } else {
2520+ loge ("Driver start failed, retrying" );
2521+ mWakeLock .acquire ();
2522+ mWifiNative .startDriver ();
2523+ mWakeLock .release ();
2524+
2525+ ++mTries ;
2526+ /* Send ourselves a delayed message to start driver again */
2527+ sendMessageDelayed (obtainMessage (CMD_DRIVER_START_TIMED_OUT ,
2528+ ++mDriverStartToken , 0 ), DRIVER_START_TIME_OUT_MSECS );
2529+ }
2530+ }
2531+ break ;
24982532 /* Queue driver commands & connection events */
24992533 case CMD_START_DRIVER :
25002534 case CMD_STOP_DRIVER :
0 commit comments