diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiStateMachine.java | 103 |
1 files changed, 67 insertions, 36 deletions
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 38d0ac8..6d9c0d0 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -198,7 +198,8 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno private ConnectivityManager mCm; private DummyWifiLogger mWifiLogger; private WifiApConfigStore mWifiApConfigStore; - private final boolean mP2pSupported; + private boolean mP2pSupported; + private boolean mDongleConnected; private boolean mIbssSupported; private final AtomicBoolean mP2pConnected = new AtomicBoolean(false); private boolean mTemporarilyDisconnectWifi = false; @@ -1155,6 +1156,8 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno mP2pSupported = mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_WIFI_DIRECT); + mDongleConnected = false; + mWifiNative = new WifiNative(mInterfaceName); mWifiConfigStore = new WifiConfigStore(context,this, mWifiNative); mWifiAutoJoinController = new WifiAutoJoinController(context, this, @@ -5274,16 +5277,19 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno void handlePreDhcpSetup() { mDhcpActive = true; - // Disable the coexistence mode - mWifiNative.setBluetoothCoexistenceMode( - mWifiNative.BLUETOOTH_COEXISTENCE_MODE_DISABLED); - // Disable power save and suspend optimizations during DHCP - // Note: The order here is important for now. Brcm driver changes - // power settings when we control suspend mode optimizations. - // TODO: Remove this comment when the driver is fixed. - setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, false); - mWifiNative.setPowerSave(false); + if (mDongleConnected == false) { + // Disable the coexistence mode + mWifiNative.setBluetoothCoexistenceMode( + mWifiNative.BLUETOOTH_COEXISTENCE_MODE_DISABLED); + + // Disable power save and suspend optimizations during DHCP + // Note: The order here is important for now. Brcm driver changes + // power settings when we control suspend mode optimizations. + // TODO: Remove this comment when the driver is fixed. + setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, false); + mWifiNative.setPowerSave(false); + } // Update link layer stats getWifiLinkLayerStats(false); @@ -5337,15 +5343,17 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno } void handlePostDhcpSetup() { - /* Restore power save and suspend optimizations */ - setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, true); - mWifiNative.setPowerSave(true); + if (mDongleConnected == false) { + /* Restore power save and suspend optimizations */ + setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, true); + mWifiNative.setPowerSave(true); - mWifiP2pChannel.sendMessage(WifiP2pServiceImpl.BLOCK_DISCOVERY, WifiP2pServiceImpl.DISABLED); + mWifiP2pChannel.sendMessage(WifiP2pServiceImpl.BLOCK_DISCOVERY, WifiP2pServiceImpl.DISABLED); - // Set the coexistence mode back to its default value - mWifiNative.setBluetoothCoexistenceMode( - mWifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE); + // Set the coexistence mode back to its default value + mWifiNative.setBluetoothCoexistenceMode( + mWifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE); + } mDhcpActive = false; } @@ -6047,8 +6055,12 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno * Avoids issues with drivers that do not handle interface down * on a running supplicant properly. */ + mDongleConnected = false; mWifiMonitor.killSupplicant(mP2pSupported); + mP2pSupported = mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_WIFI_DIRECT); + if (mWifiNative.loadDriver()) { try { mNwService.wifiFirmwareReload(mInterfaceName, "STA"); @@ -6096,7 +6108,21 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno } } else { loge("Failed to load driver"); - setWifiState(WifiManager.WIFI_STATE_FAILED); + + loge("trying to load external wifi dongle"); + mP2pSupported = false; + mWifiMonitor.killSupplicant(mP2pSupported); + + if (mWifiNative.startSupplicant(mP2pSupported)) { + setWifiState(WIFI_STATE_ENABLING); + if (DBG) log("Supplicant start successful"); + mWifiMonitor.startMonitoring(); + mDongleConnected = true; + transitionTo(mSupplicantStartingState); + } else { + loge("Failed to start supplicant!"); + setWifiState(WifiManager.WIFI_STATE_FAILED); + } } break; case CMD_START_AP: @@ -6527,23 +6553,26 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno mInDelayedStop = false; mDelayedStopCounter++; updateBatteryWorkSource(null); - /** - * Enable bluetooth coexistence scan mode when bluetooth connection is active. - * When this mode is on, some of the low-level scan parameters used by the - * driver are changed to reduce interference with bluetooth - */ - mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); - /* initialize network state */ - setNetworkDetailedState(DetailedState.DISCONNECTED); - /* Remove any filtering on Multicast v6 at start */ - mWifiNative.stopFilteringMulticastV6Packets(); + if (mDongleConnected == false) { + /** + * Enable bluetooth coexistence scan mode when bluetooth connection is active. + * When this mode is on, some of the low-level scan parameters used by the + * driver are changed to reduce interference with bluetooth + */ + mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); + /* initialize network state */ + setNetworkDetailedState(DetailedState.DISCONNECTED); - /* Reset Multicast v4 filtering state */ - if (mFilteringMulticastV4Packets.get()) { - mWifiNative.startFilteringMulticastV4Packets(); - } else { - mWifiNative.stopFilteringMulticastV4Packets(); + /* Remove any filtering on Multicast v6 at start */ + mWifiNative.stopFilteringMulticastV6Packets(); + + /* Reset Multicast v4 filtering state */ + if (mFilteringMulticastV4Packets.get()) { + mWifiNative.startFilteringMulticastV4Packets(); + } else { + mWifiNative.stopFilteringMulticastV4Packets(); + } } mDhcpActive = false; @@ -6647,9 +6676,11 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno } break; case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: - mBluetoothConnectionActive = (message.arg1 != - BluetoothAdapter.STATE_DISCONNECTED); - mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); + if (mDongleConnected == false) { + mBluetoothConnectionActive = (message.arg1 != + BluetoothAdapter.STATE_DISCONNECTED); + mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); + } break; case CMD_STOP_DRIVER: int mode = message.arg1; |