[PATCH 4/6] staging: brcm80211: remove kernel_thread() for _iscan_sysioc_thread.

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

 



Replace kernel_thread() with kthread_run, kthread_stop() and
kthread_should_stop().  Remove sysioc_pid, sysioc_exit, and DAEMONIZE.

sysioc_tsk is NULL when not running.

Signed-off-by: Jason Cooper <jason@xxxxxxxxxxxxxx>
---
 drivers/staging/brcm80211/brcmfmac/wl_iw.c |   43 +++++++++++++---------------
 1 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/drivers/staging/brcm80211/brcmfmac/wl_iw.c b/drivers/staging/brcm80211/brcmfmac/wl_iw.c
index ca4f0b3..bbe136e 100644
--- a/drivers/staging/brcm80211/brcmfmac/wl_iw.c
+++ b/drivers/staging/brcm80211/brcmfmac/wl_iw.c
@@ -18,6 +18,7 @@
 
 #include <typedefs.h>
 #include <linuxver.h>
+#include <linux/kthread.h>
 #include <osl.h>
 
 #include <bcmutils.h>
@@ -107,13 +108,6 @@ static wlc_ssid_t g_specific_ssid;
 
 static wlc_ssid_t g_ssid;
 
-#define DAEMONIZE(a) \
-	do { \
-		daemonize(a); \
-		allow_signal(SIGKILL); \
-		allow_signal(SIGTERM); \
-	} while (0)
-
 #if defined(WL_IW_USE_ISCAN)
 #define ISCAN_STATE_IDLE   0
 #define ISCAN_STATE_SCANING 1
@@ -133,9 +127,8 @@ typedef struct iscan_info {
 	iscan_buf_t *list_hdr;
 	iscan_buf_t *list_cur;
 
-	long sysioc_pid;
+	struct task_struct *sysioc_tsk;
 	struct semaphore sysioc_sem;
-	struct completion sysioc_exited;
 
 #if defined CSCAN
 	char ioctlbuf[WLC_IOCTL_MEDLEN];
@@ -970,7 +963,7 @@ wl_iw_iscan_get_aplist(struct net_device *dev,
 	if (!extra)
 		return -EINVAL;
 
-	if ((!iscan) || (iscan->sysioc_pid < 0)) {
+	if ((!iscan) || (!iscan->sysioc_tsk)) {
 		WL_ERROR(("%s error\n", __func__));
 		return 0;
 	}
@@ -1188,10 +1181,11 @@ static int _iscan_sysioc_thread(void *data)
 	u32 status;
 	iscan_info_t *iscan = (iscan_info_t *) data;
 	static bool iscan_pass_abort = FALSE;
-	DAEMONIZE("iscan_sysioc");
 
 	status = WL_SCAN_RESULTS_PARTIAL;
 	while (down_interruptible(&iscan->sysioc_sem) == 0) {
+		if (kthread_should_stop())
+			break;
 
 		if (iscan->timer_on) {
 			del_timer_sync(&iscan->timer);
@@ -1254,7 +1248,7 @@ static int _iscan_sysioc_thread(void *data)
 		del_timer_sync(&iscan->timer);
 		iscan->timer_on = 0;
 	}
-	complete_and_exit(&iscan->sysioc_exited, 0);
+	return 0;
 }
 #endif				/* WL_IW_USE_ISCAN */
 
@@ -1374,7 +1368,7 @@ wl_iw_iscan_set_scan(struct net_device *dev,
 	}
 #endif
 
-	if ((!iscan) || (iscan->sysioc_pid < 0))
+	if ((!iscan) || (!iscan->sysioc_tsk))
 		return wl_iw_set_scan(dev, info, wrqu, extra);
 
 	if (g_scan_specified_ssid) {
@@ -1757,8 +1751,8 @@ wl_iw_iscan_get_scan(struct net_device *dev,
 		return -EINVAL;
 	}
 
-	if ((!iscan) || (iscan->sysioc_pid < 0)) {
-		WL_ERROR(("%ssysioc_pid\n", __func__));
+	if ((!iscan) || (!iscan->sysioc_tsk)) {
+		WL_ERROR(("%ssysioc_tsk\n", __func__));
 		return wl_iw_get_scan(dev, info, dwrq, extra);
 	}
 
@@ -3540,7 +3534,7 @@ void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void *data)
 
 	case WLC_E_SCAN_COMPLETE:
 #if defined(WL_IW_USE_ISCAN)
-		if ((g_iscan) && (g_iscan->sysioc_pid > 0) &&
+		if ((g_iscan) && (g_iscan->sysioc_tsk) &&
 		    (g_iscan->iscan_state != ISCAN_STATE_IDLE)) {
 			up(&g_iscan->sysioc_sem);
 		} else {
@@ -3726,7 +3720,7 @@ int wl_iw_attach(struct net_device *dev, void *dhdp)
 	if (!iscan->iscan_ex_params_p)
 		return -ENOMEM;
 	iscan->iscan_ex_param_size = params_size;
-	iscan->sysioc_pid = -1;
+	iscan->sysioc_tsk = NULL;
 
 	g_iscan = iscan;
 	iscan->dev = dev;
@@ -3738,10 +3732,12 @@ int wl_iw_attach(struct net_device *dev, void *dhdp)
 	iscan->timer.function = wl_iw_timerfunc;
 
 	sema_init(&iscan->sysioc_sem, 0);
-	init_completion(&iscan->sysioc_exited);
-	iscan->sysioc_pid = kernel_thread(_iscan_sysioc_thread, iscan, 0);
-	if (iscan->sysioc_pid < 0)
+	iscan->sysioc_tsk = kthread_run(_iscan_sysioc_thread, iscan,
+					"_iscan_sysioc");
+	if (IS_ERR(iscan->sysioc_tsk)) {
+		iscan->sysioc_tsk = NULL;
 		return -ENOMEM;
+	}
 #endif				/* defined(WL_IW_USE_ISCAN) */
 
 	iw = *(wl_iw_t **) netdev_priv(dev);
@@ -3772,10 +3768,11 @@ void wl_iw_detach(void)
 
 	if (!iscan)
 		return;
-	if (iscan->sysioc_pid >= 0) {
-		KILL_PROC(iscan->sysioc_pid, SIGTERM);
-		wait_for_completion(&iscan->sysioc_exited);
+	if (iscan->sysioc_tsk) {
+		kthread_stop(iscan->sysioc_tsk);
+		iscan->sysioc_tsk = NULL;
 	}
+
 	MUTEX_LOCK_WL_SCAN_SET();
 	while (iscan->list_hdr) {
 		buf = iscan->list_hdr->next;
-- 
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