hardware/x86power
Revision | 338e1f465738acec2d2ca5f9ef2d390456a5d752 (tree) |
---|---|
Time | 2016-09-07 03:44:44 |
Author | Chih-Wei Huang <cwhuang@linu...> |
Commiter | Chih-Wei Huang |
Unload/reload wifi driver on suspend/resume
@@ -15,7 +15,7 @@ include $(CLEAR_VARS) | ||
15 | 15 | LOCAL_MODULE := power.x86 |
16 | 16 | LOCAL_MODULE_RELATIVE_PATH := hw |
17 | 17 | LOCAL_SRC_FILES := power.c |
18 | -LOCAL_SHARED_LIBRARIES := liblog | |
18 | +LOCAL_SHARED_LIBRARIES := liblog libcutils | |
19 | 19 | LOCAL_MODULE_TAGS := optional |
20 | 20 | |
21 | 21 | include $(BUILD_SHARED_LIBRARY) |
@@ -21,6 +21,10 @@ | ||
21 | 21 | |
22 | 22 | #include <hardware/hardware.h> |
23 | 23 | #include <hardware/power.h> |
24 | +#include <cutils/properties.h> | |
25 | +#include <cutils/probe_module.h> | |
26 | + | |
27 | +extern int delete_module(const char *, unsigned int); | |
24 | 28 | |
25 | 29 | #define SYS_CPU "/sys/devices/system/cpu" |
26 | 30 | #define CPU_ONLINE "1" |
@@ -51,6 +55,24 @@ static void power_init(struct power_module *module) | ||
51 | 55 | |
52 | 56 | static void power_set_interactive(struct power_module *module, int on) |
53 | 57 | { |
58 | + char mod[PROPERTY_VALUE_MAX]; | |
59 | + if ((!property_get("wlan.no-unload-driver", mod, NULL) || strcmp(mod, "1")) | |
60 | + && property_get("wlan.modname", mod, NULL)) { | |
61 | + if (on) { | |
62 | + if (insmod_by_dep(mod, "", NULL, 0, NULL)) { | |
63 | + ALOGE("insmod %s failed", mod); | |
64 | + } else { | |
65 | + ALOGD("reload %s OK", mod); | |
66 | + } | |
67 | + } else { | |
68 | + if (delete_module(mod, O_NONBLOCK)) { | |
69 | + ALOGE("rmmod %s failed", mod); | |
70 | + } else { | |
71 | + ALOGD("unload %s OK", mod); | |
72 | + } | |
73 | + } | |
74 | + } | |
75 | + | |
54 | 76 | set_nonboot_cpu_state(on ? CPU_ONLINE : CPU_OFFLINE); |
55 | 77 | } |
56 | 78 |