]> git.hungrycats.org Git - linux/commitdiff
[PCMCIA] check for proper registration with device core
authorDominik Brodowski <linux@de.rmk.(none)>
Mon, 5 Jul 2004 22:33:44 +0000 (23:33 +0100)
committerRussell King <rmk@flint.arm.linux.org.uk>
Mon, 5 Jul 2004 22:33:44 +0000 (23:33 +0100)
Patch from Dominik Brodowski

Fail if registration of socket with driver core failed. This is
necessary so that socket-related sysfs entries will appear always
if a socket thread is up and running.

drivers/pcmcia/cs.c

index 44bfe71c70cffc5006610af58fd4351fc81874aa..23ab71385a8ed17fd482ec1f874c7e698782155c 100644 (file)
@@ -264,7 +264,10 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
                goto err;
 
        wait_for_completion(&socket->thread_done);
-       BUG_ON(!socket->thread);
+       if(!socket->thread) {
+               printk(KERN_WARNING "PCMCIA: warning: socket thread for socket %p did not start\n", socket);
+               return -EIO;
+       }
        pcmcia_parse_events(socket, SS_DETECT);
 
        return 0;
@@ -678,9 +681,8 @@ static int pccardd(void *__skt)
        int ret;
 
        daemonize("pccardd");
-       skt->thread = current;
-       complete(&skt->thread_done);
 
+       skt->thread = current;
        skt->socket = dead_socket;
        skt->ops->init(skt);
        skt->ops->set_socket(skt, &skt->socket);
@@ -690,7 +692,10 @@ static int pccardd(void *__skt)
        if (ret) {
                printk(KERN_WARNING "PCMCIA: unable to register socket 0x%p\n",
                        skt);
+               skt->thread = NULL;
+               complete_and_exit(&skt->thread_done, 0);
        }
+       complete(&skt->thread_done);
 
        add_wait_queue(&skt->thread_wait, &wait);
        for (;;) {