libertas: create a worker thread for association

Marcelo Tosatti mtosatti at redhat.unroutablecom
Mon Dec 11 15:18:31 EST 2006


Commit:     a7e6965a2978b81a98dbb21634139930c74ba317
Parent:     7a61fcc9f6c78aba9d7d32b10baf5bc55f0b63c2
commit a7e6965a2978b81a98dbb21634139930c74ba317
Author:     Marcelo Tosatti <mtosatti at redhat.com>
AuthorDate: Fri Dec 8 19:06:43 2006 -0200
Commit:     Marcelo Tosatti <mtosatti at redhat.com>
CommitDate: Fri Dec 8 19:06:43 2006 -0200

    libertas: create a worker thread for association
    
    Association work on keventd is causing delay on other important
    events such as user input.
    
    Move it to its own worker thread.
    
    Signed-off-by: Marcelo Tosatti <mtosatti at redhat.com>
---
 drivers/net/wireless/libertas/wlan_assoc.h |    2 +-
 drivers/net/wireless/libertas/wlan_dev.h   |    1 +
 drivers/net/wireless/libertas/wlan_main.c  |    4 ++++
 3 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/drivers/net/wireless/libertas/wlan_assoc.h b/drivers/net/wireless/libertas/wlan_assoc.h
index 31ba5f6..1c2ca1e 100644
--- a/drivers/net/wireless/libertas/wlan_assoc.h
+++ b/drivers/net/wireless/libertas/wlan_assoc.h
@@ -28,7 +28,7 @@ #define ASSOC_DELAY (HZ / 2)
 static inline void wlan_postpone_association_work(wlan_private *priv)
 {
 	cancel_delayed_work(&priv->assoc_work);
-	schedule_delayed_work(&priv->assoc_work, ASSOC_DELAY);
+	queue_delayed_work(priv->assoc_thread, &priv->assoc_work, ASSOC_DELAY);
 }
 
 static inline void wlan_cancel_association_work(wlan_private *priv)
diff --git a/drivers/net/wireless/libertas/wlan_dev.h b/drivers/net/wireless/libertas/wlan_dev.h
index 467a0f5..f90c0a7 100644
--- a/drivers/net/wireless/libertas/wlan_dev.h
+++ b/drivers/net/wireless/libertas/wlan_dev.h
@@ -219,6 +219,7 @@ struct _wlan_private {
 	struct wlan_thread MainThread;
 
 	struct work_struct assoc_work;
+	struct workqueue_struct *assoc_thread;
 
 #ifdef REASSOCIATION
 	/** thread to service mac events */
diff --git a/drivers/net/wireless/libertas/wlan_main.c b/drivers/net/wireless/libertas/wlan_main.c
index ef297c6..1befb60 100644
--- a/drivers/net/wireless/libertas/wlan_main.c
+++ b/drivers/net/wireless/libertas/wlan_main.c
@@ -996,6 +996,8 @@ #define NETIF_F_DYNALLOC 16
 	wlan_create_thread(wlan_service_main_thread,
 			   &priv->MainThread, "wlan_main_service");
 
+	priv->assoc_thread =
+		create_singlethread_workqueue("libertas_assoc");
 	INIT_WORK(&priv->assoc_work, wlan_association_worker, dev);
 
 #ifdef REASSOCIATION
@@ -1101,6 +1103,8 @@ static int wlan_remove_card(void *card)
 	dev = priv->wlan_dev.netdev;
 	mesh_dev = priv->mesh_dev;
 
+	destroy_workqueue(priv->assoc_thread);
+
 	if (Adapter->CurCmd) {
 		dprintk(1, "Wake up current cmdwait_q\n");
 		wake_up_interruptible(&Adapter->CurCmd->cmdwait_q);


More information about the Commits-kernel mailing list