>From c64c59ea22b61a2c3f64dd269812b7ae5d3331ec Mon Sep 17 00:00:00 2001
From: Stefan Bader <stefan.bader@canonical.com>
Date: Fri, 26 Jun 2009 09:01:33 +0200
Subject: [PATCH] iwl3945: Move cancel_delayed_work_sync to avoid lockup

BugLink: http://bugs.launchpad.net/ubuntu/+bug/345710

The issue of calling the rfkill workqueue on module remove had been tried to
solve by commit 71d449b55abf5018d7c711b2b62abc0c083723c4.
However the change from cancel_delayed_work to the sync version does not seem
to be enough to prevent the lockup. Moving the cancelation down to a later
time according to Huaxu Wan's version 2 patch.

Signed-off-by: Huaxu Wan <huaxu.wan@linux.intel.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
Tested-by: Mcarni <mcarni@yahoo.it>
---
 drivers/net/wireless/iwlwifi/iwl3945-base.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index cb9bd4c..e977af4 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -4245,8 +4245,6 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
 
 	sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
 
-	cancel_delayed_work_sync(&priv->rfkill_poll);
-
 	iwl3945_dealloc_ucode_pci(priv);
 
 	if (priv->rxq.bd)
@@ -4258,6 +4256,7 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
 
 	/*netif_stop_queue(dev); */
 	flush_workqueue(priv->workqueue);
+	cancel_delayed_work_sync(&priv->rfkill_poll);
 
 	/* ieee80211_unregister_hw calls iwl3945_mac_stop, which flushes
 	 * priv->workqueue... so we can't take down the workqueue
-- 
1.5.4.3

