Loading drivers/pcmcia/cs.c +13 −11 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <linux/pm.h> #include <linux/pci.h> #include <linux/device.h> #include <linux/kthread.h> #include <asm/system.h> #include <asm/irq.h> Loading Loading @@ -176,6 +177,7 @@ static int pccardd(void *__skt); */ int pcmcia_register_socket(struct pcmcia_socket *socket) { struct task_struct *tsk; int ret; if (!socket || !socket->ops || !socket->dev.dev || !socket->resource_ops) Loading Loading @@ -239,15 +241,18 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) mutex_init(&socket->skt_mutex); spin_lock_init(&socket->thread_lock); ret = kernel_thread(pccardd, socket, CLONE_KERNEL); if (ret < 0) tsk = kthread_run(pccardd, socket, "pccardd"); if (IS_ERR(tsk)) { ret = PTR_ERR(tsk); goto err; } wait_for_completion(&socket->thread_done); 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; Loading @@ -272,10 +277,8 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops); if (socket->thread) { init_completion(&socket->thread_done); socket->thread = NULL; wake_up(&socket->thread_wait); wait_for_completion(&socket->thread_done); kthread_stop(socket->thread); } release_cis_mem(socket); Loading Loading @@ -630,8 +633,6 @@ static int pccardd(void *__skt) DECLARE_WAITQUEUE(wait, current); int ret; daemonize("pccardd"); skt->thread = current; skt->socket = dead_socket; skt->ops->init(skt); Loading @@ -643,7 +644,8 @@ static int pccardd(void *__skt) 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); return 0; } add_wait_queue(&skt->thread_wait, &wait); Loading Loading @@ -674,7 +676,7 @@ static int pccardd(void *__skt) continue; } if (!skt->thread) if (kthread_should_stop()) break; schedule(); Loading @@ -688,7 +690,7 @@ static int pccardd(void *__skt) /* remove from the device core */ class_device_unregister(&skt->dev); complete_and_exit(&skt->thread_done, 0); return 0; } /* Loading Loading
drivers/pcmcia/cs.c +13 −11 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <linux/pm.h> #include <linux/pci.h> #include <linux/device.h> #include <linux/kthread.h> #include <asm/system.h> #include <asm/irq.h> Loading Loading @@ -176,6 +177,7 @@ static int pccardd(void *__skt); */ int pcmcia_register_socket(struct pcmcia_socket *socket) { struct task_struct *tsk; int ret; if (!socket || !socket->ops || !socket->dev.dev || !socket->resource_ops) Loading Loading @@ -239,15 +241,18 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) mutex_init(&socket->skt_mutex); spin_lock_init(&socket->thread_lock); ret = kernel_thread(pccardd, socket, CLONE_KERNEL); if (ret < 0) tsk = kthread_run(pccardd, socket, "pccardd"); if (IS_ERR(tsk)) { ret = PTR_ERR(tsk); goto err; } wait_for_completion(&socket->thread_done); 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; Loading @@ -272,10 +277,8 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops); if (socket->thread) { init_completion(&socket->thread_done); socket->thread = NULL; wake_up(&socket->thread_wait); wait_for_completion(&socket->thread_done); kthread_stop(socket->thread); } release_cis_mem(socket); Loading Loading @@ -630,8 +633,6 @@ static int pccardd(void *__skt) DECLARE_WAITQUEUE(wait, current); int ret; daemonize("pccardd"); skt->thread = current; skt->socket = dead_socket; skt->ops->init(skt); Loading @@ -643,7 +644,8 @@ static int pccardd(void *__skt) 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); return 0; } add_wait_queue(&skt->thread_wait, &wait); Loading Loading @@ -674,7 +676,7 @@ static int pccardd(void *__skt) continue; } if (!skt->thread) if (kthread_should_stop()) break; schedule(); Loading @@ -688,7 +690,7 @@ static int pccardd(void *__skt) /* remove from the device core */ class_device_unregister(&skt->dev); complete_and_exit(&skt->thread_done, 0); return 0; } /* Loading