[PATCH 1/6] staging: brcm80211: remove kernel_thread() for dhd_watchdog_thread.

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

 



Replaced kernel_thread() with kthread_run().  Used kthread_should_stop()
in place of watchdog_exited completion.  Replaced watchdog_pid with
struct task_struct.

watchdog_tsk is NULL when the task is not running.

Signed-off-by: Jason Cooper <jason@xxxxxxxxxxxxxx>
---
 drivers/staging/brcm80211/brcmfmac/dhd_linux.c |   29 ++++++++++++++----------
 1 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
index 0088d8a..3bb7654 100644
--- a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c
@@ -23,6 +23,7 @@
 
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/kthread.h>
 #include <linux/slab.h>
 #include <linux/skbuff.h>
 #include <linux/netdevice.h>
@@ -241,9 +242,8 @@ typedef struct dhd_info {
 	/* Thread based operation */
 	bool threads_only;
 	struct semaphore sdsem;
-	long watchdog_pid;
+	struct task_struct *watchdog_tsk;
 	struct semaphore watchdog_sem;
-	struct completion watchdog_exited;
 	long dpc_pid;
 	struct semaphore dpc_sem;
 	struct completion dpc_exited;
@@ -1312,10 +1312,10 @@ static int dhd_watchdog_thread(void *data)
 	}
 #endif				/* DHD_SCHED */
 
-	DAEMONIZE("dhd_watchdog");
-
 	/* Run until signal received */
 	while (1) {
+		if (kthread_should_stop())
+			break;
 		if (down_interruptible(&dhd->watchdog_sem) == 0) {
 			if (dhd->pub.dongle_reset == FALSE) {
 				WAKE_LOCK(&dhd->pub, WAKE_LOCK_WATCHDOG);
@@ -1330,14 +1330,14 @@ static int dhd_watchdog_thread(void *data)
 	}
 
 	WAKE_LOCK_DESTROY(&dhd->pub, WAKE_LOCK_WATCHDOG);
-	complete_and_exit(&dhd->watchdog_exited, 0);
+	return 0;
 }
 
 static void dhd_watchdog(unsigned long data)
 {
 	dhd_info_t *dhd = (dhd_info_t *) data;
 
-	if (dhd->watchdog_pid >= 0) {
+	if (dhd->watchdog_tsk) {
 		up(&dhd->watchdog_sem);
 
 		/* Reschedule the watchdog */
@@ -2017,10 +2017,15 @@ dhd_pub_t *dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen)
 	if (dhd_dpc_prio >= 0) {
 		/* Initialize watchdog thread */
 		sema_init(&dhd->watchdog_sem, 0);
-		init_completion(&dhd->watchdog_exited);
-		dhd->watchdog_pid = kernel_thread(dhd_watchdog_thread, dhd, 0);
+		dhd->watchdog_tsk = kthread_run(dhd_watchdog_thread, dhd,
+						"dhd_watchdog");
+		if (IS_ERR(dhd->watchdog_tsk)) {
+			printk(KERN_WARNING
+				"dhd_watchdog thread failed to start\n");
+			dhd->watchdog_tsk = NULL;
+		}
 	} else {
-		dhd->watchdog_pid = -1;
+		dhd->watchdog_tsk = NULL;
 	}
 
 	/* Set up the bottom half handler */
@@ -2351,9 +2356,9 @@ void dhd_detach(dhd_pub_t *dhdp)
 				unregister_netdev(ifp->net);
 			}
 
-			if (dhd->watchdog_pid >= 0) {
-				KILL_PROC(dhd->watchdog_pid, SIGTERM);
-				wait_for_completion(&dhd->watchdog_exited);
+			if (dhd->watchdog_tsk) {
+				kthread_stop(dhd->watchdog_tsk);
+				dhd->watchdog_tsk = NULL;
 			}
 
 			if (dhd->dpc_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