[PATCH] Char: isicom, remove tty_{hang,wake}up bottomhalves

- tty_hangup() itself schedules work, so there is no need to schedule hangup
  in the driver

- tty_wakeup(): it's safe to call it while in atomic, so that its
  schedule_work might be also wiped out

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Acked-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jiri Slaby 2007-02-10 01:44:47 -08:00 committed by Linus Torvalds
parent 52c9ae0ac7
commit 0aa5de8590

View File

@ -213,8 +213,6 @@ struct isi_port {
struct tty_struct * tty; struct tty_struct * tty;
wait_queue_head_t close_wait; wait_queue_head_t close_wait;
wait_queue_head_t open_wait; wait_queue_head_t open_wait;
struct work_struct hangup_tq;
struct work_struct bh_tqueue;
unsigned char * xmit_buf; unsigned char * xmit_buf;
int xmit_head; int xmit_head;
int xmit_tail; int xmit_tail;
@ -510,7 +508,7 @@ static void isicom_tx(unsigned long _data)
if (port->xmit_cnt <= 0) if (port->xmit_cnt <= 0)
port->status &= ~ISI_TXOK; port->status &= ~ISI_TXOK;
if (port->xmit_cnt <= WAKEUP_CHARS) if (port->xmit_cnt <= WAKEUP_CHARS)
schedule_work(&port->bh_tqueue); tty_wakeup(tty);
unlock_card(&isi_card[card]); unlock_card(&isi_card[card]);
} }
@ -524,21 +522,6 @@ sched_again:
mod_timer(&tx, jiffies + msecs_to_jiffies(10)); mod_timer(&tx, jiffies + msecs_to_jiffies(10));
} }
/* Interrupt handlers */
static void isicom_bottomhalf(struct work_struct *work)
{
struct isi_port *port = container_of(work, struct isi_port, bh_tqueue);
struct tty_struct *tty = port->tty;
if (!tty)
return;
tty_wakeup(tty);
wake_up_interruptible(&tty->write_wait);
}
/* /*
* Main interrupt handler routine * Main interrupt handler routine
*/ */
@ -609,7 +592,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
pr_dbg("interrupt: DCD->low.\n" pr_dbg("interrupt: DCD->low.\n"
); );
port->status &= ~ISI_DCD; port->status &= ~ISI_DCD;
schedule_work(&port->hangup_tq); tty_hangup(tty);
} }
} else if (header & ISI_DCD) { } else if (header & ISI_DCD) {
/* Carrier has been detected */ /* Carrier has been detected */
@ -631,7 +614,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
/* start tx ing */ /* start tx ing */
port->status |= (ISI_TXOK port->status |= (ISI_TXOK
| ISI_CTS); | ISI_CTS);
schedule_work(&port->bh_tqueue); tty_wakeup(tty);
} }
} else if (!(header & ISI_CTS)) { } else if (!(header & ISI_CTS)) {
port->tty->hw_stopped = 1; port->tty->hw_stopped = 1;
@ -1460,17 +1443,6 @@ static void isicom_start(struct tty_struct *tty)
port->status |= ISI_TXOK; port->status |= ISI_TXOK;
} }
/* hangup et all */
static void do_isicom_hangup(struct work_struct *work)
{
struct isi_port *port = container_of(work, struct isi_port, hangup_tq);
struct tty_struct *tty;
tty = port->tty;
if (tty)
tty_hangup(tty);
}
static void isicom_hangup(struct tty_struct *tty) static void isicom_hangup(struct tty_struct *tty)
{ {
struct isi_port *port = tty->driver_data; struct isi_port *port = tty->driver_data;
@ -1858,8 +1830,6 @@ static int __init isicom_init(void)
port->channel = channel; port->channel = channel;
port->close_delay = 50 * HZ/100; port->close_delay = 50 * HZ/100;
port->closing_wait = 3000 * HZ/100; port->closing_wait = 3000 * HZ/100;
INIT_WORK(&port->hangup_tq, do_isicom_hangup);
INIT_WORK(&port->bh_tqueue, isicom_bottomhalf);
port->status = 0; port->status = 0;
init_waitqueue_head(&port->open_wait); init_waitqueue_head(&port->open_wait);
init_waitqueue_head(&port->close_wait); init_waitqueue_head(&port->close_wait);