summaryrefslogtreecommitdiffstats
path: root/drivers/staging/brcm80211/brcmfmac
diff options
context:
space:
mode:
authorJason Cooper <jason@lakedaemon.net>2010-10-09 14:51:11 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-10-10 05:39:48 -0700
commitecd7559d8d0d8daf329016b4db0686376fb5dada (patch)
tree6656765ba9f9e13a9cc34adc019f6951100b6944 /drivers/staging/brcm80211/brcmfmac
parent860708d9c8259e087f39505995d4d54b2e499fb9 (diff)
downloadop-kernel-dev-ecd7559d8d0d8daf329016b4db0686376fb5dada.zip
op-kernel-dev-ecd7559d8d0d8daf329016b4db0686376fb5dada.tar.gz
staging: brcm80211: remove kernel_thread() for dhd_dpc_thread.
use kthread_run(), kthread_stop(), and kthread_should_stop(). Removes dpc_pid, dpc_exited, and the call to DAEMONIZE. dpc_tsk is NULL when not running. Signed-off-by: Jason Cooper <jason@lakedaemon.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/brcm80211/brcmfmac')
-rw-r--r--drivers/staging/brcm80211/brcmfmac/dhd_linux.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
index a23191d..cb7af02 100644
--- a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
@@ -242,9 +242,8 @@ typedef struct dhd_info {
struct semaphore sdsem;
struct task_struct *watchdog_tsk;
struct semaphore watchdog_sem;
- long dpc_pid;
+ struct task_struct *dpc_tsk;
struct semaphore dpc_sem;
- struct completion dpc_exited;
/* Thread to issue ioctl for multicast */
long sysioc_pid;
@@ -1371,10 +1370,10 @@ static int dhd_dpc_thread(void *data)
}
#endif /* DHD_SCHED */
- DAEMONIZE("dhd_dpc");
-
/* Run until signal received */
while (1) {
+ if(kthread_should_stop())
+ break;
if (down_interruptible(&dhd->dpc_sem) == 0) {
/* Call bus dpc unless it indicated down
(then clean stop) */
@@ -1394,8 +1393,7 @@ static int dhd_dpc_thread(void *data)
}
WAKE_LOCK_DESTROY(&dhd->pub, WAKE_LOCK_DPC);
-
- complete_and_exit(&dhd->dpc_exited, 0);
+ return 0;
}
static void dhd_dpc(unsigned long data)
@@ -1417,7 +1415,7 @@ void dhd_sched_dpc(dhd_pub_t *dhdp)
{
dhd_info_t *dhd = (dhd_info_t *) dhdp->info;
- if (dhd->dpc_pid >= 0) {
+ if (dhd->dpc_tsk) {
up(&dhd->dpc_sem);
return;
}
@@ -2019,11 +2017,15 @@ dhd_pub_t *dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen)
if (dhd_dpc_prio >= 0) {
/* Initialize DPC thread */
sema_init(&dhd->dpc_sem, 0);
- init_completion(&dhd->dpc_exited);
- dhd->dpc_pid = kernel_thread(dhd_dpc_thread, dhd, 0);
+ dhd->dpc_tsk = kthread_run(dhd_dpc_thread, dhd, "dhd_dpc");
+ if (IS_ERR(dhd->dpc_tsk)) {
+ printk(KERN_WARNING
+ "dhd_dpc thread failed to start\n");
+ dhd->dpc_tsk = NULL;
+ }
} else {
tasklet_init(&dhd->tasklet, dhd_dpc, (unsigned long) dhd);
- dhd->dpc_pid = -1;
+ dhd->dpc_tsk = NULL;
}
if (dhd_sysioc) {
@@ -2344,10 +2346,11 @@ void dhd_detach(dhd_pub_t *dhdp)
dhd->watchdog_tsk = NULL;
}
- if (dhd->dpc_pid >= 0) {
- KILL_PROC(dhd->dpc_pid, SIGTERM);
- wait_for_completion(&dhd->dpc_exited);
- } else
+ if (dhd->dpc_tsk) {
+ kthread_stop(dhd->dpc_tsk);
+ dhd->dpc_tsk = NULL;
+ }
+ else
tasklet_kill(&dhd->tasklet);
if (dhd->sysioc_pid >= 0) {
OpenPOWER on IntegriCloud