diff options
Diffstat (limited to 'arch/x86/mach-voyager/voyager_thread.c')
-rw-r--r-- | arch/x86/mach-voyager/voyager_thread.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/arch/x86/mach-voyager/voyager_thread.c b/arch/x86/mach-voyager/voyager_thread.c index 50f9366c411e..c69c931818ed 100644 --- a/arch/x86/mach-voyager/voyager_thread.c +++ b/arch/x86/mach-voyager/voyager_thread.c | |||
@@ -30,12 +30,10 @@ | |||
30 | #include <asm/mtrr.h> | 30 | #include <asm/mtrr.h> |
31 | #include <asm/msr.h> | 31 | #include <asm/msr.h> |
32 | 32 | ||
33 | |||
34 | struct task_struct *voyager_thread; | 33 | struct task_struct *voyager_thread; |
35 | static __u8 set_timeout; | 34 | static __u8 set_timeout; |
36 | 35 | ||
37 | static int | 36 | static int execute(const char *string) |
38 | execute(const char *string) | ||
39 | { | 37 | { |
40 | int ret; | 38 | int ret; |
41 | 39 | ||
@@ -52,48 +50,48 @@ execute(const char *string) | |||
52 | NULL, | 50 | NULL, |
53 | }; | 51 | }; |
54 | 52 | ||
55 | if ((ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC)) != 0) { | 53 | if ((ret = |
56 | printk(KERN_ERR "Voyager failed to run \"%s\": %i\n", | 54 | call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC)) != 0) { |
57 | string, ret); | 55 | printk(KERN_ERR "Voyager failed to run \"%s\": %i\n", string, |
56 | ret); | ||
58 | } | 57 | } |
59 | return ret; | 58 | return ret; |
60 | } | 59 | } |
61 | 60 | ||
62 | static void | 61 | static void check_from_kernel(void) |
63 | check_from_kernel(void) | ||
64 | { | 62 | { |
65 | if(voyager_status.switch_off) { | 63 | if (voyager_status.switch_off) { |
66 | 64 | ||
67 | /* FIXME: This should be configurable via proc */ | 65 | /* FIXME: This should be configurable via proc */ |
68 | execute("umask 600; echo 0 > /etc/initrunlvl; kill -HUP 1"); | 66 | execute("umask 600; echo 0 > /etc/initrunlvl; kill -HUP 1"); |
69 | } else if(voyager_status.power_fail) { | 67 | } else if (voyager_status.power_fail) { |
70 | VDEBUG(("Voyager daemon detected AC power failure\n")); | 68 | VDEBUG(("Voyager daemon detected AC power failure\n")); |
71 | 69 | ||
72 | /* FIXME: This should be configureable via proc */ | 70 | /* FIXME: This should be configureable via proc */ |
73 | execute("umask 600; echo F > /etc/powerstatus; kill -PWR 1"); | 71 | execute("umask 600; echo F > /etc/powerstatus; kill -PWR 1"); |
74 | set_timeout = 1; | 72 | set_timeout = 1; |
75 | } | 73 | } |
76 | } | 74 | } |
77 | 75 | ||
78 | static void | 76 | static void check_continuing_condition(void) |
79 | check_continuing_condition(void) | ||
80 | { | 77 | { |
81 | if(voyager_status.power_fail) { | 78 | if (voyager_status.power_fail) { |
82 | __u8 data; | 79 | __u8 data; |
83 | voyager_cat_psi(VOYAGER_PSI_SUBREAD, | 80 | voyager_cat_psi(VOYAGER_PSI_SUBREAD, |
84 | VOYAGER_PSI_AC_FAIL_REG, &data); | 81 | VOYAGER_PSI_AC_FAIL_REG, &data); |
85 | if((data & 0x1f) == 0) { | 82 | if ((data & 0x1f) == 0) { |
86 | /* all power restored */ | 83 | /* all power restored */ |
87 | printk(KERN_NOTICE "VOYAGER AC power restored, cancelling shutdown\n"); | 84 | printk(KERN_NOTICE |
85 | "VOYAGER AC power restored, cancelling shutdown\n"); | ||
88 | /* FIXME: should be user configureable */ | 86 | /* FIXME: should be user configureable */ |
89 | execute("umask 600; echo O > /etc/powerstatus; kill -PWR 1"); | 87 | execute |
88 | ("umask 600; echo O > /etc/powerstatus; kill -PWR 1"); | ||
90 | set_timeout = 0; | 89 | set_timeout = 0; |
91 | } | 90 | } |
92 | } | 91 | } |
93 | } | 92 | } |
94 | 93 | ||
95 | static int | 94 | static int thread(void *unused) |
96 | thread(void *unused) | ||
97 | { | 95 | { |
98 | printk(KERN_NOTICE "Voyager starting monitor thread\n"); | 96 | printk(KERN_NOTICE "Voyager starting monitor thread\n"); |
99 | 97 | ||
@@ -102,7 +100,7 @@ thread(void *unused) | |||
102 | schedule_timeout(set_timeout ? HZ : MAX_SCHEDULE_TIMEOUT); | 100 | schedule_timeout(set_timeout ? HZ : MAX_SCHEDULE_TIMEOUT); |
103 | 101 | ||
104 | VDEBUG(("Voyager Daemon awoken\n")); | 102 | VDEBUG(("Voyager Daemon awoken\n")); |
105 | if(voyager_status.request_from_kernel == 0) { | 103 | if (voyager_status.request_from_kernel == 0) { |
106 | /* probably awoken from timeout */ | 104 | /* probably awoken from timeout */ |
107 | check_continuing_condition(); | 105 | check_continuing_condition(); |
108 | } else { | 106 | } else { |
@@ -112,20 +110,18 @@ thread(void *unused) | |||
112 | } | 110 | } |
113 | } | 111 | } |
114 | 112 | ||
115 | static int __init | 113 | static int __init voyager_thread_start(void) |
116 | voyager_thread_start(void) | ||
117 | { | 114 | { |
118 | voyager_thread = kthread_run(thread, NULL, "kvoyagerd"); | 115 | voyager_thread = kthread_run(thread, NULL, "kvoyagerd"); |
119 | if (IS_ERR(voyager_thread)) { | 116 | if (IS_ERR(voyager_thread)) { |
120 | printk(KERN_ERR "Voyager: Failed to create system monitor thread.\n"); | 117 | printk(KERN_ERR |
118 | "Voyager: Failed to create system monitor thread.\n"); | ||
121 | return PTR_ERR(voyager_thread); | 119 | return PTR_ERR(voyager_thread); |
122 | } | 120 | } |
123 | return 0; | 121 | return 0; |
124 | } | 122 | } |
125 | 123 | ||
126 | 124 | static void __exit voyager_thread_stop(void) | |
127 | static void __exit | ||
128 | voyager_thread_stop(void) | ||
129 | { | 125 | { |
130 | kthread_stop(voyager_thread); | 126 | kthread_stop(voyager_thread); |
131 | } | 127 | } |