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