Commit 4a00117b authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] callout removal: isicom

callout removal: isicom
parent a00470d6
...@@ -76,7 +76,7 @@ MODULE_DEVICE_TABLE(pci, isicom_pci_tbl); ...@@ -76,7 +76,7 @@ MODULE_DEVICE_TABLE(pci, isicom_pci_tbl);
static int isicom_refcount; static int isicom_refcount;
static int prev_card = 3; /* start servicing isi_card[0] */ static int prev_card = 3; /* start servicing isi_card[0] */
static struct isi_board * irq_to_board[16]; static struct isi_board * irq_to_board[16];
static struct tty_driver isicom_normal, isicom_callout; static struct tty_driver isicom_normal;
static struct tty_struct * isicom_table[PORT_COUNT]; static struct tty_struct * isicom_table[PORT_COUNT];
static struct termios * isicom_termios[PORT_COUNT]; static struct termios * isicom_termios[PORT_COUNT];
static struct termios * isicom_termios_locked[PORT_COUNT]; static struct termios * isicom_termios_locked[PORT_COUNT];
...@@ -588,12 +588,9 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id, ...@@ -588,12 +588,9 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id,
printk(KERN_DEBUG "ISICOM: interrupt: DCD->low.\n"); printk(KERN_DEBUG "ISICOM: interrupt: DCD->low.\n");
#endif #endif
port->status &= ~ISI_DCD; port->status &= ~ISI_DCD;
if (!((port->flags & ASYNC_CALLOUT_ACTIVE) &&
(port->flags & ASYNC_CALLOUT_NOHUP))) {
schedule_task(&port->hangup_tq); schedule_task(&port->hangup_tq);
} }
} }
}
else { else {
if (header & ISI_DCD) { if (header & ISI_DCD) {
/* Carrier has been detected */ /* Carrier has been detected */
...@@ -903,49 +900,18 @@ static int block_til_ready(struct tty_struct * tty, struct file * filp, struct i ...@@ -903,49 +900,18 @@ static int block_til_ready(struct tty_struct * tty, struct file * filp, struct i
return -ERESTARTSYS; return -ERESTARTSYS;
} }
/* trying to open a callout device... check for constraints */
if (tty->driver->subtype == SERIAL_TYPE_CALLOUT) {
#ifdef ISICOM_DEBUG
printk(KERN_DEBUG "ISICOM: bl_ti_rdy: callout open.\n");
#endif
if (port->flags & ASYNC_NORMAL_ACTIVE)
return -EBUSY;
if ((port->flags & ASYNC_CALLOUT_ACTIVE) &&
(port->flags & ASYNC_SESSION_LOCKOUT) &&
(port->session != current->session))
return -EBUSY;
if ((port->flags & ASYNC_CALLOUT_ACTIVE) &&
(port->flags & ASYNC_PGRP_LOCKOUT) &&
(port->pgrp != current->pgrp))
return -EBUSY;
port->flags |= ASYNC_CALLOUT_ACTIVE;
cli();
raise_dtr_rts(port);
sti();
return 0;
}
/* if non-blocking mode is set ... */ /* if non-blocking mode is set ... */
if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) { if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) {
#ifdef ISICOM_DEBUG #ifdef ISICOM_DEBUG
printk(KERN_DEBUG "ISICOM: block_til_ready: non-block mode.\n"); printk(KERN_DEBUG "ISICOM: block_til_ready: non-block mode.\n");
#endif #endif
if (port->flags & ASYNC_CALLOUT_ACTIVE)
return -EBUSY;
port->flags |= ASYNC_NORMAL_ACTIVE; port->flags |= ASYNC_NORMAL_ACTIVE;
return 0; return 0;
} }
if (port->flags & ASYNC_CALLOUT_ACTIVE) {
if (port->normal_termios.c_cflag & CLOCAL)
do_clocal = 1;
} else {
if (C_CLOCAL(tty)) if (C_CLOCAL(tty))
do_clocal = 1; do_clocal = 1;
}
#ifdef ISICOM_DEBUG #ifdef ISICOM_DEBUG
if (do_clocal) if (do_clocal)
printk(KERN_DEBUG "ISICOM: block_til_ready: CLOCAL set.\n"); printk(KERN_DEBUG "ISICOM: block_til_ready: CLOCAL set.\n");
...@@ -965,9 +931,7 @@ static int block_til_ready(struct tty_struct * tty, struct file * filp, struct i ...@@ -965,9 +931,7 @@ static int block_til_ready(struct tty_struct * tty, struct file * filp, struct i
#endif #endif
while (1) { while (1) {
cli(); cli();
if (!(port->flags & ASYNC_CALLOUT_ACTIVE))
raise_dtr_rts(port); raise_dtr_rts(port);
sti(); sti();
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) { if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) {
...@@ -980,8 +944,7 @@ static int block_til_ready(struct tty_struct * tty, struct file * filp, struct i ...@@ -980,8 +944,7 @@ static int block_til_ready(struct tty_struct * tty, struct file * filp, struct i
#endif #endif
break; break;
} }
if (!(port->flags & ASYNC_CALLOUT_ACTIVE) && if (!(port->flags & ASYNC_CLOSING) &&
!(port->flags & ASYNC_CLOSING) &&
(do_clocal || (port->status & ISI_DCD))) { (do_clocal || (port->status & ISI_DCD))) {
#ifdef ISICOM_DEBUG #ifdef ISICOM_DEBUG
printk(KERN_DEBUG "ISICOM: block_til_ready: do_clocal || DCD.\n"); printk(KERN_DEBUG "ISICOM: block_til_ready: do_clocal || DCD.\n");
...@@ -1070,17 +1033,12 @@ static int isicom_open(struct tty_struct * tty, struct file * filp) ...@@ -1070,17 +1033,12 @@ static int isicom_open(struct tty_struct * tty, struct file * filp)
return error; return error;
if ((port->count == 1) && (port->flags & ASYNC_SPLIT_TERMIOS)) { if ((port->count == 1) && (port->flags & ASYNC_SPLIT_TERMIOS)) {
if (tty->driver->subtype == SERIAL_TYPE_NORMAL)
*tty->termios = port->normal_termios; *tty->termios = port->normal_termios;
else
*tty->termios = port->callout_termios;
save_flags(flags); cli(); save_flags(flags); cli();
isicom_config_port(port); isicom_config_port(port);
restore_flags(flags); restore_flags(flags);
} }
port->session = current->session;
port->pgrp = current->pgrp;
#ifdef ISICOM_DEBUG #ifdef ISICOM_DEBUG
printk(KERN_DEBUG "ISICOM: open end!!!.\n"); printk(KERN_DEBUG "ISICOM: open end!!!.\n");
#endif #endif
...@@ -1180,8 +1138,6 @@ static void isicom_close(struct tty_struct * tty, struct file * filp) ...@@ -1180,8 +1138,6 @@ static void isicom_close(struct tty_struct * tty, struct file * filp)
*/ */
if (port->flags & ASYNC_NORMAL_ACTIVE) if (port->flags & ASYNC_NORMAL_ACTIVE)
port->normal_termios = *tty->termios; port->normal_termios = *tty->termios;
if (port->flags & ASYNC_CALLOUT_ACTIVE)
port->callout_termios = *tty->termios;
tty->closing = 1; tty->closing = 1;
if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE) if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
...@@ -1209,8 +1165,7 @@ static void isicom_close(struct tty_struct * tty, struct file * filp) ...@@ -1209,8 +1165,7 @@ static void isicom_close(struct tty_struct * tty, struct file * filp)
} }
wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->open_wait);
} }
port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE | port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
ASYNC_CLOSING);
wake_up_interruptible(&port->close_wait); wake_up_interruptible(&port->close_wait);
restore_flags(flags); restore_flags(flags);
#ifdef ISICOM_DEBUG #ifdef ISICOM_DEBUG
...@@ -1651,7 +1606,7 @@ static void isicom_hangup(struct tty_struct * tty) ...@@ -1651,7 +1606,7 @@ static void isicom_hangup(struct tty_struct * tty)
isicom_shutdown_port(port); isicom_shutdown_port(port);
port->count = 0; port->count = 0;
port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE); port->flags &= ~ASYNC_NORMAL_ACTIVE;
port->tty = 0; port->tty = 0;
wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->open_wait);
} }
...@@ -1743,32 +1698,17 @@ static int register_drivers(void) ...@@ -1743,32 +1698,17 @@ static int register_drivers(void)
isicom_normal.hangup = isicom_hangup; isicom_normal.hangup = isicom_hangup;
isicom_normal.flush_buffer = isicom_flush_buffer; isicom_normal.flush_buffer = isicom_flush_buffer;
/* callout device */
isicom_callout = isicom_normal;
isicom_callout.name = "cum";
isicom_callout.major = ISICOM_CMAJOR;
isicom_callout.subtype = SERIAL_TYPE_CALLOUT;
if ((error=tty_register_driver(&isicom_normal))!=0) { if ((error=tty_register_driver(&isicom_normal))!=0) {
printk(KERN_DEBUG "ISICOM: Couldn't register the dialin driver, error=%d\n", printk(KERN_DEBUG "ISICOM: Couldn't register the dialin driver, error=%d\n",
error); error);
return error; return error;
} }
if ((error=tty_register_driver(&isicom_callout))!=0) {
tty_unregister_driver(&isicom_normal);
printk(KERN_DEBUG "ISICOM: Couldn't register the callout driver, error=%d\n",
error);
return error;
}
return 0; return 0;
} }
static void unregister_drivers(void) static void unregister_drivers(void)
{ {
int error; int error;
if ((error=tty_unregister_driver(&isicom_callout))!=0)
printk(KERN_DEBUG "ISICOM: couldn't unregister callout driver error=%d.\n",error);
if (tty_unregister_driver(&isicom_normal)) if (tty_unregister_driver(&isicom_normal))
printk(KERN_DEBUG "ISICOM: couldn't unregister normal driver error=%d.\n",error); printk(KERN_DEBUG "ISICOM: couldn't unregister normal driver error=%d.\n",error);
} }
...@@ -1897,7 +1837,6 @@ static int isicom_init(void) ...@@ -1897,7 +1837,6 @@ static int isicom_init(void)
port->card = &isi_card[card]; port->card = &isi_card[card];
port->channel = channel; port->channel = channel;
port->normal_termios = isicom_normal.init_termios; port->normal_termios = isicom_normal.init_termios;
port->callout_termios = isicom_callout.init_termios;
port->close_delay = 50 * HZ/100; port->close_delay = 50 * HZ/100;
port->closing_wait = 3000 * HZ/100; port->closing_wait = 3000 * HZ/100;
port->hangup_tq.routine = do_isicom_hangup; port->hangup_tq.routine = do_isicom_hangup;
......
...@@ -148,8 +148,6 @@ struct isi_port { ...@@ -148,8 +148,6 @@ struct isi_port {
unsigned short channel; unsigned short channel;
unsigned short status; unsigned short status;
unsigned short closing_wait; unsigned short closing_wait;
long session;
long pgrp;
struct isi_board * card; struct isi_board * card;
struct tty_struct * tty; struct tty_struct * tty;
wait_queue_head_t close_wait; wait_queue_head_t close_wait;
...@@ -161,7 +159,6 @@ struct isi_port { ...@@ -161,7 +159,6 @@ struct isi_port {
int xmit_tail; int xmit_tail;
int xmit_cnt; int xmit_cnt;
struct termios normal_termios; struct termios normal_termios;
struct termios callout_termios;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment