[PATCH 2/6] staging: brcm80211: remove kernel_thread() for dhd_dpc_thread.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxx>
---
 drivers/staging/brcm80211/brcmfmac/dhd_linux.c |   31 +++++++++++++----------
 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 3bb7654..a680a32 100644
--- a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
@@ -244,9 +244,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;
@@ -1377,10 +1376,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) */
@@ -1400,8 +1399,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)
@@ -1423,7 +1421,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;
 	}
@@ -2032,11 +2030,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) {
@@ -2361,10 +2363,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) {
-- 
1.6.3.3

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel


[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux