libertas: saner driver shutdown

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


Commit:     20832e32a7df8f8eafc6c65073c8f467696c5066
Parent:     dd31161817c26aa7117aebef87c99796ceb813c0
commit 20832e32a7df8f8eafc6c65073c8f467696c5066
Author:     Marcelo Tosatti <mtosatti at redhat.com>
AuthorDate: Mon Dec 11 15:44:19 2006 -0200
Commit:     Marcelo Tosatti <mtosatti at redhat.com>
CommitDate: Mon Dec 11 15:44:19 2006 -0200

    libertas: saner driver shutdown
    
    Fix a few things:
    
    - do not free/unlink URBs before calling wlan_remove_card
    - fix ordering of a few calls inside wlan_remove_card
    - avoid waiting on cmd_pending if SurpriseRemoved is true
    
    Signed-off-by: Marcelo Tosatti <mtosatti at redhat.com>
---
 drivers/net/wireless/libertas/wlan_main.c |   36 +++++++----------------------
 1 files changed, 9 insertions(+), 27 deletions(-)

diff --git a/drivers/net/wireless/libertas/wlan_main.c b/drivers/net/wireless/libertas/wlan_main.c
index 5d8ea9f..253ebe3 100644
--- a/drivers/net/wireless/libertas/wlan_main.c
+++ b/drivers/net/wireless/libertas/wlan_main.c
@@ -1105,6 +1105,13 @@ static int wlan_remove_card(void *card)
 	dev = priv->wlan_dev.netdev;
 	mesh_dev = priv->mesh_dev;
 
+	netif_stop_queue(priv->wlan_dev.netdev);
+	netif_carrier_off(priv->wlan_dev.netdev);
+
+	unregister_netdev(mesh_dev);
+	unregister_netdev(dev);
+
+	cancel_delayed_work(&priv->assoc_work);
 	destroy_workqueue(priv->assoc_thread);
 
 	if (Adapter->CurCmd) {
@@ -1123,49 +1130,24 @@ static int wlan_remove_card(void *card)
 	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
 	wireless_send_event(priv->wlan_dev.netdev, SIOCGIWAP, &wrqu, NULL);
 
-	/* Disable interrupts on the card as we cannot handle them after RESET */
-	libertas_sbi_disable_host_int(priv);
-
-	libertas_prepare_and_send_command(priv, HostCmd_CMD_802_11_RESET,
-			      HostCmd_ACT_HALT, 0, 0, NULL);
-
-	msleep_interruptible(200);
-
 #ifdef ENABLE_PM
 	pm_unregister(wlan_pm_dev);
 #endif
 
-	netif_stop_queue(priv->wlan_dev.netdev);
-	netif_carrier_off(priv->wlan_dev.netdev);
-
 	Adapter->SurpriseRemoved = 1;
 
 	/* Stop the thread servicing the interrupts */
-	wake_up_interruptible(&priv->MainThread.waitQ);
+	wlan_terminate_thread(&priv->MainThread);
 
 #ifdef REASSOCIATION
-	wake_up_interruptible(&priv->ReassocThread.waitQ);
+	wlan_terminate_thread(&priv->ReassocThread);
 #endif				/* REASSOCIATION */
 
 	libertas_debugfs_remove_one(priv);
 
-	dprintk(1, "unregister dev\n");
-	libertas_sbi_unregister_dev(priv);
-
 	dprintk(1, "Free Adapter\n");
 	libertas_free_adapter(priv);
 
-	/* Last reference is our one */
-	dprintk(1, "refcnt = %d\n", atomic_read(&dev->refcnt));
-
-	msleep(10);
-
-	dprintk(1, "netdev_finish_unregister: %s%s.\n", dev->name,
-	       (dev->features & NETIF_F_DYNALLOC) ? "" : ", old style");
-
-	unregister_netdev(mesh_dev);
-	unregister_netdev(dev);
-
 	dprintk(1, "Unregister finish\n");
 
 	priv->wlan_dev.netdev = NULL;


More information about the Commits-kernel mailing list