Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 27509
b: refs/heads/master
c: bc1d693
h: refs/heads/master
i:
  27507: 9b8a905
v: v3
  • Loading branch information
Christoph Hellwig authored and David S. Miller committed Jun 18, 2006
1 parent da82f7c commit e5999e1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c6ae522e3a50fc1ec483d7f03ece9c7a25e6de95
refs/heads/master: bc1d6937e6cf4e81a5afeae2c9cf35ffb0905ba5
38 changes: 14 additions & 24 deletions trunk/drivers/net/irda/stir4200.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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))) {
Expand Down Expand Up @@ -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;
}


Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit e5999e1

Please sign in to comment.