From: Daniel Ritz <daniel.ritz@gmx.ch>

- thread_done should only be completed when the wait_queue is installed.

- all wake up conditions should be checked before schedule()

this fixes a hang of rmmod in the sequence modprobe yenta_socket; rmmod
yenta_socket as reported by Andreas Steinmetz.  w/o this rmmod yenta_socket
can hang on wait_for_completion() in pcmcia_unregister_socket()

Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch>
Cc: Dominik Brodowski <linux@brodo.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 drivers/pcmcia/cs.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff -puN drivers/pcmcia/cs.c~pcmcia-cs-fix-possible-missed-wakeup drivers/pcmcia/cs.c
--- 25/drivers/pcmcia/cs.c~pcmcia-cs-fix-possible-missed-wakeup	Wed Aug 17 16:06:45 2005
+++ 25-akpm/drivers/pcmcia/cs.c	Wed Aug 17 16:06:45 2005
@@ -654,9 +654,10 @@ static int pccardd(void *__skt)
 		skt->thread = NULL;
 		complete_and_exit(&skt->thread_done, 0);
 	}
-	complete(&skt->thread_done);
 
 	add_wait_queue(&skt->thread_wait, &wait);
+	complete(&skt->thread_done);
+
 	for (;;) {
 		unsigned long flags;
 		unsigned int events;
@@ -682,11 +683,11 @@ static int pccardd(void *__skt)
 			continue;
 		}
 
-		schedule();
-		try_to_freeze();
-
 		if (!skt->thread)
 			break;
+
+		schedule();
+		try_to_freeze();
 	}
 	remove_wait_queue(&skt->thread_wait, &wait);
 
_