Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / drivers / net / irda / stir4200.c
index 31867e4..d61b208 100644 (file)
@@ -50,6 +50,7 @@
 #include <linux/delay.h>
 #include <linux/usb.h>
 #include <linux/crc32.h>
+#include <linux/kthread.h>
 #include <net/irda/irda.h>
 #include <net/irda/irlap.h>
 #include <net/irda/irda_device.h>
@@ -173,9 +174,7 @@ struct stir_cb {
         struct qos_info   qos;
        unsigned          speed;        /* Current speed */
 
-       wait_queue_head_t thr_wait;     /* transmit thread wakeup */
-       struct completion thr_exited;
-       pid_t             thr_pid;
+        struct task_struct *thread;     /* transmit thread */
 
        struct sk_buff    *tx_pending;
        void              *io_buf;      /* transmit/receive buffer */
@@ -577,7 +576,7 @@ static int stir_hard_xmit(struct sk_buff *skb, struct net_device *netdev)
        SKB_LINEAR_ASSERT(skb);
 
        skb = xchg(&stir->tx_pending, skb);
-       wake_up(&stir->thr_wait);
+        wake_up_process(stir->thread);
        
        /* this should never happen unless stop/wakeup problem */
        if (unlikely(skb)) {
@@ -753,13 +752,7 @@ static int stir_transmit_thread(void *arg)
        struct net_device *dev = stir->netdev;
        struct sk_buff *skb;
 
-       daemonize("%s", dev->name);
-       allow_signal(SIGTERM);
-
-       while (netif_running(dev)
-              && netif_device_present(dev)
-              && !signal_pending(current))
-       {
+        while (!kthread_should_stop()) {
 #ifdef CONFIG_PM
                /* if suspending, then power off and wait */
                if (unlikely(freezing(current))) {
@@ -813,10 +806,11 @@ static int stir_transmit_thread(void *arg)
                }
 
                /* sleep if nothing to send */
-               wait_event_interruptible(stir->thr_wait, stir->tx_pending);
-       }
+                set_current_state(TASK_INTERRUPTIBLE);
+                schedule();
 
-       complete_and_exit (&stir->thr_exited, 0);
+       }
+        return 0;
 }
 
 
@@ -859,7 +853,7 @@ static void stir_rcv_irq(struct urb *urb, struct pt_regs *regs)
                warn("%s: usb receive submit error: %d",
                        stir->netdev->name, err);
                stir->receiving = 0;
-               wake_up(&stir->thr_wait);
+               wake_up_process(stir->thread);
        }
 }
 
@@ -928,10 +922,10 @@ static int stir_net_open(struct net_device *netdev)
        }
 
        /** Start kernel thread for transmit.  */
-       stir->thr_pid = kernel_thread(stir_transmit_thread, stir,
-                                     CLONE_FS|CLONE_FILES);
-       if (stir->thr_pid < 0) {
-               err = stir->thr_pid;
+       stir->thread = kthread_run(stir_transmit_thread, stir,
+                                  "%s", stir->netdev->name);
+        if (IS_ERR(stir->thread)) {
+                err = PTR_ERR(stir->thread);
                err("stir4200: unable to start kernel thread");
                goto err_out6;
        }
@@ -968,8 +962,7 @@ static int stir_net_close(struct net_device *netdev)
        netif_stop_queue(netdev);
 
        /* Kill transmit thread */
-       kill_proc(stir->thr_pid, SIGTERM, 1);
-       wait_for_completion(&stir->thr_exited);
+       kthread_stop(stir->thread);
        kfree(stir->fifo_status);
 
        /* Mop up receive urb's */
@@ -1084,9 +1077,6 @@ static int stir_probe(struct usb_interface *intf,
        stir->qos.min_turn_time.bits   &= qos_mtt_bits;
        irda_qos_bits_to_value(&stir->qos);
 
-       init_completion (&stir->thr_exited);
-       init_waitqueue_head (&stir->thr_wait);
-
        /* Override the network functions we need to use */
        net->hard_start_xmit = stir_hard_xmit;
        net->open            = stir_net_open;