Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: (58 commits) tty: split the lock up a bit further tty: Move the leader test in disassociate tty: Push the bkl down a bit in the hangup code tty: Push the lock down further into the ldisc code tty: push the BKL down into the handlers a bit tty: moxa: split open lock tty: moxa: Kill the use of lock_kernel tty: moxa: Fix modem op locking tty: moxa: Kill off the throttle method tty: moxa: Locking clean up tty: moxa: rework the locking a bit tty: moxa: Use more tty_port ops tty: isicom: fix deadlock on shutdown tty: mxser: Use the new locking rules to fix setserial properly tty: mxser: use the tty_port_open method tty: isicom: sort out the board init logic tty: isicom: switch to the new tty_port_open helper tty: tty_port: Add a kref object to the tty port tty: istallion: tty port open/close methods tty: stallion: Convert to the tty_port_open/close methods ...
This commit is contained in:
@@ -1339,14 +1339,12 @@ static void serial8250_start_tx(struct uart_port *port)
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
|
||||
if (up->bugs & UART_BUG_TXEN) {
|
||||
unsigned char lsr, iir;
|
||||
unsigned char lsr;
|
||||
lsr = serial_in(up, UART_LSR);
|
||||
up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
|
||||
iir = serial_in(up, UART_IIR) & 0x0f;
|
||||
if ((up->port.type == PORT_RM9000) ?
|
||||
(lsr & UART_LSR_THRE &&
|
||||
(iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) :
|
||||
(lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT))
|
||||
(lsr & UART_LSR_THRE) :
|
||||
(lsr & UART_LSR_TEMT))
|
||||
transmit_chars(up);
|
||||
}
|
||||
}
|
||||
@@ -2646,7 +2644,7 @@ static void __init serial8250_isa_init_ports(void)
|
||||
{
|
||||
struct uart_8250_port *up;
|
||||
static int first = 1;
|
||||
int i;
|
||||
int i, irqflag = 0;
|
||||
|
||||
if (!first)
|
||||
return;
|
||||
@@ -2670,6 +2668,9 @@ static void __init serial8250_isa_init_ports(void)
|
||||
up->port.ops = &serial8250_pops;
|
||||
}
|
||||
|
||||
if (share_irqs)
|
||||
irqflag = IRQF_SHARED;
|
||||
|
||||
for (i = 0, up = serial8250_ports;
|
||||
i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
|
||||
i++, up++) {
|
||||
@@ -2683,8 +2684,7 @@ static void __init serial8250_isa_init_ports(void)
|
||||
up->port.iotype = old_serial_port[i].io_type;
|
||||
up->port.regshift = old_serial_port[i].iomem_reg_shift;
|
||||
set_io_from_upio(&up->port);
|
||||
if (share_irqs)
|
||||
up->port.irqflags |= IRQF_SHARED;
|
||||
up->port.irqflags |= irqflag;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2940,10 +2940,13 @@ static int __devinit serial8250_probe(struct platform_device *dev)
|
||||
{
|
||||
struct plat_serial8250_port *p = dev->dev.platform_data;
|
||||
struct uart_port port;
|
||||
int ret, i;
|
||||
int ret, i, irqflag = 0;
|
||||
|
||||
memset(&port, 0, sizeof(struct uart_port));
|
||||
|
||||
if (share_irqs)
|
||||
irqflag = IRQF_SHARED;
|
||||
|
||||
for (i = 0; p && p->flags != 0; p++, i++) {
|
||||
port.iobase = p->iobase;
|
||||
port.membase = p->membase;
|
||||
@@ -2960,8 +2963,7 @@ static int __devinit serial8250_probe(struct platform_device *dev)
|
||||
port.serial_in = p->serial_in;
|
||||
port.serial_out = p->serial_out;
|
||||
port.dev = &dev->dev;
|
||||
if (share_irqs)
|
||||
port.irqflags |= IRQF_SHARED;
|
||||
port.irqflags |= irqflag;
|
||||
ret = serial8250_register_port(&port);
|
||||
if (ret < 0) {
|
||||
dev_err(&dev->dev, "unable to register port at index %d "
|
||||
|
@@ -138,7 +138,6 @@ struct jsm_board
|
||||
u32 nasync; /* Number of ports on card */
|
||||
|
||||
u32 irq; /* Interrupt request number */
|
||||
u64 intr_count; /* Count of interrupts */
|
||||
|
||||
u64 membase; /* Start of base memory of the card */
|
||||
u64 membase_end; /* End of base memory of the card */
|
||||
@@ -206,8 +205,6 @@ struct jsm_channel {
|
||||
|
||||
u64 ch_close_delay; /* How long we should drop RTS/DTR for */
|
||||
|
||||
u64 ch_cpstime; /* Time for CPS calculations */
|
||||
|
||||
tcflag_t ch_c_iflag; /* channel iflags */
|
||||
tcflag_t ch_c_cflag; /* channel cflags */
|
||||
tcflag_t ch_c_oflag; /* channel oflags */
|
||||
@@ -215,11 +212,6 @@ struct jsm_channel {
|
||||
u8 ch_stopc; /* Stop character */
|
||||
u8 ch_startc; /* Start character */
|
||||
|
||||
u32 ch_old_baud; /* Cache of the current baud */
|
||||
u32 ch_custom_speed;/* Custom baud, if set */
|
||||
|
||||
u32 ch_wopen; /* Waiting for open process cnt */
|
||||
|
||||
u8 ch_mostat; /* FEP output modem status */
|
||||
u8 ch_mistat; /* FEP input modem status */
|
||||
|
||||
|
@@ -48,6 +48,17 @@ struct uart_driver jsm_uart_driver = {
|
||||
.nr = NR_PORTS,
|
||||
};
|
||||
|
||||
static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
|
||||
pci_channel_state_t state);
|
||||
static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev);
|
||||
static void jsm_io_resume(struct pci_dev *pdev);
|
||||
|
||||
static struct pci_error_handlers jsm_err_handler = {
|
||||
.error_detected = jsm_io_error_detected,
|
||||
.slot_reset = jsm_io_slot_reset,
|
||||
.resume = jsm_io_resume,
|
||||
};
|
||||
|
||||
int jsm_debug;
|
||||
module_param(jsm_debug, int, 0);
|
||||
MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
|
||||
@@ -123,7 +134,7 @@ static int __devinit jsm_probe_one(struct pci_dev *pdev, const struct pci_device
|
||||
}
|
||||
|
||||
rc = request_irq(brd->irq, brd->bd_ops->intr,
|
||||
IRQF_DISABLED|IRQF_SHARED, "JSM", brd);
|
||||
IRQF_SHARED, "JSM", brd);
|
||||
if (rc) {
|
||||
printk(KERN_WARNING "Failed to hook IRQ %d\n",brd->irq);
|
||||
goto out_iounmap;
|
||||
@@ -164,6 +175,7 @@ static int __devinit jsm_probe_one(struct pci_dev *pdev, const struct pci_device
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, brd);
|
||||
pci_save_state(pdev);
|
||||
|
||||
return 0;
|
||||
out_free_irq:
|
||||
@@ -222,8 +234,42 @@ static struct pci_driver jsm_driver = {
|
||||
.id_table = jsm_pci_tbl,
|
||||
.probe = jsm_probe_one,
|
||||
.remove = __devexit_p(jsm_remove_one),
|
||||
.err_handler = &jsm_err_handler,
|
||||
};
|
||||
|
||||
static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
|
||||
pci_channel_state_t state)
|
||||
{
|
||||
struct jsm_board *brd = pci_get_drvdata(pdev);
|
||||
|
||||
jsm_remove_uart_port(brd);
|
||||
|
||||
return PCI_ERS_RESULT_NEED_RESET;
|
||||
}
|
||||
|
||||
static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = pci_enable_device(pdev);
|
||||
|
||||
if (rc)
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
return PCI_ERS_RESULT_RECOVERED;
|
||||
}
|
||||
|
||||
static void jsm_io_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct jsm_board *brd = pci_get_drvdata(pdev);
|
||||
|
||||
pci_restore_state(pdev);
|
||||
|
||||
jsm_uart_port_init(brd);
|
||||
}
|
||||
|
||||
static int __init jsm_init_module(void)
|
||||
{
|
||||
int rc;
|
||||
|
@@ -954,13 +954,8 @@ static void neo_param(struct jsm_channel *ch)
|
||||
ch->ch_flags |= (CH_BAUD0);
|
||||
ch->ch_mostat &= ~(UART_MCR_RTS | UART_MCR_DTR);
|
||||
neo_assert_modem_signals(ch);
|
||||
ch->ch_old_baud = 0;
|
||||
return;
|
||||
|
||||
} else if (ch->ch_custom_speed) {
|
||||
baud = ch->ch_custom_speed;
|
||||
if (ch->ch_flags & CH_BAUD0)
|
||||
ch->ch_flags &= ~(CH_BAUD0);
|
||||
} else {
|
||||
int i;
|
||||
unsigned int cflag;
|
||||
@@ -1045,7 +1040,6 @@ static void neo_param(struct jsm_channel *ch)
|
||||
quot = ch->ch_bd->bd_dividend / baud;
|
||||
|
||||
if (quot != 0) {
|
||||
ch->ch_old_baud = baud;
|
||||
writeb(UART_LCR_DLAB, &ch->ch_neo_uart->lcr);
|
||||
writeb((quot & 0xff), &ch->ch_neo_uart->txrx);
|
||||
writeb((quot >> 8), &ch->ch_neo_uart->ier);
|
||||
@@ -1123,8 +1117,6 @@ static irqreturn_t neo_intr(int irq, void *voidbrd)
|
||||
unsigned long lock_flags2;
|
||||
int outofloop_count = 0;
|
||||
|
||||
brd->intr_count++;
|
||||
|
||||
/* Lock out the slow poller from running on this board. */
|
||||
spin_lock_irqsave(&brd->bd_intr_lock, lock_flags);
|
||||
|
||||
|
@@ -296,8 +296,6 @@ static void jsm_tty_close(struct uart_port *port)
|
||||
bd->bd_ops->assert_modem_signals(channel);
|
||||
}
|
||||
|
||||
channel->ch_old_baud = 0;
|
||||
|
||||
/* Turn off UART interrupts for this port */
|
||||
channel->ch_bd->bd_ops->uart_off(channel);
|
||||
|
||||
@@ -432,7 +430,7 @@ int __devinit jsm_tty_init(struct jsm_board *brd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __devinit jsm_uart_port_init(struct jsm_board *brd)
|
||||
int jsm_uart_port_init(struct jsm_board *brd)
|
||||
{
|
||||
int i;
|
||||
unsigned int line;
|
||||
@@ -472,7 +470,7 @@ int __devinit jsm_uart_port_init(struct jsm_board *brd)
|
||||
if (uart_add_one_port (&jsm_uart_driver, &brd->channels[i]->uart_port))
|
||||
printk(KERN_INFO "jsm: add device failed\n");
|
||||
else
|
||||
printk(KERN_INFO "Added device \n");
|
||||
printk(KERN_INFO "jsm: Port %d added\n", i);
|
||||
}
|
||||
|
||||
jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
|
||||
|
@@ -438,6 +438,7 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned char cval, fcr = 0;
|
||||
unsigned long flags;
|
||||
unsigned int baud, quot;
|
||||
unsigned int dll;
|
||||
|
||||
switch (termios->c_cflag & CSIZE) {
|
||||
case CS5:
|
||||
@@ -534,10 +535,18 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
else
|
||||
up->mcr &= ~UART_MCR_AFE;
|
||||
|
||||
serial_out(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
|
||||
serial_out(up, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */
|
||||
serial_out(up, UART_DLL, quot & 0xff); /* LS of divisor */
|
||||
|
||||
/*
|
||||
* work around Errata #75 according to Intel(R) PXA27x Processor Family
|
||||
* Specification Update (Nov 2005)
|
||||
*/
|
||||
dll = serial_in(up, UART_DLL);
|
||||
WARN_ON(dll != (quot & 0xff));
|
||||
|
||||
serial_out(up, UART_DLM, quot >> 8); /* MS of divisor */
|
||||
serial_out(up, UART_LCR, cval); /* reset DLAB */
|
||||
serial_out(up, UART_LCR, cval); /* reset DLAB */
|
||||
up->lcr = cval; /* Save LCR */
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
serial_out(up, UART_FCR, fcr);
|
||||
|
@@ -342,11 +342,11 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
if (flags == UPF_SPD_HI)
|
||||
altbaud = 57600;
|
||||
if (flags == UPF_SPD_VHI)
|
||||
else if (flags == UPF_SPD_VHI)
|
||||
altbaud = 115200;
|
||||
if (flags == UPF_SPD_SHI)
|
||||
else if (flags == UPF_SPD_SHI)
|
||||
altbaud = 230400;
|
||||
if (flags == UPF_SPD_WARP)
|
||||
else if (flags == UPF_SPD_WARP)
|
||||
altbaud = 460800;
|
||||
|
||||
for (try = 0; try < 2; try++) {
|
||||
@@ -1217,9 +1217,8 @@ static void uart_set_termios(struct tty_struct *tty,
|
||||
/* Handle transition to B0 status */
|
||||
if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
|
||||
uart_clear_mctrl(state->uart_port, TIOCM_RTS | TIOCM_DTR);
|
||||
|
||||
/* Handle transition away from B0 status */
|
||||
if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
|
||||
else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
|
||||
unsigned int mask = TIOCM_DTR;
|
||||
if (!(cflag & CRTSCTS) ||
|
||||
!test_bit(TTY_THROTTLED, &tty->flags))
|
||||
@@ -1234,9 +1233,8 @@ static void uart_set_termios(struct tty_struct *tty,
|
||||
__uart_start(tty);
|
||||
spin_unlock_irqrestore(&state->uart_port->lock, flags);
|
||||
}
|
||||
|
||||
/* Handle turning on CRTSCTS */
|
||||
if (!(old_termios->c_cflag & CRTSCTS) && (cflag & CRTSCTS)) {
|
||||
else if (!(old_termios->c_cflag & CRTSCTS) && (cflag & CRTSCTS)) {
|
||||
spin_lock_irqsave(&state->uart_port->lock, flags);
|
||||
if (!(state->uart_port->ops->get_mctrl(state->uart_port) & TIOCM_CTS)) {
|
||||
tty->hw_stopped = 1;
|
||||
@@ -2344,7 +2342,7 @@ static const struct tty_operations uart_ops = {
|
||||
*/
|
||||
int uart_register_driver(struct uart_driver *drv)
|
||||
{
|
||||
struct tty_driver *normal = NULL;
|
||||
struct tty_driver *normal;
|
||||
int i, retval;
|
||||
|
||||
BUG_ON(drv->state);
|
||||
@@ -2354,13 +2352,12 @@ int uart_register_driver(struct uart_driver *drv)
|
||||
* we have a large number of ports to handle.
|
||||
*/
|
||||
drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
|
||||
retval = -ENOMEM;
|
||||
if (!drv->state)
|
||||
goto out;
|
||||
|
||||
normal = alloc_tty_driver(drv->nr);
|
||||
normal = alloc_tty_driver(drv->nr);
|
||||
if (!normal)
|
||||
goto out;
|
||||
goto out_kfree;
|
||||
|
||||
drv->tty_driver = normal;
|
||||
|
||||
@@ -2393,12 +2390,14 @@ int uart_register_driver(struct uart_driver *drv)
|
||||
}
|
||||
|
||||
retval = tty_register_driver(normal);
|
||||
out:
|
||||
if (retval < 0) {
|
||||
put_tty_driver(normal);
|
||||
kfree(drv->state);
|
||||
}
|
||||
return retval;
|
||||
if (retval >= 0)
|
||||
return retval;
|
||||
|
||||
put_tty_driver(normal);
|
||||
out_kfree:
|
||||
kfree(drv->state);
|
||||
out:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user