提交 dcbf1280 编写于 作者: A Alan Cox 提交者: Linus Torvalds

epca: Restore driver

Convert the driver to use the added hardware break support
Signed-off-by: NAlan Cox <alan@redhat.com>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 9e98966c
...@@ -167,7 +167,7 @@ config CYZ_INTR ...@@ -167,7 +167,7 @@ config CYZ_INTR
config DIGIEPCA config DIGIEPCA
tristate "Digiboard Intelligent Async Support" tristate "Digiboard Intelligent Async Support"
depends on SERIAL_NONSTANDARD && (ISA || EISA || PCI) && BROKEN depends on SERIAL_NONSTANDARD && (ISA || EISA || PCI)
---help--- ---help---
This is a driver for Digi International's Xx, Xeve, and Xem series This is a driver for Digi International's Xx, Xeve, and Xem series
of cards which provide multiple serial ports. You would need of cards which provide multiple serial ports. You would need
......
...@@ -184,7 +184,7 @@ static void pc_stop(struct tty_struct *); ...@@ -184,7 +184,7 @@ static void pc_stop(struct tty_struct *);
static void pc_start(struct tty_struct *); static void pc_start(struct tty_struct *);
static void pc_throttle(struct tty_struct *tty); static void pc_throttle(struct tty_struct *tty);
static void pc_unthrottle(struct tty_struct *tty); static void pc_unthrottle(struct tty_struct *tty);
static void digi_send_break(struct channel *ch, int msec); static int pc_send_break(struct tty_struct *tty, int msec);
static void setup_empty_event(struct tty_struct *tty, struct channel *ch); static void setup_empty_event(struct tty_struct *tty, struct channel *ch);
static void epca_setup(char *, int *); static void epca_setup(char *, int *);
...@@ -1040,6 +1040,7 @@ static const struct tty_operations pc_ops = { ...@@ -1040,6 +1040,7 @@ static const struct tty_operations pc_ops = {
.throttle = pc_throttle, .throttle = pc_throttle,
.unthrottle = pc_unthrottle, .unthrottle = pc_unthrottle,
.hangup = pc_hangup, .hangup = pc_hangup,
.break_ctl = pc_send_break
}; };
static int info_open(struct tty_struct *tty, struct file *filp) static int info_open(struct tty_struct *tty, struct file *filp)
...@@ -1132,7 +1133,7 @@ static int __init pc_init(void) ...@@ -1132,7 +1133,7 @@ static int __init pc_init(void)
pc_driver->init_termios.c_lflag = 0; pc_driver->init_termios.c_lflag = 0;
pc_driver->init_termios.c_ispeed = 9600; pc_driver->init_termios.c_ispeed = 9600;
pc_driver->init_termios.c_ospeed = 9600; pc_driver->init_termios.c_ospeed = 9600;
pc_driver->flags = TTY_DRIVER_REAL_RAW; pc_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_HARDWARE_BREAK;
tty_set_operations(pc_driver, &pc_ops); tty_set_operations(pc_driver, &pc_ops);
pc_info->owner = THIS_MODULE; pc_info->owner = THIS_MODULE;
...@@ -2177,7 +2178,6 @@ static int pc_ioctl(struct tty_struct *tty, struct file *file, ...@@ -2177,7 +2178,6 @@ static int pc_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
digiflow_t dflow; digiflow_t dflow;
int retval;
unsigned long flags; unsigned long flags;
unsigned int mflag, mstat; unsigned int mflag, mstat;
unsigned char startc, stopc; unsigned char startc, stopc;
...@@ -2190,31 +2190,6 @@ static int pc_ioctl(struct tty_struct *tty, struct file *file, ...@@ -2190,31 +2190,6 @@ static int pc_ioctl(struct tty_struct *tty, struct file *file,
else else
return -EINVAL; return -EINVAL;
switch (cmd) { switch (cmd) {
case TCSBRK: /* SVID version: non-zero arg --> no break */
retval = tty_check_change(tty);
if (retval)
return retval;
/* Setup an event to indicate when the transmit
buffer empties */
spin_lock_irqsave(&epca_lock, flags);
setup_empty_event(tty, ch);
spin_unlock_irqrestore(&epca_lock, flags);
tty_wait_until_sent(tty, 0);
if (!arg)
digi_send_break(ch, HZ / 4); /* 1/4 second */
return 0;
case TCSBRKP: /* support for POSIX tcsendbreak() */
retval = tty_check_change(tty);
if (retval)
return retval;
/* Setup an event to indicate when the transmit buffer
empties */
spin_lock_irqsave(&epca_lock, flags);
setup_empty_event(tty, ch);
spin_unlock_irqrestore(&epca_lock, flags);
tty_wait_until_sent(tty, 0);
digi_send_break(ch, arg ? arg*(HZ/10) : HZ/4);
return 0;
case TIOCMODG: case TIOCMODG:
mflag = pc_tiocmget(tty, file); mflag = pc_tiocmget(tty, file);
if (put_user(mflag, (unsigned long __user *)argp)) if (put_user(mflag, (unsigned long __user *)argp))
...@@ -2500,10 +2475,14 @@ static void pc_unthrottle(struct tty_struct *tty) ...@@ -2500,10 +2475,14 @@ static void pc_unthrottle(struct tty_struct *tty)
} }
} }
static void digi_send_break(struct channel *ch, int msec) static int pc_send_break(struct tty_struct *tty, int msec)
{ {
struct channel *ch = (struct channel *) tty->driver_data;
unsigned long flags; unsigned long flags;
if (msec == -1)
return -EOPNOTSUPP;
spin_lock_irqsave(&epca_lock, flags); spin_lock_irqsave(&epca_lock, flags);
globalwinon(ch); globalwinon(ch);
/* /*
...@@ -2516,6 +2495,7 @@ static void digi_send_break(struct channel *ch, int msec) ...@@ -2516,6 +2495,7 @@ static void digi_send_break(struct channel *ch, int msec)
fepcmd(ch, SENDBREAK, msec, 0, 10, 0); fepcmd(ch, SENDBREAK, msec, 0, 10, 0);
memoff(ch); memoff(ch);
spin_unlock_irqrestore(&epca_lock, flags); spin_unlock_irqrestore(&epca_lock, flags);
return 0;
} }
/* Caller MUST hold the lock */ /* Caller MUST hold the lock */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册