mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
Merge branch 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6
* 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: tty/serial: fix apbuart build n_hdlc: fix read and write locking serial: unbreak billionton CF card tty: use for_each_console() and WARN() on sysfs failures vt: fix issue when fbcon wants to takeover a second time. Fix up trivial conflict in drivers/tty/tty_io.c
This commit is contained in:
commit
abfa44b5fd
@ -581,8 +581,9 @@ static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file,
|
||||
__u8 __user *buf, size_t nr)
|
||||
{
|
||||
struct n_hdlc *n_hdlc = tty2n_hdlc(tty);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
struct n_hdlc_buf *rbuf;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
|
||||
if (debuglevel >= DEBUG_LEVEL_INFO)
|
||||
printk("%s(%d)n_hdlc_tty_read() called\n",__FILE__,__LINE__);
|
||||
@ -598,57 +599,55 @@ static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
tty_lock();
|
||||
add_wait_queue(&tty->read_wait, &wait);
|
||||
|
||||
for (;;) {
|
||||
if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
|
||||
tty_unlock();
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
if (tty_hung_up_p(file))
|
||||
break;
|
||||
|
||||
n_hdlc = tty2n_hdlc (tty);
|
||||
if (!n_hdlc || n_hdlc->magic != HDLC_MAGIC ||
|
||||
tty != n_hdlc->tty) {
|
||||
tty_unlock();
|
||||
return 0;
|
||||
}
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
rbuf = n_hdlc_buf_get(&n_hdlc->rx_buf_list);
|
||||
if (rbuf)
|
||||
if (rbuf) {
|
||||
if (rbuf->count > nr) {
|
||||
/* too large for caller's buffer */
|
||||
ret = -EOVERFLOW;
|
||||
} else {
|
||||
if (copy_to_user(buf, rbuf->buf, rbuf->count))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
ret = rbuf->count;
|
||||
}
|
||||
|
||||
if (n_hdlc->rx_free_buf_list.count >
|
||||
DEFAULT_RX_BUF_COUNT)
|
||||
kfree(rbuf);
|
||||
else
|
||||
n_hdlc_buf_put(&n_hdlc->rx_free_buf_list, rbuf);
|
||||
break;
|
||||
}
|
||||
|
||||
/* no data */
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
tty_unlock();
|
||||
return -EAGAIN;
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
interruptible_sleep_on (&tty->read_wait);
|
||||
|
||||
schedule();
|
||||
|
||||
if (signal_pending(current)) {
|
||||
tty_unlock();
|
||||
return -EINTR;
|
||||
ret = -EINTR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (rbuf->count > nr)
|
||||
/* frame too large for caller's buffer (discard frame) */
|
||||
ret = -EOVERFLOW;
|
||||
else {
|
||||
/* Copy the data to the caller's buffer */
|
||||
if (copy_to_user(buf, rbuf->buf, rbuf->count))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
ret = rbuf->count;
|
||||
}
|
||||
|
||||
/* return HDLC buffer to free list unless the free list */
|
||||
/* count has exceeded the default value, in which case the */
|
||||
/* buffer is freed back to the OS to conserve memory */
|
||||
if (n_hdlc->rx_free_buf_list.count > DEFAULT_RX_BUF_COUNT)
|
||||
kfree(rbuf);
|
||||
else
|
||||
n_hdlc_buf_put(&n_hdlc->rx_free_buf_list,rbuf);
|
||||
tty_unlock();
|
||||
|
||||
remove_wait_queue(&tty->read_wait, &wait);
|
||||
__set_current_state(TASK_RUNNING);
|
||||
|
||||
return ret;
|
||||
|
||||
} /* end of n_hdlc_tty_read() */
|
||||
@ -691,14 +690,15 @@ static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
|
||||
count = maxframe;
|
||||
}
|
||||
|
||||
tty_lock();
|
||||
|
||||
add_wait_queue(&tty->write_wait, &wait);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
for (;;) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
/* Allocate transmit buffer */
|
||||
/* sleep until transmit buffer available */
|
||||
while (!(tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list))) {
|
||||
tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list);
|
||||
if (tbuf)
|
||||
break;
|
||||
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
error = -EAGAIN;
|
||||
break;
|
||||
@ -719,7 +719,7 @@ static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
|
||||
}
|
||||
}
|
||||
|
||||
set_current_state(TASK_RUNNING);
|
||||
__set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(&tty->write_wait, &wait);
|
||||
|
||||
if (!error) {
|
||||
@ -731,7 +731,7 @@ static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
|
||||
n_hdlc_buf_put(&n_hdlc->tx_buf_list,tbuf);
|
||||
n_hdlc_send_frames(n_hdlc,tty);
|
||||
}
|
||||
tty_unlock();
|
||||
|
||||
return error;
|
||||
|
||||
} /* end of n_hdlc_tty_write() */
|
||||
|
@ -236,7 +236,8 @@ static const struct serial8250_config uart_config[] = {
|
||||
.fifo_size = 128,
|
||||
.tx_loadsz = 128,
|
||||
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
|
||||
.flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
|
||||
/* UART_CAP_EFR breaks billionon CF bluetooth card. */
|
||||
.flags = UART_CAP_FIFO | UART_CAP_SLEEP,
|
||||
},
|
||||
[PORT_16654] = {
|
||||
.name = "ST16654",
|
||||
|
@ -1518,6 +1518,7 @@ config SERIAL_BCM63XX_CONSOLE
|
||||
config SERIAL_GRLIB_GAISLER_APBUART
|
||||
tristate "GRLIB APBUART serial support"
|
||||
depends on OF
|
||||
select SERIAL_CORE
|
||||
---help---
|
||||
Add support for the GRLIB APBUART serial port.
|
||||
|
||||
|
@ -3257,7 +3257,7 @@ static ssize_t show_cons_active(struct device *dev,
|
||||
ssize_t count = 0;
|
||||
|
||||
console_lock();
|
||||
for (c = console_drivers; c; c = c->next) {
|
||||
for_each_console(c) {
|
||||
if (!c->device)
|
||||
continue;
|
||||
if (!c->write)
|
||||
@ -3306,7 +3306,7 @@ int __init tty_init(void)
|
||||
if (IS_ERR(consdev))
|
||||
consdev = NULL;
|
||||
else
|
||||
device_create_file(consdev, &dev_attr_active);
|
||||
WARN_ON(device_create_file(consdev, &dev_attr_active) < 0);
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
vty_init(&console_fops);
|
||||
|
@ -2994,7 +2994,7 @@ int __init vty_init(const struct file_operations *console_fops)
|
||||
if (IS_ERR(tty0dev))
|
||||
tty0dev = NULL;
|
||||
else
|
||||
device_create_file(tty0dev, &dev_attr_active);
|
||||
WARN_ON(device_create_file(tty0dev, &dev_attr_active) < 0);
|
||||
|
||||
vcs_init();
|
||||
|
||||
@ -3545,7 +3545,7 @@ int register_con_driver(const struct consw *csw, int first, int last)
|
||||
|
||||
/* already registered */
|
||||
if (con_driver->con == csw)
|
||||
retval = -EINVAL;
|
||||
retval = -EBUSY;
|
||||
}
|
||||
|
||||
if (retval)
|
||||
@ -3656,7 +3656,12 @@ int take_over_console(const struct consw *csw, int first, int last, int deflt)
|
||||
int err;
|
||||
|
||||
err = register_con_driver(csw, first, last);
|
||||
|
||||
/* if we get an busy error we still want to bind the console driver
|
||||
* and return success, as we may have unbound the console driver
|
||||
* but not unregistered it.
|
||||
*/
|
||||
if (err == -EBUSY)
|
||||
err = 0;
|
||||
if (!err)
|
||||
bind_con_driver(csw, first, last, deflt);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user