aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/P03-C3000-SIGSTOP_FIX_041207.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/P03-C3000-SIGSTOP_FIX_041207.patch')
-rw-r--r--recipes/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/P03-C3000-SIGSTOP_FIX_041207.patch195
1 files changed, 195 insertions, 0 deletions
diff --git a/recipes/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/P03-C3000-SIGSTOP_FIX_041207.patch b/recipes/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/P03-C3000-SIGSTOP_FIX_041207.patch
new file mode 100644
index 0000000000..332f52f939
--- /dev/null
+++ b/recipes/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/P03-C3000-SIGSTOP_FIX_041207.patch
@@ -0,0 +1,195 @@
+diff -Nur c3000_pre/linux/arch/arm/config.in c3000_work/linux/arch/arm/config.in
+--- c3000_pre/linux/arch/arm/config.in 2004-12-05 22:17:18.000000000 +0900
++++ c3000_work/linux/arch/arm/config.in 2004-12-06 01:13:03.000000000 +0900
+@@ -481,6 +481,7 @@
+ if [ "$CONFIG_SL_CCCR_CHANGE" = "y" ]; then
+ bool 'Core voltage change enable (EXPERIMENTAL)' CONFIG_CHANGE_CORE_VOLT
+ fi
++ bool 'Fix send SIGSTOP to all tasks at suspend (EXPERIMENTAL)' CONFIG_SL_SIGSTOP_FIX
+ if [ "$CONFIG_ARCH_SHARP_SL" = "y" ]; then
+ define_bool CONFIG_BATT y
+ fi
+diff -Nur c3000_pre/linux/arch/arm/mach-pxa/sharpsl_apm.c c3000_work/linux/arch/arm/mach-pxa/sharpsl_apm.c
+--- c3000_pre/linux/arch/arm/mach-pxa/sharpsl_apm.c 2004-12-05 22:17:18.000000000 +0900
++++ c3000_work/linux/arch/arm/mach-pxa/sharpsl_apm.c 2004-12-06 23:48:35.000000000 +0900
+@@ -75,6 +75,11 @@
+ #include <asm/system.h>
+ #include <asm/hardware.h>
+
++extern int errno;
++// unistd.h is included for the configuration ioctl stuff
++#define __KERNEL_SYSCALLS__ 1
++#include <asm/unistd.h>
++
+ #ifdef CONFIG_ARCH_SHARP_SL
+ #include <asm/irq.h>
+ #include <asm/arch/irqs.h>
+@@ -363,6 +368,8 @@
+ };
+ #define ERROR_COUNT (sizeof(error_table)/sizeof(lookup_t))
+
++#define APP_NAME_LIST "/etc/suspend.lst"
++
+ /*
+ * Function
+ */
+@@ -650,14 +657,81 @@
+ struct task_struct* p = NULL;
+ struct task_struct* tsk = current;
+
++#if defined(CONFIG_SL_SIGSTOP_FIX)
++ int fd,x;
++ mm_segment_t old_fs = get_fs ();
++ char line_buffer[256];
++
+ if (! spin_trylock(&lock))
+ return;
++
++ // Try opening the send sig application name list
++
++ set_fs(KERNEL_DS);
++ fd = open(APP_NAME_LIST, O_RDONLY, 0);
++ set_fs(old_fs);
+
+ /* send signal to all procs except for kernel-threads */
+ read_lock(&tasklist_lock);
++
++ if(fd < 0){
++ for_each_task(p) {
++ struct siginfo si;
++
++ if (p->pid == 1 || p->pid == tsk->pid || is_kernel_thread(p))
++ continue;
++ if (!strcmp(p->comm,"cardmgr")) { //Send sig to cardmgr
++ si.si_signo = signo;
++ si.si_errno = 0;
++ si.si_code = SI_KERNEL;
++ si.si_pid = tsk->pid;
++ si.si_uid = tsk->uid;
++ send_sig_info(signo, &si, p);
++ }
++ }
++
++ }else {
++ for(;;){
++ memset(line_buffer, '\0', 256);
++ set_fs(KERNEL_DS);
++ for (x = 0; x < 256; x++) {
++ if (!read(fd, &line_buffer[x], 1))
++ goto sig_send_done;
++ if (line_buffer[x] == '\n' || line_buffer[x] == '\r')
++ break;
++ }
++ set_fs(old_fs);
++
++ for_each_task(p) {
++ struct siginfo si;
++
++ if (p->pid == 1 || p->pid == tsk->pid || is_kernel_thread(p))
++ continue;
++ if (!strncmp(p->comm,line_buffer,strlen(p->comm))) { //Send sig to cardmgr
++// printk ("Send SIG to application\n");
++ si.si_signo = signo;
++ si.si_errno = 0;
++ si.si_code = SI_KERNEL;
++ si.si_pid = tsk->pid;
++ si.si_uid = tsk->uid;
++ send_sig_info(signo, &si, p);
++ }
++ }
++ }
++ sig_send_done:
++
++ close(fd);
++
++ }
++#else
++ if (! spin_trylock(&lock))
++ return;
++
++ /* send signal to all procs except for kernel-threads */
++ read_lock(&tasklist_lock);
+ for_each_task(p) {
+ struct siginfo si;
+-
++
+ if (p->pid == 1 || p->pid == tsk->pid || is_kernel_thread(p))
+ continue;
+
+@@ -667,7 +741,8 @@
+ si.si_pid = tsk->pid;
+ si.si_uid = tsk->uid;
+ send_sig_info(signo, &si, p);
+- }
++ }
++#endif
+ read_unlock(&tasklist_lock);
+
+ if (signo == SIGSTOP) {
+@@ -679,6 +754,58 @@
+ schedule();
+ set_current_state(state);
+
++#if defined(CONFIG_SL_SIGSTOP_FIX)
++ set_fs(KERNEL_DS);
++ fd = open(APP_NAME_LIST, O_RDONLY, 0);
++ set_fs(old_fs);
++
++ read_lock(&tasklist_lock);
++ if(fd < 0){
++ for_each_task(p) {
++ if (p->pid == 1 || p->pid == tsk->pid || is_kernel_thread(p))
++ continue;
++ if (!strcmp(p->comm,"cardmgr")) {
++// printk ("Check application stopped\n");
++
++ if (p->state != TASK_STOPPED) {
++ read_unlock(&tasklist_lock);
++ goto retry;
++ }
++ }
++ }
++ }else {
++
++ for(;;){
++ memset(line_buffer, '\0', 256);
++ old_fs = get_fs();
++ set_fs(KERNEL_DS);
++ for (x = 0; x < 256; x++) {
++ if (!read(fd, &line_buffer[x], 1))
++ goto sig_stop_done;
++ if (line_buffer[x] == '\n' || line_buffer[x] == '\r')
++ break;
++ }
++ set_fs(old_fs);
++
++ for_each_task(p) {
++ if (p->pid == 1 || p->pid == tsk->pid || is_kernel_thread(p))
++ continue;
++ if (!strncmp(p->comm,line_buffer,strlen(p->comm))) {
++
++ if (p->state != TASK_STOPPED) {
++ read_unlock(&tasklist_lock);
++ goto retry;
++ }
++ }
++ }
++ }
++ sig_stop_done:
++ close(fd);
++ }
++
++ read_unlock(&tasklist_lock);
++ }
++#else
+ read_lock(&tasklist_lock);
+ for_each_task(p) {
+ if (p->pid == 1 || p->pid == tsk->pid || is_kernel_thread(p))
+@@ -691,6 +818,7 @@
+ }
+ read_unlock(&tasklist_lock);
+ }
++#endif
+
+ spin_unlock(&lock);
+ }