summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
authorjiaguo <jiaguo@marvell.com>2014-03-13 18:49:14 +0800
committerjiaguo <jiaguo@marvell.com>2014-03-13 18:49:14 +0800
commit4431a1c34d1a9c36b7251217a2783d09ee1a7ac3 (patch)
treed9698b8e14910cc14555b682e9410327050bd33e /wifi
parentc32be36fd0981685cc9c33d32ae9babc466e6ae2 (diff)
downloadhardware_libhardware_legacy-4431a1c34d1a9c36b7251217a2783d09ee1a7ac3.zip
hardware_libhardware_legacy-4431a1c34d1a9c36b7251217a2783d09ee1a7ac3.tar.gz
hardware_libhardware_legacy-4431a1c34d1a9c36b7251217a2783d09ee1a7ac3.tar.bz2
Wi-Fi HAL: fix supplicant start failed issue
init.svc.*(hostapd, p2p_supplicant) properties are set when starting STA or uAP via Wi-Fi HAL, after sending ctrl.start command to property_service, thread called wifi_start_supplicant will yield cpu for android init process to get scheduled, then init.svc.* status is read to check if supplicant status is running there is a chance that after scheld_yield returned, init is not scheduled, serial value is not updated, __system_property_read got the "stopped" status, then init is scheduled to update service status after that back to this loop in Wi-Fi HAL, serial is updated, but status is not reread, still used "stopped", then Wi-Fi HAL will report supplicant start failed as the following schedule sequence: process A(WifiStateMachine) process B(init) 1. ctl.start 2. scheld_yield 3. __system_proerty_read /*serial1, value1*/ 4. __system_property_update /*serial2, value2*/ 5. serial1 != serial2 6. value1 == "stopped" So after sched_yield, first check if serial is updated, then read service status Change-Id: I5181e0d4504c525832c033b9a35bd58ec63e1de8 Signed-off-by: jiaguo <jiaguo@marvell.com>
Diffstat (limited to 'wifi')
-rw-r--r--wifi/wifi.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/wifi/wifi.c b/wifi/wifi.c
index f11c1ab..25a6fb7 100644
--- a/wifi/wifi.c
+++ b/wifi/wifi.c
@@ -556,12 +556,16 @@ int wifi_start_supplicant(int p2p_supported)
pi = __system_property_find(supplicant_prop_name);
}
if (pi != NULL) {
- __system_property_read(pi, NULL, supp_status);
- if (strcmp(supp_status, "running") == 0) {
- return 0;
- } else if (__system_property_serial(pi) != serial &&
- strcmp(supp_status, "stopped") == 0) {
- return -1;
+ /*
+ * property serial updated means that init process is scheduled
+ * after we sched_yield, further property status checking is based on this */
+ if (__system_property_serial(pi) != serial) {
+ __system_property_read(pi, NULL, supp_status);
+ if (strcmp(supp_status, "running") == 0) {
+ return 0;
+ } else if (strcmp(supp_status, "stopped") == 0) {
+ return -1;
+ }
}
}
#else