libertas: don't exit worker thread until kthread_stop() is called
[cascardo/linux.git] / drivers / net / wireless / libertas / main.c
index 9232b97..b51513f 100644 (file)
@@ -662,8 +662,10 @@ static int lbs_thread(void *data)
                set_current_state(TASK_INTERRUPTIBLE);
                spin_lock_irq(&priv->driver_lock);
 
-               if (priv->surpriseremoved)
+               if (kthread_should_stop())
                        shouldsleep = 0;        /* Bye */
+               else if (priv->surpriseremoved)
+                       shouldsleep = 1;        /* We need to wait until we're _told_ to die */
                else if (priv->psstate == PS_STATE_SLEEP)
                        shouldsleep = 1;        /* Sleep mode. Nothing we can do till it wakes */
                else if (priv->intcounter)
@@ -699,12 +701,15 @@ static int lbs_thread(void *data)
                lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
                               priv->intcounter, priv->currenttxskb, priv->dnld_sent);
 
-               if (kthread_should_stop() || priv->surpriseremoved) {
-                       lbs_deb_thread("main-thread: break from main thread: surpriseremoved=0x%x\n",
-                                      priv->surpriseremoved);
+               if (kthread_should_stop()) {
+                       lbs_deb_thread("main-thread: break from main thread\n");
                        break;
                }
 
+               if (priv->surpriseremoved) {
+                       lbs_deb_thread("adapter removed; waiting to die...\n");
+                       continue;
+               }
 
                spin_lock_irq(&priv->driver_lock);
 
@@ -1414,8 +1419,7 @@ void lbs_interrupt(struct lbs_private *priv)
 
        lbs_deb_thread("lbs_interrupt: intcounter=%d\n", priv->intcounter);
 
-       if (spin_trylock(&priv->driver_lock)) {
-               spin_unlock(&priv->driver_lock);
+       if (!spin_is_locked(&priv->driver_lock)) {
                printk(KERN_CRIT "%s called without driver_lock held\n", __func__);
                WARN_ON(1);
        }