diff -ur --new-file linux-2.2.14/Makefile linux-2.2.14-wake1/Makefile
--- linux-2.2.14/Makefile	Wed Mar 22 23:08:43 2000
+++ linux-2.2.14-wake1/Makefile	Wed Mar 22 23:11:18 2000
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 2
 SUBLEVEL = 14
-EXTRAVERSION = 
+EXTRAVERSION = -wake1
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
diff -ur --new-file linux-2.2.14/include/linux/sched.h linux-2.2.14-wake1/include/linux/sched.h
--- linux-2.2.14/include/linux/sched.h	Wed Mar 22 23:13:54 2000
+++ linux-2.2.14-wake1/include/linux/sched.h	Thu Mar 23 00:36:42 2000
@@ -79,6 +79,7 @@
 #define TASK_ZOMBIE		4
 #define TASK_STOPPED		8
 #define TASK_SWAPPING		16
+#define TASK_EXCLUSIVE		32
 
 /*
  * Scheduling policies
@@ -492,6 +493,8 @@
 
 #define wake_up(x)			__wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
 #define wake_up_interruptible(x)	__wake_up((x),TASK_INTERRUPTIBLE)
+#define wake_one(x)			__wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE | TASK_EXCLUSIVE)
+#define wake_one_interruptible(x)	__wake_up((x),TASK_INTERRUPTIBLE | TASK_EXCLUSIVE)
 
 extern int in_group_p(gid_t grp);
 
diff -ur --new-file linux-2.2.14/include/net/tcp.h linux-2.2.14-wake1/include/net/tcp.h
--- linux-2.2.14/include/net/tcp.h	Wed Mar 22 23:14:05 2000
+++ linux-2.2.14-wake1/include/net/tcp.h	Thu Mar 23 00:36:53 2000
@@ -493,6 +493,8 @@
 extern struct sock *		tcp_accept(struct sock *sk, int flags);
 extern unsigned int		tcp_poll(struct file * file, struct socket *sock, struct poll_table_struct *wait);
 extern void			tcp_write_space(struct sock *sk); 
+extern void                    tcp_wakeup(struct sock *sk);
+extern void                    tcp_data_ready(struct sock *sk, int len);
 
 extern int			tcp_getsockopt(struct sock *sk, int level, 
 					       int optname, char *optval, 
diff -ur --new-file linux-2.2.14/kernel/sched.c linux-2.2.14-wake1/kernel/sched.c
--- linux-2.2.14/kernel/sched.c	Wed Mar 22 23:08:23 2000
+++ linux-2.2.14-wake1/kernel/sched.c	Thu Mar 23 00:06:22 2000
@@ -912,6 +912,8 @@
 				goto out;
 			}
 			wake_up_process(p);
+                        if (TASK_EXCLUSIVE & mode)
+                                break;
 		}
 	}
 out_unlock:
diff -ur --new-file linux-2.2.14/net/ipv4/tcp.c linux-2.2.14-wake1/net/ipv4/tcp.c
--- linux-2.2.14/net/ipv4/tcp.c	Wed Mar 22 23:08:24 2000
+++ linux-2.2.14-wake1/net/ipv4/tcp.c	Thu Mar 23 00:07:56 2000
@@ -612,10 +612,31 @@
 	if (sk->dead)
 		return; 
 
-	wake_up_interruptible(sk->sleep);
+	wake_one_interruptible(sk->sleep);
 	if (sock_wspace(sk) >=
 	    tcp_min_write_space(sk))
 		sock_wake_async(sk->socket, 2);
+}
+
+/*
+ *     Socket state_change callback.
+ */
+void tcp_wakeup(struct sock *sk)
+{
+        if(!sk->dead)
+                wake_one_interruptible(sk->sleep);
+}
+
+
+/*
+ *     Socket data_ready callback.
+ */
+void tcp_data_ready(struct sock *sk, int len)
+{
+        if(!sk->dead) {
+                wake_one_interruptible(sk->sleep);
+                sock_wake_async(sk->socket,1);
+        }
 }
 
 
diff -ur --new-file linux-2.2.14/net/ipv4/tcp_ipv4.c linux-2.2.14-wake1/net/ipv4/tcp_ipv4.c
--- linux-2.2.14/net/ipv4/tcp_ipv4.c	Wed Mar 22 23:08:24 2000
+++ linux-2.2.14-wake1/net/ipv4/tcp_ipv4.c	Thu Mar 23 00:09:50 2000
@@ -1959,6 +1959,8 @@
 	tp->rcv_mss = 536; 
 
 	sk->write_space = tcp_write_space; 
+        sk->state_change = tcp_wakeup;
+        sk->data_ready = tcp_data_ready;
 
 	/* Init SYN queue. */
 	tcp_synq_init(tp);
diff -ur --new-file linux-2.2.14/net/netsyms.c linux-2.2.14-wake1/net/netsyms.c
--- linux-2.2.14/net/netsyms.c	Wed Mar 22 23:08:24 2000
+++ linux-2.2.14-wake1/net/netsyms.c	Thu Mar 23 00:10:19 2000
@@ -297,6 +297,8 @@
 EXPORT_SYMBOL(tcp_write_wakeup);
 EXPORT_SYMBOL(tcp_read_wakeup);
 EXPORT_SYMBOL(tcp_write_space);
+EXPORT_SYMBOL(tcp_wakeup);
+EXPORT_SYMBOL(tcp_data_ready);
 EXPORT_SYMBOL(tcp_poll);
 EXPORT_SYMBOL(tcp_ioctl);
 EXPORT_SYMBOL(tcp_shutdown);
