diff options
104 files changed, 1998 insertions, 3020 deletions
diff --git a/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt b/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt new file mode 100644 index 000000000000..0d439dfc1aa5 --- /dev/null +++ b/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt | |||
@@ -0,0 +1,14 @@ | |||
1 | * NXP LPC32xx SoC High Speed UART | ||
2 | |||
3 | Required properties: | ||
4 | - compatible: Should be "nxp,lpc3220-hsuart" | ||
5 | - reg: Should contain registers location and length | ||
6 | - interrupts: Should contain interrupt | ||
7 | |||
8 | Example: | ||
9 | |||
10 | uart1: serial@40014000 { | ||
11 | compatible = "nxp,lpc3220-hsuart"; | ||
12 | reg = <0x40014000 0x1000>; | ||
13 | interrupts = <26 0>; | ||
14 | }; | ||
diff --git a/Documentation/devicetree/bindings/tty/serial/of-serial.txt b/Documentation/devicetree/bindings/tty/serial/of-serial.txt index 0847fdeee11a..ba385f2e0ddc 100644 --- a/Documentation/devicetree/bindings/tty/serial/of-serial.txt +++ b/Documentation/devicetree/bindings/tty/serial/of-serial.txt | |||
@@ -25,6 +25,8 @@ Optional properties: | |||
25 | accesses to the UART (e.g. TI davinci). | 25 | accesses to the UART (e.g. TI davinci). |
26 | - used-by-rtas : set to indicate that the port is in use by the OpenFirmware | 26 | - used-by-rtas : set to indicate that the port is in use by the OpenFirmware |
27 | RTAS and should not be registered. | 27 | RTAS and should not be registered. |
28 | - no-loopback-test: set to indicate that the port does not implements loopback | ||
29 | test mode | ||
28 | 30 | ||
29 | Example: | 31 | Example: |
30 | 32 | ||
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index c34785dca92b..1ce97f497d23 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c | |||
@@ -338,7 +338,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
338 | { | 338 | { |
339 | /* Handle turning off CRTSCTS */ | 339 | /* Handle turning off CRTSCTS */ |
340 | if ((old_termios->c_cflag & CRTSCTS) && | 340 | if ((old_termios->c_cflag & CRTSCTS) && |
341 | !(tty->termios->c_cflag & CRTSCTS)) { | 341 | !(tty->termios.c_cflag & CRTSCTS)) { |
342 | tty->hw_stopped = 0; | 342 | tty->hw_stopped = 0; |
343 | } | 343 | } |
344 | } | 344 | } |
diff --git a/drivers/bluetooth/hci_ath.c b/drivers/bluetooth/hci_ath.c index 12172a6a95c4..0bc8a6a6a148 100644 --- a/drivers/bluetooth/hci_ath.c +++ b/drivers/bluetooth/hci_ath.c | |||
@@ -58,7 +58,7 @@ static int ath_wakeup_ar3k(struct tty_struct *tty) | |||
58 | return status; | 58 | return status; |
59 | 59 | ||
60 | /* Disable Automatic RTSCTS */ | 60 | /* Disable Automatic RTSCTS */ |
61 | memcpy(&ktermios, tty->termios, sizeof(ktermios)); | 61 | ktermios = tty->termios; |
62 | ktermios.c_cflag &= ~CRTSCTS; | 62 | ktermios.c_cflag &= ~CRTSCTS; |
63 | tty_set_termios(tty, &ktermios); | 63 | tty_set_termios(tty, &ktermios); |
64 | 64 | ||
diff --git a/drivers/char/mwave/mwavedd.c b/drivers/char/mwave/mwavedd.c index 1d82d5838f0c..164544afd680 100644 --- a/drivers/char/mwave/mwavedd.c +++ b/drivers/char/mwave/mwavedd.c | |||
@@ -430,7 +430,7 @@ static ssize_t mwave_write(struct file *file, const char __user *buf, | |||
430 | 430 | ||
431 | static int register_serial_portandirq(unsigned int port, int irq) | 431 | static int register_serial_portandirq(unsigned int port, int irq) |
432 | { | 432 | { |
433 | struct uart_port uart; | 433 | struct uart_8250_port uart; |
434 | 434 | ||
435 | switch ( port ) { | 435 | switch ( port ) { |
436 | case 0x3f8: | 436 | case 0x3f8: |
@@ -462,14 +462,14 @@ static int register_serial_portandirq(unsigned int port, int irq) | |||
462 | } /* switch */ | 462 | } /* switch */ |
463 | /* irq is okay */ | 463 | /* irq is okay */ |
464 | 464 | ||
465 | memset(&uart, 0, sizeof(struct uart_port)); | 465 | memset(&uart, 0, sizeof(uart)); |
466 | 466 | ||
467 | uart.uartclk = 1843200; | 467 | uart.port.uartclk = 1843200; |
468 | uart.iobase = port; | 468 | uart.port.iobase = port; |
469 | uart.irq = irq; | 469 | uart.port.irq = irq; |
470 | uart.iotype = UPIO_PORT; | 470 | uart.port.iotype = UPIO_PORT; |
471 | uart.flags = UPF_SHARE_IRQ; | 471 | uart.port.flags = UPF_SHARE_IRQ; |
472 | return serial8250_register_port(&uart); | 472 | return serial8250_register_8250_port(&uart); |
473 | } | 473 | } |
474 | 474 | ||
475 | 475 | ||
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 0a484b4a1b02..d0cbd29ecfd7 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
@@ -1344,7 +1344,7 @@ static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty) | |||
1344 | /* TODO:disable interrupts instead of reset to preserve signal states */ | 1344 | /* TODO:disable interrupts instead of reset to preserve signal states */ |
1345 | reset_device(info); | 1345 | reset_device(info); |
1346 | 1346 | ||
1347 | if (!tty || tty->termios->c_cflag & HUPCL) { | 1347 | if (!tty || tty->termios.c_cflag & HUPCL) { |
1348 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); | 1348 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
1349 | set_signals(info); | 1349 | set_signals(info); |
1350 | } | 1350 | } |
@@ -1385,7 +1385,7 @@ static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty) | |||
1385 | port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI); | 1385 | port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI); |
1386 | get_signals(info); | 1386 | get_signals(info); |
1387 | 1387 | ||
1388 | if (info->netcount || (tty && (tty->termios->c_cflag & CREAD))) | 1388 | if (info->netcount || (tty && (tty->termios.c_cflag & CREAD))) |
1389 | rx_start(info); | 1389 | rx_start(info); |
1390 | 1390 | ||
1391 | spin_unlock_irqrestore(&info->lock,flags); | 1391 | spin_unlock_irqrestore(&info->lock,flags); |
@@ -1398,14 +1398,14 @@ static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty) | |||
1398 | unsigned cflag; | 1398 | unsigned cflag; |
1399 | int bits_per_char; | 1399 | int bits_per_char; |
1400 | 1400 | ||
1401 | if (!tty || !tty->termios) | 1401 | if (!tty) |
1402 | return; | 1402 | return; |
1403 | 1403 | ||
1404 | if (debug_level >= DEBUG_LEVEL_INFO) | 1404 | if (debug_level >= DEBUG_LEVEL_INFO) |
1405 | printk("%s(%d):mgslpc_change_params(%s)\n", | 1405 | printk("%s(%d):mgslpc_change_params(%s)\n", |
1406 | __FILE__,__LINE__, info->device_name ); | 1406 | __FILE__,__LINE__, info->device_name ); |
1407 | 1407 | ||
1408 | cflag = tty->termios->c_cflag; | 1408 | cflag = tty->termios.c_cflag; |
1409 | 1409 | ||
1410 | /* if B0 rate (hangup) specified then negate DTR and RTS */ | 1410 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
1411 | /* otherwise assert DTR and RTS */ | 1411 | /* otherwise assert DTR and RTS */ |
@@ -1728,7 +1728,7 @@ static void mgslpc_throttle(struct tty_struct * tty) | |||
1728 | if (I_IXOFF(tty)) | 1728 | if (I_IXOFF(tty)) |
1729 | mgslpc_send_xchar(tty, STOP_CHAR(tty)); | 1729 | mgslpc_send_xchar(tty, STOP_CHAR(tty)); |
1730 | 1730 | ||
1731 | if (tty->termios->c_cflag & CRTSCTS) { | 1731 | if (tty->termios.c_cflag & CRTSCTS) { |
1732 | spin_lock_irqsave(&info->lock,flags); | 1732 | spin_lock_irqsave(&info->lock,flags); |
1733 | info->serial_signals &= ~SerialSignal_RTS; | 1733 | info->serial_signals &= ~SerialSignal_RTS; |
1734 | set_signals(info); | 1734 | set_signals(info); |
@@ -1757,7 +1757,7 @@ static void mgslpc_unthrottle(struct tty_struct * tty) | |||
1757 | mgslpc_send_xchar(tty, START_CHAR(tty)); | 1757 | mgslpc_send_xchar(tty, START_CHAR(tty)); |
1758 | } | 1758 | } |
1759 | 1759 | ||
1760 | if (tty->termios->c_cflag & CRTSCTS) { | 1760 | if (tty->termios.c_cflag & CRTSCTS) { |
1761 | spin_lock_irqsave(&info->lock,flags); | 1761 | spin_lock_irqsave(&info->lock,flags); |
1762 | info->serial_signals |= SerialSignal_RTS; | 1762 | info->serial_signals |= SerialSignal_RTS; |
1763 | set_signals(info); | 1763 | set_signals(info); |
@@ -2293,8 +2293,8 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term | |||
2293 | tty->driver->name ); | 2293 | tty->driver->name ); |
2294 | 2294 | ||
2295 | /* just return if nothing has changed */ | 2295 | /* just return if nothing has changed */ |
2296 | if ((tty->termios->c_cflag == old_termios->c_cflag) | 2296 | if ((tty->termios.c_cflag == old_termios->c_cflag) |
2297 | && (RELEVANT_IFLAG(tty->termios->c_iflag) | 2297 | && (RELEVANT_IFLAG(tty->termios.c_iflag) |
2298 | == RELEVANT_IFLAG(old_termios->c_iflag))) | 2298 | == RELEVANT_IFLAG(old_termios->c_iflag))) |
2299 | return; | 2299 | return; |
2300 | 2300 | ||
@@ -2302,7 +2302,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term | |||
2302 | 2302 | ||
2303 | /* Handle transition to B0 status */ | 2303 | /* Handle transition to B0 status */ |
2304 | if (old_termios->c_cflag & CBAUD && | 2304 | if (old_termios->c_cflag & CBAUD && |
2305 | !(tty->termios->c_cflag & CBAUD)) { | 2305 | !(tty->termios.c_cflag & CBAUD)) { |
2306 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); | 2306 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
2307 | spin_lock_irqsave(&info->lock,flags); | 2307 | spin_lock_irqsave(&info->lock,flags); |
2308 | set_signals(info); | 2308 | set_signals(info); |
@@ -2311,9 +2311,9 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term | |||
2311 | 2311 | ||
2312 | /* Handle transition away from B0 status */ | 2312 | /* Handle transition away from B0 status */ |
2313 | if (!(old_termios->c_cflag & CBAUD) && | 2313 | if (!(old_termios->c_cflag & CBAUD) && |
2314 | tty->termios->c_cflag & CBAUD) { | 2314 | tty->termios.c_cflag & CBAUD) { |
2315 | info->serial_signals |= SerialSignal_DTR; | 2315 | info->serial_signals |= SerialSignal_DTR; |
2316 | if (!(tty->termios->c_cflag & CRTSCTS) || | 2316 | if (!(tty->termios.c_cflag & CRTSCTS) || |
2317 | !test_bit(TTY_THROTTLED, &tty->flags)) { | 2317 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
2318 | info->serial_signals |= SerialSignal_RTS; | 2318 | info->serial_signals |= SerialSignal_RTS; |
2319 | } | 2319 | } |
@@ -2324,7 +2324,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term | |||
2324 | 2324 | ||
2325 | /* Handle turning off CRTSCTS */ | 2325 | /* Handle turning off CRTSCTS */ |
2326 | if (old_termios->c_cflag & CRTSCTS && | 2326 | if (old_termios->c_cflag & CRTSCTS && |
2327 | !(tty->termios->c_cflag & CRTSCTS)) { | 2327 | !(tty->termios.c_cflag & CRTSCTS)) { |
2328 | tty->hw_stopped = 0; | 2328 | tty->hw_stopped = 0; |
2329 | tx_release(tty); | 2329 | tx_release(tty); |
2330 | } | 2330 | } |
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index a6d9fd2858f7..f9aab7490868 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c | |||
@@ -446,8 +446,8 @@ static void if_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
446 | goto out; | 446 | goto out; |
447 | } | 447 | } |
448 | 448 | ||
449 | iflag = tty->termios->c_iflag; | 449 | iflag = tty->termios.c_iflag; |
450 | cflag = tty->termios->c_cflag; | 450 | cflag = tty->termios.c_cflag; |
451 | old_cflag = old ? old->c_cflag : cflag; | 451 | old_cflag = old ? old->c_cflag : cflag; |
452 | gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x", | 452 | gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x", |
453 | cs->minor_index, iflag, cflag, old_cflag); | 453 | cs->minor_index, iflag, cflag, old_cflag); |
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 7bc50670d7d9..7a61ef6cffaa 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c | |||
@@ -1009,15 +1009,15 @@ isdn_tty_change_speed(modem_info *info) | |||
1009 | quot; | 1009 | quot; |
1010 | int i; | 1010 | int i; |
1011 | 1011 | ||
1012 | if (!port->tty || !port->tty->termios) | 1012 | if (!port->tty) |
1013 | return; | 1013 | return; |
1014 | cflag = port->tty->termios->c_cflag; | 1014 | cflag = port->tty->termios.c_cflag; |
1015 | 1015 | ||
1016 | quot = i = cflag & CBAUD; | 1016 | quot = i = cflag & CBAUD; |
1017 | if (i & CBAUDEX) { | 1017 | if (i & CBAUDEX) { |
1018 | i &= ~CBAUDEX; | 1018 | i &= ~CBAUDEX; |
1019 | if (i < 1 || i > 2) | 1019 | if (i < 1 || i > 2) |
1020 | port->tty->termios->c_cflag &= ~CBAUDEX; | 1020 | port->tty->termios.c_cflag &= ~CBAUDEX; |
1021 | else | 1021 | else |
1022 | i += 15; | 1022 | i += 15; |
1023 | } | 1023 | } |
@@ -1097,7 +1097,7 @@ isdn_tty_shutdown(modem_info *info) | |||
1097 | #endif | 1097 | #endif |
1098 | isdn_unlock_drivers(); | 1098 | isdn_unlock_drivers(); |
1099 | info->msr &= ~UART_MSR_RI; | 1099 | info->msr &= ~UART_MSR_RI; |
1100 | if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) { | 1100 | if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) { |
1101 | info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); | 1101 | info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); |
1102 | if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) { | 1102 | if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) { |
1103 | isdn_tty_modem_reset_regs(info, 0); | 1103 | isdn_tty_modem_reset_regs(info, 0); |
@@ -1469,13 +1469,13 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
1469 | if (!old_termios) | 1469 | if (!old_termios) |
1470 | isdn_tty_change_speed(info); | 1470 | isdn_tty_change_speed(info); |
1471 | else { | 1471 | else { |
1472 | if (tty->termios->c_cflag == old_termios->c_cflag && | 1472 | if (tty->termios.c_cflag == old_termios->c_cflag && |
1473 | tty->termios->c_ispeed == old_termios->c_ispeed && | 1473 | tty->termios.c_ispeed == old_termios->c_ispeed && |
1474 | tty->termios->c_ospeed == old_termios->c_ospeed) | 1474 | tty->termios.c_ospeed == old_termios->c_ospeed) |
1475 | return; | 1475 | return; |
1476 | isdn_tty_change_speed(info); | 1476 | isdn_tty_change_speed(info); |
1477 | if ((old_termios->c_cflag & CRTSCTS) && | 1477 | if ((old_termios->c_cflag & CRTSCTS) && |
1478 | !(tty->termios->c_cflag & CRTSCTS)) | 1478 | !(tty->termios.c_cflag & CRTSCTS)) |
1479 | tty->hw_stopped = 0; | 1479 | tty->hw_stopped = 0; |
1480 | } | 1480 | } |
1481 | } | 1481 | } |
diff --git a/drivers/misc/ibmasm/uart.c b/drivers/misc/ibmasm/uart.c index 1dcb9ae1905a..01e2b0d7e590 100644 --- a/drivers/misc/ibmasm/uart.c +++ b/drivers/misc/ibmasm/uart.c | |||
@@ -33,7 +33,7 @@ | |||
33 | 33 | ||
34 | void ibmasm_register_uart(struct service_processor *sp) | 34 | void ibmasm_register_uart(struct service_processor *sp) |
35 | { | 35 | { |
36 | struct uart_port uport; | 36 | struct uart_8250_port uart; |
37 | void __iomem *iomem_base; | 37 | void __iomem *iomem_base; |
38 | 38 | ||
39 | iomem_base = sp->base_address + SCOUT_COM_B_BASE; | 39 | iomem_base = sp->base_address + SCOUT_COM_B_BASE; |
@@ -47,14 +47,14 @@ void ibmasm_register_uart(struct service_processor *sp) | |||
47 | return; | 47 | return; |
48 | } | 48 | } |
49 | 49 | ||
50 | memset(&uport, 0, sizeof(struct uart_port)); | 50 | memset(&uart, 0, sizeof(uart)); |
51 | uport.irq = sp->irq; | 51 | uart.port.irq = sp->irq; |
52 | uport.uartclk = 3686400; | 52 | uart.port.uartclk = 3686400; |
53 | uport.flags = UPF_SHARE_IRQ; | 53 | uart.port.flags = UPF_SHARE_IRQ; |
54 | uport.iotype = UPIO_MEM; | 54 | uart.port.iotype = UPIO_MEM; |
55 | uport.membase = iomem_base; | 55 | uart.port.membase = iomem_base; |
56 | 56 | ||
57 | sp->serial_line = serial8250_register_port(&uport); | 57 | sp->serial_line = serial8250_register_8250_port(&uart); |
58 | if (sp->serial_line < 0) { | 58 | if (sp->serial_line < 0) { |
59 | dev_err(sp->dev, "Failed to register serial port\n"); | 59 | dev_err(sp->dev, "Failed to register serial port\n"); |
60 | return; | 60 | return; |
diff --git a/drivers/mmc/card/sdio_uart.c b/drivers/mmc/card/sdio_uart.c index 5a2cbfac66d2..372c0325c149 100644 --- a/drivers/mmc/card/sdio_uart.c +++ b/drivers/mmc/card/sdio_uart.c | |||
@@ -518,7 +518,7 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port) | |||
518 | if (status & UART_MSR_DCTS) { | 518 | if (status & UART_MSR_DCTS) { |
519 | port->icount.cts++; | 519 | port->icount.cts++; |
520 | tty = tty_port_tty_get(&port->port); | 520 | tty = tty_port_tty_get(&port->port); |
521 | if (tty && (tty->termios->c_cflag & CRTSCTS)) { | 521 | if (tty && (tty->termios.c_cflag & CRTSCTS)) { |
522 | int cts = (status & UART_MSR_CTS); | 522 | int cts = (status & UART_MSR_CTS); |
523 | if (tty->hw_stopped) { | 523 | if (tty->hw_stopped) { |
524 | if (cts) { | 524 | if (cts) { |
@@ -671,12 +671,12 @@ static int sdio_uart_activate(struct tty_port *tport, struct tty_struct *tty) | |||
671 | port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE; | 671 | port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE; |
672 | port->mctrl = TIOCM_OUT2; | 672 | port->mctrl = TIOCM_OUT2; |
673 | 673 | ||
674 | sdio_uart_change_speed(port, tty->termios, NULL); | 674 | sdio_uart_change_speed(port, &tty->termios, NULL); |
675 | 675 | ||
676 | if (tty->termios->c_cflag & CBAUD) | 676 | if (tty->termios.c_cflag & CBAUD) |
677 | sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR); | 677 | sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR); |
678 | 678 | ||
679 | if (tty->termios->c_cflag & CRTSCTS) | 679 | if (tty->termios.c_cflag & CRTSCTS) |
680 | if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) | 680 | if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) |
681 | tty->hw_stopped = 1; | 681 | tty->hw_stopped = 1; |
682 | 682 | ||
@@ -850,7 +850,7 @@ static void sdio_uart_throttle(struct tty_struct *tty) | |||
850 | { | 850 | { |
851 | struct sdio_uart_port *port = tty->driver_data; | 851 | struct sdio_uart_port *port = tty->driver_data; |
852 | 852 | ||
853 | if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS)) | 853 | if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS)) |
854 | return; | 854 | return; |
855 | 855 | ||
856 | if (sdio_uart_claim_func(port) != 0) | 856 | if (sdio_uart_claim_func(port) != 0) |
@@ -861,7 +861,7 @@ static void sdio_uart_throttle(struct tty_struct *tty) | |||
861 | sdio_uart_start_tx(port); | 861 | sdio_uart_start_tx(port); |
862 | } | 862 | } |
863 | 863 | ||
864 | if (tty->termios->c_cflag & CRTSCTS) | 864 | if (tty->termios.c_cflag & CRTSCTS) |
865 | sdio_uart_clear_mctrl(port, TIOCM_RTS); | 865 | sdio_uart_clear_mctrl(port, TIOCM_RTS); |
866 | 866 | ||
867 | sdio_uart_irq(port->func); | 867 | sdio_uart_irq(port->func); |
@@ -872,7 +872,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty) | |||
872 | { | 872 | { |
873 | struct sdio_uart_port *port = tty->driver_data; | 873 | struct sdio_uart_port *port = tty->driver_data; |
874 | 874 | ||
875 | if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS)) | 875 | if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS)) |
876 | return; | 876 | return; |
877 | 877 | ||
878 | if (sdio_uart_claim_func(port) != 0) | 878 | if (sdio_uart_claim_func(port) != 0) |
@@ -887,7 +887,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty) | |||
887 | } | 887 | } |
888 | } | 888 | } |
889 | 889 | ||
890 | if (tty->termios->c_cflag & CRTSCTS) | 890 | if (tty->termios.c_cflag & CRTSCTS) |
891 | sdio_uart_set_mctrl(port, TIOCM_RTS); | 891 | sdio_uart_set_mctrl(port, TIOCM_RTS); |
892 | 892 | ||
893 | sdio_uart_irq(port->func); | 893 | sdio_uart_irq(port->func); |
@@ -898,12 +898,12 @@ static void sdio_uart_set_termios(struct tty_struct *tty, | |||
898 | struct ktermios *old_termios) | 898 | struct ktermios *old_termios) |
899 | { | 899 | { |
900 | struct sdio_uart_port *port = tty->driver_data; | 900 | struct sdio_uart_port *port = tty->driver_data; |
901 | unsigned int cflag = tty->termios->c_cflag; | 901 | unsigned int cflag = tty->termios.c_cflag; |
902 | 902 | ||
903 | if (sdio_uart_claim_func(port) != 0) | 903 | if (sdio_uart_claim_func(port) != 0) |
904 | return; | 904 | return; |
905 | 905 | ||
906 | sdio_uart_change_speed(port, tty->termios, old_termios); | 906 | sdio_uart_change_speed(port, &tty->termios, old_termios); |
907 | 907 | ||
908 | /* Handle transition to B0 status */ | 908 | /* Handle transition to B0 status */ |
909 | if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) | 909 | if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) |
diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c index b5ba3084c7fc..3e5519a0acc7 100644 --- a/drivers/net/ethernet/sgi/ioc3-eth.c +++ b/drivers/net/ethernet/sgi/ioc3-eth.c | |||
@@ -1147,15 +1147,17 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart) | |||
1147 | { | 1147 | { |
1148 | #define COSMISC_CONSTANT 6 | 1148 | #define COSMISC_CONSTANT 6 |
1149 | 1149 | ||
1150 | struct uart_port port = { | 1150 | struct uart_8250_port port = { |
1151 | .irq = 0, | 1151 | .port = { |
1152 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | 1152 | .irq = 0, |
1153 | .iotype = UPIO_MEM, | 1153 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, |
1154 | .regshift = 0, | 1154 | .iotype = UPIO_MEM, |
1155 | .uartclk = (22000000 << 1) / COSMISC_CONSTANT, | 1155 | .regshift = 0, |
1156 | 1156 | .uartclk = (22000000 << 1) / COSMISC_CONSTANT, | |
1157 | .membase = (unsigned char __iomem *) uart, | 1157 | |
1158 | .mapbase = (unsigned long) uart, | 1158 | .membase = (unsigned char __iomem *) uart, |
1159 | .mapbase = (unsigned long) uart, | ||
1160 | } | ||
1159 | }; | 1161 | }; |
1160 | unsigned char lcr; | 1162 | unsigned char lcr; |
1161 | 1163 | ||
@@ -1164,7 +1166,7 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart) | |||
1164 | uart->iu_scr = COSMISC_CONSTANT, | 1166 | uart->iu_scr = COSMISC_CONSTANT, |
1165 | uart->iu_lcr = lcr; | 1167 | uart->iu_lcr = lcr; |
1166 | uart->iu_lcr; | 1168 | uart->iu_lcr; |
1167 | serial8250_register_port(&port); | 1169 | serial8250_register_8250_port(&port); |
1168 | } | 1170 | } |
1169 | 1171 | ||
1170 | static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) | 1172 | static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) |
diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c index 3352b2443e58..30087ca23a0f 100644 --- a/drivers/net/irda/irtty-sir.c +++ b/drivers/net/irda/irtty-sir.c | |||
@@ -124,8 +124,8 @@ static int irtty_change_speed(struct sir_dev *dev, unsigned speed) | |||
124 | tty = priv->tty; | 124 | tty = priv->tty; |
125 | 125 | ||
126 | mutex_lock(&tty->termios_mutex); | 126 | mutex_lock(&tty->termios_mutex); |
127 | old_termios = *(tty->termios); | 127 | old_termios = tty->termios; |
128 | cflag = tty->termios->c_cflag; | 128 | cflag = tty->termios.c_cflag; |
129 | tty_encode_baud_rate(tty, speed, speed); | 129 | tty_encode_baud_rate(tty, speed, speed); |
130 | if (tty->ops->set_termios) | 130 | if (tty->ops->set_termios) |
131 | tty->ops->set_termios(tty, &old_termios); | 131 | tty->ops->set_termios(tty, &old_termios); |
@@ -281,15 +281,15 @@ static inline void irtty_stop_receiver(struct tty_struct *tty, int stop) | |||
281 | int cflag; | 281 | int cflag; |
282 | 282 | ||
283 | mutex_lock(&tty->termios_mutex); | 283 | mutex_lock(&tty->termios_mutex); |
284 | old_termios = *(tty->termios); | 284 | old_termios = tty->termios; |
285 | cflag = tty->termios->c_cflag; | 285 | cflag = tty->termios.c_cflag; |
286 | 286 | ||
287 | if (stop) | 287 | if (stop) |
288 | cflag &= ~CREAD; | 288 | cflag &= ~CREAD; |
289 | else | 289 | else |
290 | cflag |= CREAD; | 290 | cflag |= CREAD; |
291 | 291 | ||
292 | tty->termios->c_cflag = cflag; | 292 | tty->termios.c_cflag = cflag; |
293 | if (tty->ops->set_termios) | 293 | if (tty->ops->set_termios) |
294 | tty->ops->set_termios(tty, &old_termios); | 294 | tty->ops->set_termios(tty, &old_termios); |
295 | mutex_unlock(&tty->termios_mutex); | 295 | mutex_unlock(&tty->termios_mutex); |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 62f30b46fa42..7736af75e12b 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -1107,7 +1107,6 @@ static void _hso_serial_set_termios(struct tty_struct *tty, | |||
1107 | struct ktermios *old) | 1107 | struct ktermios *old) |
1108 | { | 1108 | { |
1109 | struct hso_serial *serial = tty->driver_data; | 1109 | struct hso_serial *serial = tty->driver_data; |
1110 | struct ktermios *termios; | ||
1111 | 1110 | ||
1112 | if (!serial) { | 1111 | if (!serial) { |
1113 | printk(KERN_ERR "%s: no tty structures", __func__); | 1112 | printk(KERN_ERR "%s: no tty structures", __func__); |
@@ -1119,16 +1118,15 @@ static void _hso_serial_set_termios(struct tty_struct *tty, | |||
1119 | /* | 1118 | /* |
1120 | * Fix up unsupported bits | 1119 | * Fix up unsupported bits |
1121 | */ | 1120 | */ |
1122 | termios = tty->termios; | 1121 | tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */ |
1123 | termios->c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */ | ||
1124 | 1122 | ||
1125 | termios->c_cflag &= | 1123 | tty->termios.c_cflag &= |
1126 | ~(CSIZE /* no size */ | 1124 | ~(CSIZE /* no size */ |
1127 | | PARENB /* disable parity bit */ | 1125 | | PARENB /* disable parity bit */ |
1128 | | CBAUD /* clear current baud rate */ | 1126 | | CBAUD /* clear current baud rate */ |
1129 | | CBAUDEX); /* clear current buad rate */ | 1127 | | CBAUDEX); /* clear current buad rate */ |
1130 | 1128 | ||
1131 | termios->c_cflag |= CS8; /* character size 8 bits */ | 1129 | tty->termios.c_cflag |= CS8; /* character size 8 bits */ |
1132 | 1130 | ||
1133 | /* baud rate 115200 */ | 1131 | /* baud rate 115200 */ |
1134 | tty_encode_baud_rate(tty, 115200, 115200); | 1132 | tty_encode_baud_rate(tty, 115200, 115200); |
@@ -1425,14 +1423,14 @@ static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
1425 | 1423 | ||
1426 | if (old) | 1424 | if (old) |
1427 | D5("Termios called with: cflags new[%d] - old[%d]", | 1425 | D5("Termios called with: cflags new[%d] - old[%d]", |
1428 | tty->termios->c_cflag, old->c_cflag); | 1426 | tty->termios.c_cflag, old->c_cflag); |
1429 | 1427 | ||
1430 | /* the actual setup */ | 1428 | /* the actual setup */ |
1431 | spin_lock_irqsave(&serial->serial_lock, flags); | 1429 | spin_lock_irqsave(&serial->serial_lock, flags); |
1432 | if (serial->port.count) | 1430 | if (serial->port.count) |
1433 | _hso_serial_set_termios(tty, old); | 1431 | _hso_serial_set_termios(tty, old); |
1434 | else | 1432 | else |
1435 | tty->termios = old; | 1433 | tty->termios = *old; |
1436 | spin_unlock_irqrestore(&serial->serial_lock, flags); | 1434 | spin_unlock_irqrestore(&serial->serial_lock, flags); |
1437 | 1435 | ||
1438 | /* done */ | 1436 | /* done */ |
diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c index 6cc4358f68c1..0e8441e73ee0 100644 --- a/drivers/tty/amiserial.c +++ b/drivers/tty/amiserial.c | |||
@@ -646,7 +646,7 @@ static void shutdown(struct tty_struct *tty, struct serial_state *info) | |||
646 | custom.adkcon = AC_UARTBRK; | 646 | custom.adkcon = AC_UARTBRK; |
647 | mb(); | 647 | mb(); |
648 | 648 | ||
649 | if (tty->termios->c_cflag & HUPCL) | 649 | if (tty->termios.c_cflag & HUPCL) |
650 | info->MCR &= ~(SER_DTR|SER_RTS); | 650 | info->MCR &= ~(SER_DTR|SER_RTS); |
651 | rtsdtr_ctrl(info->MCR); | 651 | rtsdtr_ctrl(info->MCR); |
652 | 652 | ||
@@ -670,7 +670,7 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info, | |||
670 | int bits; | 670 | int bits; |
671 | unsigned long flags; | 671 | unsigned long flags; |
672 | 672 | ||
673 | cflag = tty->termios->c_cflag; | 673 | cflag = tty->termios.c_cflag; |
674 | 674 | ||
675 | /* Byte size is always 8 bits plus parity bit if requested */ | 675 | /* Byte size is always 8 bits plus parity bit if requested */ |
676 | 676 | ||
@@ -707,8 +707,8 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info, | |||
707 | /* If the quotient is zero refuse the change */ | 707 | /* If the quotient is zero refuse the change */ |
708 | if (!quot && old_termios) { | 708 | if (!quot && old_termios) { |
709 | /* FIXME: Will need updating for new tty in the end */ | 709 | /* FIXME: Will need updating for new tty in the end */ |
710 | tty->termios->c_cflag &= ~CBAUD; | 710 | tty->termios.c_cflag &= ~CBAUD; |
711 | tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD); | 711 | tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD); |
712 | baud = tty_get_baud_rate(tty); | 712 | baud = tty_get_baud_rate(tty); |
713 | if (!baud) | 713 | if (!baud) |
714 | baud = 9600; | 714 | baud = 9600; |
@@ -984,7 +984,7 @@ static void rs_throttle(struct tty_struct * tty) | |||
984 | if (I_IXOFF(tty)) | 984 | if (I_IXOFF(tty)) |
985 | rs_send_xchar(tty, STOP_CHAR(tty)); | 985 | rs_send_xchar(tty, STOP_CHAR(tty)); |
986 | 986 | ||
987 | if (tty->termios->c_cflag & CRTSCTS) | 987 | if (tty->termios.c_cflag & CRTSCTS) |
988 | info->MCR &= ~SER_RTS; | 988 | info->MCR &= ~SER_RTS; |
989 | 989 | ||
990 | local_irq_save(flags); | 990 | local_irq_save(flags); |
@@ -1012,7 +1012,7 @@ static void rs_unthrottle(struct tty_struct * tty) | |||
1012 | else | 1012 | else |
1013 | rs_send_xchar(tty, START_CHAR(tty)); | 1013 | rs_send_xchar(tty, START_CHAR(tty)); |
1014 | } | 1014 | } |
1015 | if (tty->termios->c_cflag & CRTSCTS) | 1015 | if (tty->termios.c_cflag & CRTSCTS) |
1016 | info->MCR |= SER_RTS; | 1016 | info->MCR |= SER_RTS; |
1017 | local_irq_save(flags); | 1017 | local_irq_save(flags); |
1018 | rtsdtr_ctrl(info->MCR); | 1018 | rtsdtr_ctrl(info->MCR); |
@@ -1330,7 +1330,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
1330 | { | 1330 | { |
1331 | struct serial_state *info = tty->driver_data; | 1331 | struct serial_state *info = tty->driver_data; |
1332 | unsigned long flags; | 1332 | unsigned long flags; |
1333 | unsigned int cflag = tty->termios->c_cflag; | 1333 | unsigned int cflag = tty->termios.c_cflag; |
1334 | 1334 | ||
1335 | change_speed(tty, info, old_termios); | 1335 | change_speed(tty, info, old_termios); |
1336 | 1336 | ||
@@ -1347,7 +1347,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
1347 | if (!(old_termios->c_cflag & CBAUD) && | 1347 | if (!(old_termios->c_cflag & CBAUD) && |
1348 | (cflag & CBAUD)) { | 1348 | (cflag & CBAUD)) { |
1349 | info->MCR |= SER_DTR; | 1349 | info->MCR |= SER_DTR; |
1350 | if (!(tty->termios->c_cflag & CRTSCTS) || | 1350 | if (!(tty->termios.c_cflag & CRTSCTS) || |
1351 | !test_bit(TTY_THROTTLED, &tty->flags)) { | 1351 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
1352 | info->MCR |= SER_RTS; | 1352 | info->MCR |= SER_RTS; |
1353 | } | 1353 | } |
@@ -1358,7 +1358,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
1358 | 1358 | ||
1359 | /* Handle turning off CRTSCTS */ | 1359 | /* Handle turning off CRTSCTS */ |
1360 | if ((old_termios->c_cflag & CRTSCTS) && | 1360 | if ((old_termios->c_cflag & CRTSCTS) && |
1361 | !(tty->termios->c_cflag & CRTSCTS)) { | 1361 | !(tty->termios.c_cflag & CRTSCTS)) { |
1362 | tty->hw_stopped = 0; | 1362 | tty->hw_stopped = 0; |
1363 | rs_start(tty); | 1363 | rs_start(tty); |
1364 | } | 1364 | } |
@@ -1371,7 +1371,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
1371 | * or not. Hence, this may change..... | 1371 | * or not. Hence, this may change..... |
1372 | */ | 1372 | */ |
1373 | if (!(old_termios->c_cflag & CLOCAL) && | 1373 | if (!(old_termios->c_cflag & CLOCAL) && |
1374 | (tty->termios->c_cflag & CLOCAL)) | 1374 | (tty->termios.c_cflag & CLOCAL)) |
1375 | wake_up_interruptible(&info->open_wait); | 1375 | wake_up_interruptible(&info->open_wait); |
1376 | #endif | 1376 | #endif |
1377 | } | 1377 | } |
diff --git a/drivers/tty/cyclades.c b/drivers/tty/cyclades.c index e61cabdd69df..e77db714ab26 100644 --- a/drivers/tty/cyclades.c +++ b/drivers/tty/cyclades.c | |||
@@ -1459,7 +1459,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty) | |||
1459 | info->port.xmit_buf = NULL; | 1459 | info->port.xmit_buf = NULL; |
1460 | free_page((unsigned long)temp); | 1460 | free_page((unsigned long)temp); |
1461 | } | 1461 | } |
1462 | if (tty->termios->c_cflag & HUPCL) | 1462 | if (tty->termios.c_cflag & HUPCL) |
1463 | cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR); | 1463 | cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR); |
1464 | 1464 | ||
1465 | cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR); | 1465 | cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR); |
@@ -1488,7 +1488,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty) | |||
1488 | free_page((unsigned long)temp); | 1488 | free_page((unsigned long)temp); |
1489 | } | 1489 | } |
1490 | 1490 | ||
1491 | if (tty->termios->c_cflag & HUPCL) | 1491 | if (tty->termios.c_cflag & HUPCL) |
1492 | tty_port_lower_dtr_rts(&info->port); | 1492 | tty_port_lower_dtr_rts(&info->port); |
1493 | 1493 | ||
1494 | set_bit(TTY_IO_ERROR, &tty->flags); | 1494 | set_bit(TTY_IO_ERROR, &tty->flags); |
@@ -1999,14 +1999,11 @@ static void cy_set_line_char(struct cyclades_port *info, struct tty_struct *tty) | |||
1999 | int baud, baud_rate = 0; | 1999 | int baud, baud_rate = 0; |
2000 | int i; | 2000 | int i; |
2001 | 2001 | ||
2002 | if (!tty->termios) /* XXX can this happen at all? */ | ||
2003 | return; | ||
2004 | |||
2005 | if (info->line == -1) | 2002 | if (info->line == -1) |
2006 | return; | 2003 | return; |
2007 | 2004 | ||
2008 | cflag = tty->termios->c_cflag; | 2005 | cflag = tty->termios.c_cflag; |
2009 | iflag = tty->termios->c_iflag; | 2006 | iflag = tty->termios.c_iflag; |
2010 | 2007 | ||
2011 | /* | 2008 | /* |
2012 | * Set up the tty->alt_speed kludge | 2009 | * Set up the tty->alt_speed kludge |
@@ -2825,7 +2822,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
2825 | cy_set_line_char(info, tty); | 2822 | cy_set_line_char(info, tty); |
2826 | 2823 | ||
2827 | if ((old_termios->c_cflag & CRTSCTS) && | 2824 | if ((old_termios->c_cflag & CRTSCTS) && |
2828 | !(tty->termios->c_cflag & CRTSCTS)) { | 2825 | !(tty->termios.c_cflag & CRTSCTS)) { |
2829 | tty->hw_stopped = 0; | 2826 | tty->hw_stopped = 0; |
2830 | cy_start(tty); | 2827 | cy_start(tty); |
2831 | } | 2828 | } |
@@ -2837,7 +2834,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
2837 | * or not. Hence, this may change..... | 2834 | * or not. Hence, this may change..... |
2838 | */ | 2835 | */ |
2839 | if (!(old_termios->c_cflag & CLOCAL) && | 2836 | if (!(old_termios->c_cflag & CLOCAL) && |
2840 | (tty->termios->c_cflag & CLOCAL)) | 2837 | (tty->termios.c_cflag & CLOCAL)) |
2841 | wake_up_interruptible(&info->port.open_wait); | 2838 | wake_up_interruptible(&info->port.open_wait); |
2842 | #endif | 2839 | #endif |
2843 | } /* cy_set_termios */ | 2840 | } /* cy_set_termios */ |
@@ -2899,7 +2896,7 @@ static void cy_throttle(struct tty_struct *tty) | |||
2899 | info->throttle = 1; | 2896 | info->throttle = 1; |
2900 | } | 2897 | } |
2901 | 2898 | ||
2902 | if (tty->termios->c_cflag & CRTSCTS) { | 2899 | if (tty->termios.c_cflag & CRTSCTS) { |
2903 | if (!cy_is_Z(card)) { | 2900 | if (!cy_is_Z(card)) { |
2904 | spin_lock_irqsave(&card->card_lock, flags); | 2901 | spin_lock_irqsave(&card->card_lock, flags); |
2905 | cyy_change_rts_dtr(info, 0, TIOCM_RTS); | 2902 | cyy_change_rts_dtr(info, 0, TIOCM_RTS); |
@@ -2938,7 +2935,7 @@ static void cy_unthrottle(struct tty_struct *tty) | |||
2938 | cy_send_xchar(tty, START_CHAR(tty)); | 2935 | cy_send_xchar(tty, START_CHAR(tty)); |
2939 | } | 2936 | } |
2940 | 2937 | ||
2941 | if (tty->termios->c_cflag & CRTSCTS) { | 2938 | if (tty->termios.c_cflag & CRTSCTS) { |
2942 | card = info->card; | 2939 | card = info->card; |
2943 | if (!cy_is_Z(card)) { | 2940 | if (!cy_is_Z(card)) { |
2944 | spin_lock_irqsave(&card->card_lock, flags); | 2941 | spin_lock_irqsave(&card->card_lock, flags); |
@@ -3289,6 +3286,7 @@ static unsigned short __devinit cyy_init_card(void __iomem *true_base_addr, | |||
3289 | static int __init cy_detect_isa(void) | 3286 | static int __init cy_detect_isa(void) |
3290 | { | 3287 | { |
3291 | #ifdef CONFIG_ISA | 3288 | #ifdef CONFIG_ISA |
3289 | struct cyclades_card *card; | ||
3292 | unsigned short cy_isa_irq, nboard; | 3290 | unsigned short cy_isa_irq, nboard; |
3293 | void __iomem *cy_isa_address; | 3291 | void __iomem *cy_isa_address; |
3294 | unsigned short i, j, cy_isa_nchan; | 3292 | unsigned short i, j, cy_isa_nchan; |
@@ -3349,7 +3347,8 @@ static int __init cy_detect_isa(void) | |||
3349 | } | 3347 | } |
3350 | /* fill the next cy_card structure available */ | 3348 | /* fill the next cy_card structure available */ |
3351 | for (j = 0; j < NR_CARDS; j++) { | 3349 | for (j = 0; j < NR_CARDS; j++) { |
3352 | if (cy_card[j].base_addr == NULL) | 3350 | card = &cy_card[j]; |
3351 | if (card->base_addr == NULL) | ||
3353 | break; | 3352 | break; |
3354 | } | 3353 | } |
3355 | if (j == NR_CARDS) { /* no more cy_cards available */ | 3354 | if (j == NR_CARDS) { /* no more cy_cards available */ |
@@ -3363,7 +3362,7 @@ static int __init cy_detect_isa(void) | |||
3363 | 3362 | ||
3364 | /* allocate IRQ */ | 3363 | /* allocate IRQ */ |
3365 | if (request_irq(cy_isa_irq, cyy_interrupt, | 3364 | if (request_irq(cy_isa_irq, cyy_interrupt, |
3366 | 0, "Cyclom-Y", &cy_card[j])) { | 3365 | 0, "Cyclom-Y", card)) { |
3367 | printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but " | 3366 | printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but " |
3368 | "could not allocate IRQ#%d.\n", | 3367 | "could not allocate IRQ#%d.\n", |
3369 | (unsigned long)cy_isa_address, cy_isa_irq); | 3368 | (unsigned long)cy_isa_address, cy_isa_irq); |
@@ -3372,16 +3371,16 @@ static int __init cy_detect_isa(void) | |||
3372 | } | 3371 | } |
3373 | 3372 | ||
3374 | /* set cy_card */ | 3373 | /* set cy_card */ |
3375 | cy_card[j].base_addr = cy_isa_address; | 3374 | card->base_addr = cy_isa_address; |
3376 | cy_card[j].ctl_addr.p9050 = NULL; | 3375 | card->ctl_addr.p9050 = NULL; |
3377 | cy_card[j].irq = (int)cy_isa_irq; | 3376 | card->irq = (int)cy_isa_irq; |
3378 | cy_card[j].bus_index = 0; | 3377 | card->bus_index = 0; |
3379 | cy_card[j].first_line = cy_next_channel; | 3378 | card->first_line = cy_next_channel; |
3380 | cy_card[j].num_chips = cy_isa_nchan / CyPORTS_PER_CHIP; | 3379 | card->num_chips = cy_isa_nchan / CyPORTS_PER_CHIP; |
3381 | cy_card[j].nports = cy_isa_nchan; | 3380 | card->nports = cy_isa_nchan; |
3382 | if (cy_init_card(&cy_card[j])) { | 3381 | if (cy_init_card(card)) { |
3383 | cy_card[j].base_addr = NULL; | 3382 | card->base_addr = NULL; |
3384 | free_irq(cy_isa_irq, &cy_card[j]); | 3383 | free_irq(cy_isa_irq, card); |
3385 | iounmap(cy_isa_address); | 3384 | iounmap(cy_isa_address); |
3386 | continue; | 3385 | continue; |
3387 | } | 3386 | } |
@@ -3695,6 +3694,7 @@ err: | |||
3695 | static int __devinit cy_pci_probe(struct pci_dev *pdev, | 3694 | static int __devinit cy_pci_probe(struct pci_dev *pdev, |
3696 | const struct pci_device_id *ent) | 3695 | const struct pci_device_id *ent) |
3697 | { | 3696 | { |
3697 | struct cyclades_card *card; | ||
3698 | void __iomem *addr0 = NULL, *addr2 = NULL; | 3698 | void __iomem *addr0 = NULL, *addr2 = NULL; |
3699 | char *card_name = NULL; | 3699 | char *card_name = NULL; |
3700 | u32 uninitialized_var(mailbox); | 3700 | u32 uninitialized_var(mailbox); |
@@ -3829,7 +3829,8 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, | |||
3829 | } | 3829 | } |
3830 | /* fill the next cy_card structure available */ | 3830 | /* fill the next cy_card structure available */ |
3831 | for (card_no = 0; card_no < NR_CARDS; card_no++) { | 3831 | for (card_no = 0; card_no < NR_CARDS; card_no++) { |
3832 | if (cy_card[card_no].base_addr == NULL) | 3832 | card = &cy_card[card_no]; |
3833 | if (card->base_addr == NULL) | ||
3833 | break; | 3834 | break; |
3834 | } | 3835 | } |
3835 | if (card_no == NR_CARDS) { /* no more cy_cards available */ | 3836 | if (card_no == NR_CARDS) { /* no more cy_cards available */ |
@@ -3843,27 +3844,26 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, | |||
3843 | device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { | 3844 | device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { |
3844 | /* allocate IRQ */ | 3845 | /* allocate IRQ */ |
3845 | retval = request_irq(irq, cyy_interrupt, | 3846 | retval = request_irq(irq, cyy_interrupt, |
3846 | IRQF_SHARED, "Cyclom-Y", &cy_card[card_no]); | 3847 | IRQF_SHARED, "Cyclom-Y", card); |
3847 | if (retval) { | 3848 | if (retval) { |
3848 | dev_err(&pdev->dev, "could not allocate IRQ\n"); | 3849 | dev_err(&pdev->dev, "could not allocate IRQ\n"); |
3849 | goto err_unmap; | 3850 | goto err_unmap; |
3850 | } | 3851 | } |
3851 | cy_card[card_no].num_chips = nchan / CyPORTS_PER_CHIP; | 3852 | card->num_chips = nchan / CyPORTS_PER_CHIP; |
3852 | } else { | 3853 | } else { |
3853 | struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS; | 3854 | struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS; |
3854 | struct ZFW_CTRL __iomem *zfw_ctrl; | 3855 | struct ZFW_CTRL __iomem *zfw_ctrl; |
3855 | 3856 | ||
3856 | zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff); | 3857 | zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff); |
3857 | 3858 | ||
3858 | cy_card[card_no].hw_ver = mailbox; | 3859 | card->hw_ver = mailbox; |
3859 | cy_card[card_no].num_chips = (unsigned int)-1; | 3860 | card->num_chips = (unsigned int)-1; |
3860 | cy_card[card_no].board_ctrl = &zfw_ctrl->board_ctrl; | 3861 | card->board_ctrl = &zfw_ctrl->board_ctrl; |
3861 | #ifdef CONFIG_CYZ_INTR | 3862 | #ifdef CONFIG_CYZ_INTR |
3862 | /* allocate IRQ only if board has an IRQ */ | 3863 | /* allocate IRQ only if board has an IRQ */ |
3863 | if (irq != 0 && irq != 255) { | 3864 | if (irq != 0 && irq != 255) { |
3864 | retval = request_irq(irq, cyz_interrupt, | 3865 | retval = request_irq(irq, cyz_interrupt, |
3865 | IRQF_SHARED, "Cyclades-Z", | 3866 | IRQF_SHARED, "Cyclades-Z", card); |
3866 | &cy_card[card_no]); | ||
3867 | if (retval) { | 3867 | if (retval) { |
3868 | dev_err(&pdev->dev, "could not allocate IRQ\n"); | 3868 | dev_err(&pdev->dev, "could not allocate IRQ\n"); |
3869 | goto err_unmap; | 3869 | goto err_unmap; |
@@ -3873,17 +3873,17 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, | |||
3873 | } | 3873 | } |
3874 | 3874 | ||
3875 | /* set cy_card */ | 3875 | /* set cy_card */ |
3876 | cy_card[card_no].base_addr = addr2; | 3876 | card->base_addr = addr2; |
3877 | cy_card[card_no].ctl_addr.p9050 = addr0; | 3877 | card->ctl_addr.p9050 = addr0; |
3878 | cy_card[card_no].irq = irq; | 3878 | card->irq = irq; |
3879 | cy_card[card_no].bus_index = 1; | 3879 | card->bus_index = 1; |
3880 | cy_card[card_no].first_line = cy_next_channel; | 3880 | card->first_line = cy_next_channel; |
3881 | cy_card[card_no].nports = nchan; | 3881 | card->nports = nchan; |
3882 | retval = cy_init_card(&cy_card[card_no]); | 3882 | retval = cy_init_card(card); |
3883 | if (retval) | 3883 | if (retval) |
3884 | goto err_null; | 3884 | goto err_null; |
3885 | 3885 | ||
3886 | pci_set_drvdata(pdev, &cy_card[card_no]); | 3886 | pci_set_drvdata(pdev, card); |
3887 | 3887 | ||
3888 | if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo || | 3888 | if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo || |
3889 | device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { | 3889 | device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { |
@@ -3915,8 +3915,8 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, | |||
3915 | 3915 | ||
3916 | return 0; | 3916 | return 0; |
3917 | err_null: | 3917 | err_null: |
3918 | cy_card[card_no].base_addr = NULL; | 3918 | card->base_addr = NULL; |
3919 | free_irq(irq, &cy_card[card_no]); | 3919 | free_irq(irq, card); |
3920 | err_unmap: | 3920 | err_unmap: |
3921 | iounmap(addr0); | 3921 | iounmap(addr0); |
3922 | if (addr2) | 3922 | if (addr2) |
diff --git a/drivers/tty/hvc/hvsi_lib.c b/drivers/tty/hvc/hvsi_lib.c index 59c135dd5d20..3396eb9d57a3 100644 --- a/drivers/tty/hvc/hvsi_lib.c +++ b/drivers/tty/hvc/hvsi_lib.c | |||
@@ -400,7 +400,7 @@ void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp) | |||
400 | spin_unlock_irqrestore(&hp->lock, flags); | 400 | spin_unlock_irqrestore(&hp->lock, flags); |
401 | 401 | ||
402 | /* Clear our own DTR */ | 402 | /* Clear our own DTR */ |
403 | if (!pv->tty || (pv->tty->termios->c_cflag & HUPCL)) | 403 | if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL)) |
404 | hvsilib_write_mctrl(pv, 0); | 404 | hvsilib_write_mctrl(pv, 0); |
405 | 405 | ||
406 | /* Tear down the connection */ | 406 | /* Tear down the connection */ |
diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index e1235accab74..d593a7d18ad5 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c | |||
@@ -702,7 +702,7 @@ static void isicom_config_port(struct tty_struct *tty) | |||
702 | 702 | ||
703 | /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */ | 703 | /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */ |
704 | if (baud < 1 || baud > 4) | 704 | if (baud < 1 || baud > 4) |
705 | tty->termios->c_cflag &= ~CBAUDEX; | 705 | tty->termios.c_cflag &= ~CBAUDEX; |
706 | else | 706 | else |
707 | baud += 15; | 707 | baud += 15; |
708 | } | 708 | } |
@@ -1196,8 +1196,8 @@ static void isicom_set_termios(struct tty_struct *tty, | |||
1196 | if (isicom_paranoia_check(port, tty->name, "isicom_set_termios")) | 1196 | if (isicom_paranoia_check(port, tty->name, "isicom_set_termios")) |
1197 | return; | 1197 | return; |
1198 | 1198 | ||
1199 | if (tty->termios->c_cflag == old_termios->c_cflag && | 1199 | if (tty->termios.c_cflag == old_termios->c_cflag && |
1200 | tty->termios->c_iflag == old_termios->c_iflag) | 1200 | tty->termios.c_iflag == old_termios->c_iflag) |
1201 | return; | 1201 | return; |
1202 | 1202 | ||
1203 | spin_lock_irqsave(&port->card->card_lock, flags); | 1203 | spin_lock_irqsave(&port->card->card_lock, flags); |
@@ -1205,7 +1205,7 @@ static void isicom_set_termios(struct tty_struct *tty, | |||
1205 | spin_unlock_irqrestore(&port->card->card_lock, flags); | 1205 | spin_unlock_irqrestore(&port->card->card_lock, flags); |
1206 | 1206 | ||
1207 | if ((old_termios->c_cflag & CRTSCTS) && | 1207 | if ((old_termios->c_cflag & CRTSCTS) && |
1208 | !(tty->termios->c_cflag & CRTSCTS)) { | 1208 | !(tty->termios.c_cflag & CRTSCTS)) { |
1209 | tty->hw_stopped = 0; | 1209 | tty->hw_stopped = 0; |
1210 | isicom_start(tty); | 1210 | isicom_start(tty); |
1211 | } | 1211 | } |
diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c index 324467d28a54..89cc9344325b 100644 --- a/drivers/tty/moxa.c +++ b/drivers/tty/moxa.c | |||
@@ -367,10 +367,10 @@ static int moxa_ioctl(struct tty_struct *tty, | |||
367 | tmp.dcd = 1; | 367 | tmp.dcd = 1; |
368 | 368 | ||
369 | ttyp = tty_port_tty_get(&p->port); | 369 | ttyp = tty_port_tty_get(&p->port); |
370 | if (!ttyp || !ttyp->termios) | 370 | if (!ttyp) |
371 | tmp.cflag = p->cflag; | 371 | tmp.cflag = p->cflag; |
372 | else | 372 | else |
373 | tmp.cflag = ttyp->termios->c_cflag; | 373 | tmp.cflag = ttyp->termios.c_cflag; |
374 | tty_kref_put(ttyp); | 374 | tty_kref_put(ttyp); |
375 | copy: | 375 | copy: |
376 | if (copy_to_user(argm, &tmp, sizeof(tmp))) | 376 | if (copy_to_user(argm, &tmp, sizeof(tmp))) |
@@ -1178,7 +1178,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) | |||
1178 | mutex_lock(&ch->port.mutex); | 1178 | mutex_lock(&ch->port.mutex); |
1179 | if (!(ch->port.flags & ASYNC_INITIALIZED)) { | 1179 | if (!(ch->port.flags & ASYNC_INITIALIZED)) { |
1180 | ch->statusflags = 0; | 1180 | ch->statusflags = 0; |
1181 | moxa_set_tty_param(tty, tty->termios); | 1181 | moxa_set_tty_param(tty, &tty->termios); |
1182 | MoxaPortLineCtrl(ch, 1, 1); | 1182 | MoxaPortLineCtrl(ch, 1, 1); |
1183 | MoxaPortEnable(ch); | 1183 | MoxaPortEnable(ch); |
1184 | MoxaSetFifo(ch, ch->type == PORT_16550A); | 1184 | MoxaSetFifo(ch, ch->type == PORT_16550A); |
@@ -1193,7 +1193,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) | |||
1193 | static void moxa_close(struct tty_struct *tty, struct file *filp) | 1193 | static void moxa_close(struct tty_struct *tty, struct file *filp) |
1194 | { | 1194 | { |
1195 | struct moxa_port *ch = tty->driver_data; | 1195 | struct moxa_port *ch = tty->driver_data; |
1196 | ch->cflag = tty->termios->c_cflag; | 1196 | ch->cflag = tty->termios.c_cflag; |
1197 | tty_port_close(&ch->port, tty, filp); | 1197 | tty_port_close(&ch->port, tty, filp); |
1198 | } | 1198 | } |
1199 | 1199 | ||
@@ -1464,7 +1464,7 @@ static void moxa_poll(unsigned long ignored) | |||
1464 | 1464 | ||
1465 | static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) | 1465 | static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) |
1466 | { | 1466 | { |
1467 | register struct ktermios *ts = tty->termios; | 1467 | register struct ktermios *ts = &tty->termios; |
1468 | struct moxa_port *ch = tty->driver_data; | 1468 | struct moxa_port *ch = tty->driver_data; |
1469 | int rts, cts, txflow, rxflow, xany, baud; | 1469 | int rts, cts, txflow, rxflow, xany, baud; |
1470 | 1470 | ||
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 90cc680c4f0e..c162ee931167 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c | |||
@@ -643,7 +643,7 @@ static int mxser_change_speed(struct tty_struct *tty, | |||
643 | int ret = 0; | 643 | int ret = 0; |
644 | unsigned char status; | 644 | unsigned char status; |
645 | 645 | ||
646 | cflag = tty->termios->c_cflag; | 646 | cflag = tty->termios.c_cflag; |
647 | if (!info->ioaddr) | 647 | if (!info->ioaddr) |
648 | return ret; | 648 | return ret; |
649 | 649 | ||
@@ -1520,10 +1520,10 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) | |||
1520 | 1520 | ||
1521 | tty = tty_port_tty_get(port); | 1521 | tty = tty_port_tty_get(port); |
1522 | 1522 | ||
1523 | if (!tty || !tty->termios) | 1523 | if (!tty) |
1524 | ms.cflag = ip->normal_termios.c_cflag; | 1524 | ms.cflag = ip->normal_termios.c_cflag; |
1525 | else | 1525 | else |
1526 | ms.cflag = tty->termios->c_cflag; | 1526 | ms.cflag = tty->termios.c_cflag; |
1527 | tty_kref_put(tty); | 1527 | tty_kref_put(tty); |
1528 | spin_lock_irq(&ip->slock); | 1528 | spin_lock_irq(&ip->slock); |
1529 | status = inb(ip->ioaddr + UART_MSR); | 1529 | status = inb(ip->ioaddr + UART_MSR); |
@@ -1589,13 +1589,13 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) | |||
1589 | 1589 | ||
1590 | tty = tty_port_tty_get(&ip->port); | 1590 | tty = tty_port_tty_get(&ip->port); |
1591 | 1591 | ||
1592 | if (!tty || !tty->termios) { | 1592 | if (!tty) { |
1593 | cflag = ip->normal_termios.c_cflag; | 1593 | cflag = ip->normal_termios.c_cflag; |
1594 | iflag = ip->normal_termios.c_iflag; | 1594 | iflag = ip->normal_termios.c_iflag; |
1595 | me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); | 1595 | me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); |
1596 | } else { | 1596 | } else { |
1597 | cflag = tty->termios->c_cflag; | 1597 | cflag = tty->termios.c_cflag; |
1598 | iflag = tty->termios->c_iflag; | 1598 | iflag = tty->termios.c_iflag; |
1599 | me->baudrate[p] = tty_get_baud_rate(tty); | 1599 | me->baudrate[p] = tty_get_baud_rate(tty); |
1600 | } | 1600 | } |
1601 | tty_kref_put(tty); | 1601 | tty_kref_put(tty); |
@@ -1853,7 +1853,7 @@ static void mxser_stoprx(struct tty_struct *tty) | |||
1853 | } | 1853 | } |
1854 | } | 1854 | } |
1855 | 1855 | ||
1856 | if (tty->termios->c_cflag & CRTSCTS) { | 1856 | if (tty->termios.c_cflag & CRTSCTS) { |
1857 | info->MCR &= ~UART_MCR_RTS; | 1857 | info->MCR &= ~UART_MCR_RTS; |
1858 | outb(info->MCR, info->ioaddr + UART_MCR); | 1858 | outb(info->MCR, info->ioaddr + UART_MCR); |
1859 | } | 1859 | } |
@@ -1890,7 +1890,7 @@ static void mxser_unthrottle(struct tty_struct *tty) | |||
1890 | } | 1890 | } |
1891 | } | 1891 | } |
1892 | 1892 | ||
1893 | if (tty->termios->c_cflag & CRTSCTS) { | 1893 | if (tty->termios.c_cflag & CRTSCTS) { |
1894 | info->MCR |= UART_MCR_RTS; | 1894 | info->MCR |= UART_MCR_RTS; |
1895 | outb(info->MCR, info->ioaddr + UART_MCR); | 1895 | outb(info->MCR, info->ioaddr + UART_MCR); |
1896 | } | 1896 | } |
@@ -1939,14 +1939,14 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi | |||
1939 | spin_unlock_irqrestore(&info->slock, flags); | 1939 | spin_unlock_irqrestore(&info->slock, flags); |
1940 | 1940 | ||
1941 | if ((old_termios->c_cflag & CRTSCTS) && | 1941 | if ((old_termios->c_cflag & CRTSCTS) && |
1942 | !(tty->termios->c_cflag & CRTSCTS)) { | 1942 | !(tty->termios.c_cflag & CRTSCTS)) { |
1943 | tty->hw_stopped = 0; | 1943 | tty->hw_stopped = 0; |
1944 | mxser_start(tty); | 1944 | mxser_start(tty); |
1945 | } | 1945 | } |
1946 | 1946 | ||
1947 | /* Handle sw stopped */ | 1947 | /* Handle sw stopped */ |
1948 | if ((old_termios->c_iflag & IXON) && | 1948 | if ((old_termios->c_iflag & IXON) && |
1949 | !(tty->termios->c_iflag & IXON)) { | 1949 | !(tty->termios.c_iflag & IXON)) { |
1950 | tty->stopped = 0; | 1950 | tty->stopped = 0; |
1951 | 1951 | ||
1952 | if (info->board->chip_flag) { | 1952 | if (info->board->chip_flag) { |
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index c43b683b6eb8..7a4bf3053a15 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c | |||
@@ -1061,7 +1061,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, | |||
1061 | /* Carrier drop -> hangup */ | 1061 | /* Carrier drop -> hangup */ |
1062 | if (tty) { | 1062 | if (tty) { |
1063 | if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD)) | 1063 | if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD)) |
1064 | if (!(tty->termios->c_cflag & CLOCAL)) | 1064 | if (!(tty->termios.c_cflag & CLOCAL)) |
1065 | tty_hangup(tty); | 1065 | tty_hangup(tty); |
1066 | if (brk & 0x01) | 1066 | if (brk & 0x01) |
1067 | tty_insert_flip_char(tty, 0, TTY_BREAK); | 1067 | tty_insert_flip_char(tty, 0, TTY_BREAK); |
@@ -3043,13 +3043,13 @@ static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
3043 | the RPN control message. This however rapidly gets nasty as we | 3043 | the RPN control message. This however rapidly gets nasty as we |
3044 | then have to remap modem signals each way according to whether | 3044 | then have to remap modem signals each way according to whether |
3045 | our virtual cable is null modem etc .. */ | 3045 | our virtual cable is null modem etc .. */ |
3046 | tty_termios_copy_hw(tty->termios, old); | 3046 | tty_termios_copy_hw(&tty->termios, old); |
3047 | } | 3047 | } |
3048 | 3048 | ||
3049 | static void gsmtty_throttle(struct tty_struct *tty) | 3049 | static void gsmtty_throttle(struct tty_struct *tty) |
3050 | { | 3050 | { |
3051 | struct gsm_dlci *dlci = tty->driver_data; | 3051 | struct gsm_dlci *dlci = tty->driver_data; |
3052 | if (tty->termios->c_cflag & CRTSCTS) | 3052 | if (tty->termios.c_cflag & CRTSCTS) |
3053 | dlci->modem_tx &= ~TIOCM_DTR; | 3053 | dlci->modem_tx &= ~TIOCM_DTR; |
3054 | dlci->throttled = 1; | 3054 | dlci->throttled = 1; |
3055 | /* Send an MSC with DTR cleared */ | 3055 | /* Send an MSC with DTR cleared */ |
@@ -3059,7 +3059,7 @@ static void gsmtty_throttle(struct tty_struct *tty) | |||
3059 | static void gsmtty_unthrottle(struct tty_struct *tty) | 3059 | static void gsmtty_unthrottle(struct tty_struct *tty) |
3060 | { | 3060 | { |
3061 | struct gsm_dlci *dlci = tty->driver_data; | 3061 | struct gsm_dlci *dlci = tty->driver_data; |
3062 | if (tty->termios->c_cflag & CRTSCTS) | 3062 | if (tty->termios.c_cflag & CRTSCTS) |
3063 | dlci->modem_tx |= TIOCM_DTR; | 3063 | dlci->modem_tx |= TIOCM_DTR; |
3064 | dlci->throttled = 0; | 3064 | dlci->throttled = 0; |
3065 | /* Send an MSC with DTR set */ | 3065 | /* Send an MSC with DTR set */ |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index ee1c268f5f9d..101790cea4ae 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -1432,6 +1432,12 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
1432 | */ | 1432 | */ |
1433 | if (tty->receive_room < TTY_THRESHOLD_THROTTLE) | 1433 | if (tty->receive_room < TTY_THRESHOLD_THROTTLE) |
1434 | tty_throttle(tty); | 1434 | tty_throttle(tty); |
1435 | |||
1436 | /* FIXME: there is a tiny race here if the receive room check runs | ||
1437 | before the other work executes and empties the buffer (upping | ||
1438 | the receiving room and unthrottling. We then throttle and get | ||
1439 | stuck. This has been observed and traced down by Vincent Pillet/ | ||
1440 | We need to address this when we sort out out the rx path locking */ | ||
1435 | } | 1441 | } |
1436 | 1442 | ||
1437 | int is_ignored(int sig) | 1443 | int is_ignored(int sig) |
@@ -1460,7 +1466,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
1460 | BUG_ON(!tty); | 1466 | BUG_ON(!tty); |
1461 | 1467 | ||
1462 | if (old) | 1468 | if (old) |
1463 | canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON; | 1469 | canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON; |
1464 | if (canon_change) { | 1470 | if (canon_change) { |
1465 | memset(&tty->read_flags, 0, sizeof tty->read_flags); | 1471 | memset(&tty->read_flags, 0, sizeof tty->read_flags); |
1466 | tty->canon_head = tty->read_tail; | 1472 | tty->canon_head = tty->read_tail; |
diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c index 5505ffc91da4..d6579a9064c4 100644 --- a/drivers/tty/pty.c +++ b/drivers/tty/pty.c | |||
@@ -231,8 +231,8 @@ out: | |||
231 | static void pty_set_termios(struct tty_struct *tty, | 231 | static void pty_set_termios(struct tty_struct *tty, |
232 | struct ktermios *old_termios) | 232 | struct ktermios *old_termios) |
233 | { | 233 | { |
234 | tty->termios->c_cflag &= ~(CSIZE | PARENB); | 234 | tty->termios.c_cflag &= ~(CSIZE | PARENB); |
235 | tty->termios->c_cflag |= (CS8 | CREAD); | 235 | tty->termios.c_cflag |= (CS8 | CREAD); |
236 | } | 236 | } |
237 | 237 | ||
238 | /** | 238 | /** |
@@ -282,60 +282,107 @@ done: | |||
282 | return 0; | 282 | return 0; |
283 | } | 283 | } |
284 | 284 | ||
285 | /* Traditional BSD devices */ | 285 | /** |
286 | #ifdef CONFIG_LEGACY_PTYS | 286 | * pty_common_install - set up the pty pair |
287 | 287 | * @driver: the pty driver | |
288 | static int pty_install(struct tty_driver *driver, struct tty_struct *tty) | 288 | * @tty: the tty being instantiated |
289 | * @bool: legacy, true if this is BSD style | ||
290 | * | ||
291 | * Perform the initial set up for the tty/pty pair. Called from the | ||
292 | * tty layer when the port is first opened. | ||
293 | * | ||
294 | * Locking: the caller must hold the tty_mutex | ||
295 | */ | ||
296 | static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty, | ||
297 | bool legacy) | ||
289 | { | 298 | { |
290 | struct tty_struct *o_tty; | 299 | struct tty_struct *o_tty; |
300 | struct tty_port *ports[2]; | ||
291 | int idx = tty->index; | 301 | int idx = tty->index; |
292 | int retval; | 302 | int retval = -ENOMEM; |
293 | 303 | ||
294 | o_tty = alloc_tty_struct(); | 304 | o_tty = alloc_tty_struct(); |
295 | if (!o_tty) | 305 | ports[0] = kmalloc(sizeof **ports, GFP_KERNEL); |
296 | return -ENOMEM; | 306 | ports[1] = kmalloc(sizeof **ports, GFP_KERNEL); |
307 | if (!o_tty || !ports[0] || !ports[1]) | ||
308 | goto err_free_tty; | ||
297 | if (!try_module_get(driver->other->owner)) { | 309 | if (!try_module_get(driver->other->owner)) { |
298 | /* This cannot in fact currently happen */ | 310 | /* This cannot in fact currently happen */ |
299 | retval = -ENOMEM; | ||
300 | goto err_free_tty; | 311 | goto err_free_tty; |
301 | } | 312 | } |
302 | initialize_tty_struct(o_tty, driver->other, idx); | 313 | initialize_tty_struct(o_tty, driver->other, idx); |
303 | 314 | ||
304 | /* We always use new tty termios data so we can do this | 315 | if (legacy) { |
305 | the easy way .. */ | 316 | /* We always use new tty termios data so we can do this |
306 | retval = tty_init_termios(tty); | 317 | the easy way .. */ |
307 | if (retval) | 318 | retval = tty_init_termios(tty); |
308 | goto err_deinit_tty; | 319 | if (retval) |
309 | 320 | goto err_deinit_tty; | |
310 | retval = tty_init_termios(o_tty); | 321 | |
311 | if (retval) | 322 | retval = tty_init_termios(o_tty); |
312 | goto err_free_termios; | 323 | if (retval) |
324 | goto err_free_termios; | ||
325 | |||
326 | driver->other->ttys[idx] = o_tty; | ||
327 | driver->ttys[idx] = tty; | ||
328 | } else { | ||
329 | memset(&tty->termios_locked, 0, sizeof(tty->termios_locked)); | ||
330 | tty->termios = driver->init_termios; | ||
331 | memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked)); | ||
332 | o_tty->termios = driver->other->init_termios; | ||
333 | } | ||
313 | 334 | ||
314 | /* | 335 | /* |
315 | * Everything allocated ... set up the o_tty structure. | 336 | * Everything allocated ... set up the o_tty structure. |
316 | */ | 337 | */ |
317 | driver->other->ttys[idx] = o_tty; | ||
318 | tty_driver_kref_get(driver->other); | 338 | tty_driver_kref_get(driver->other); |
319 | if (driver->subtype == PTY_TYPE_MASTER) | 339 | if (driver->subtype == PTY_TYPE_MASTER) |
320 | o_tty->count++; | 340 | o_tty->count++; |
321 | /* Establish the links in both directions */ | 341 | /* Establish the links in both directions */ |
322 | tty->link = o_tty; | 342 | tty->link = o_tty; |
323 | o_tty->link = tty; | 343 | o_tty->link = tty; |
344 | tty_port_init(ports[0]); | ||
345 | tty_port_init(ports[1]); | ||
346 | o_tty->port = ports[0]; | ||
347 | tty->port = ports[1]; | ||
324 | 348 | ||
325 | tty_driver_kref_get(driver); | 349 | tty_driver_kref_get(driver); |
326 | tty->count++; | 350 | tty->count++; |
327 | driver->ttys[idx] = tty; | ||
328 | return 0; | 351 | return 0; |
329 | err_free_termios: | 352 | err_free_termios: |
330 | tty_free_termios(tty); | 353 | if (legacy) |
354 | tty_free_termios(tty); | ||
331 | err_deinit_tty: | 355 | err_deinit_tty: |
332 | deinitialize_tty_struct(o_tty); | 356 | deinitialize_tty_struct(o_tty); |
333 | module_put(o_tty->driver->owner); | 357 | module_put(o_tty->driver->owner); |
334 | err_free_tty: | 358 | err_free_tty: |
359 | kfree(ports[0]); | ||
360 | kfree(ports[1]); | ||
335 | free_tty_struct(o_tty); | 361 | free_tty_struct(o_tty); |
336 | return retval; | 362 | return retval; |
337 | } | 363 | } |
338 | 364 | ||
365 | static void pty_cleanup(struct tty_struct *tty) | ||
366 | { | ||
367 | kfree(tty->port); | ||
368 | } | ||
369 | |||
370 | /* Traditional BSD devices */ | ||
371 | #ifdef CONFIG_LEGACY_PTYS | ||
372 | |||
373 | static int pty_install(struct tty_driver *driver, struct tty_struct *tty) | ||
374 | { | ||
375 | return pty_common_install(driver, tty, true); | ||
376 | } | ||
377 | |||
378 | static void pty_remove(struct tty_driver *driver, struct tty_struct *tty) | ||
379 | { | ||
380 | struct tty_struct *pair = tty->link; | ||
381 | driver->ttys[tty->index] = NULL; | ||
382 | if (pair) | ||
383 | pair->driver->ttys[pair->index] = NULL; | ||
384 | } | ||
385 | |||
339 | static int pty_bsd_ioctl(struct tty_struct *tty, | 386 | static int pty_bsd_ioctl(struct tty_struct *tty, |
340 | unsigned int cmd, unsigned long arg) | 387 | unsigned int cmd, unsigned long arg) |
341 | { | 388 | { |
@@ -366,7 +413,9 @@ static const struct tty_operations master_pty_ops_bsd = { | |||
366 | .unthrottle = pty_unthrottle, | 413 | .unthrottle = pty_unthrottle, |
367 | .set_termios = pty_set_termios, | 414 | .set_termios = pty_set_termios, |
368 | .ioctl = pty_bsd_ioctl, | 415 | .ioctl = pty_bsd_ioctl, |
369 | .resize = pty_resize | 416 | .cleanup = pty_cleanup, |
417 | .resize = pty_resize, | ||
418 | .remove = pty_remove | ||
370 | }; | 419 | }; |
371 | 420 | ||
372 | static const struct tty_operations slave_pty_ops_bsd = { | 421 | static const struct tty_operations slave_pty_ops_bsd = { |
@@ -379,7 +428,9 @@ static const struct tty_operations slave_pty_ops_bsd = { | |||
379 | .chars_in_buffer = pty_chars_in_buffer, | 428 | .chars_in_buffer = pty_chars_in_buffer, |
380 | .unthrottle = pty_unthrottle, | 429 | .unthrottle = pty_unthrottle, |
381 | .set_termios = pty_set_termios, | 430 | .set_termios = pty_set_termios, |
382 | .resize = pty_resize | 431 | .cleanup = pty_cleanup, |
432 | .resize = pty_resize, | ||
433 | .remove = pty_remove | ||
383 | }; | 434 | }; |
384 | 435 | ||
385 | static void __init legacy_pty_init(void) | 436 | static void __init legacy_pty_init(void) |
@@ -497,78 +548,22 @@ static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, | |||
497 | return tty; | 548 | return tty; |
498 | } | 549 | } |
499 | 550 | ||
500 | static void pty_unix98_shutdown(struct tty_struct *tty) | ||
501 | { | ||
502 | tty_driver_remove_tty(tty->driver, tty); | ||
503 | /* We have our own method as we don't use the tty index */ | ||
504 | kfree(tty->termios); | ||
505 | } | ||
506 | |||
507 | /* We have no need to install and remove our tty objects as devpts does all | 551 | /* We have no need to install and remove our tty objects as devpts does all |
508 | the work for us */ | 552 | the work for us */ |
509 | 553 | ||
510 | static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) | 554 | static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) |
511 | { | 555 | { |
512 | struct tty_struct *o_tty; | 556 | return pty_common_install(driver, tty, false); |
513 | int idx = tty->index; | ||
514 | |||
515 | o_tty = alloc_tty_struct(); | ||
516 | if (!o_tty) | ||
517 | return -ENOMEM; | ||
518 | if (!try_module_get(driver->other->owner)) { | ||
519 | /* This cannot in fact currently happen */ | ||
520 | goto err_free_tty; | ||
521 | } | ||
522 | initialize_tty_struct(o_tty, driver->other, idx); | ||
523 | |||
524 | tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); | ||
525 | if (tty->termios == NULL) | ||
526 | goto err_free_mem; | ||
527 | *tty->termios = driver->init_termios; | ||
528 | tty->termios_locked = tty->termios + 1; | ||
529 | |||
530 | o_tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); | ||
531 | if (o_tty->termios == NULL) | ||
532 | goto err_free_mem; | ||
533 | *o_tty->termios = driver->other->init_termios; | ||
534 | o_tty->termios_locked = o_tty->termios + 1; | ||
535 | |||
536 | tty_driver_kref_get(driver->other); | ||
537 | if (driver->subtype == PTY_TYPE_MASTER) | ||
538 | o_tty->count++; | ||
539 | /* Establish the links in both directions */ | ||
540 | tty->link = o_tty; | ||
541 | o_tty->link = tty; | ||
542 | /* | ||
543 | * All structures have been allocated, so now we install them. | ||
544 | * Failures after this point use release_tty to clean up, so | ||
545 | * there's no need to null out the local pointers. | ||
546 | */ | ||
547 | tty_driver_kref_get(driver); | ||
548 | tty->count++; | ||
549 | return 0; | ||
550 | err_free_mem: | ||
551 | deinitialize_tty_struct(o_tty); | ||
552 | kfree(o_tty->termios); | ||
553 | kfree(tty->termios); | ||
554 | module_put(o_tty->driver->owner); | ||
555 | err_free_tty: | ||
556 | free_tty_struct(o_tty); | ||
557 | return -ENOMEM; | ||
558 | } | ||
559 | |||
560 | static void ptm_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) | ||
561 | { | ||
562 | } | 557 | } |
563 | 558 | ||
564 | static void pts_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) | 559 | static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) |
565 | { | 560 | { |
566 | } | 561 | } |
567 | 562 | ||
568 | static const struct tty_operations ptm_unix98_ops = { | 563 | static const struct tty_operations ptm_unix98_ops = { |
569 | .lookup = ptm_unix98_lookup, | 564 | .lookup = ptm_unix98_lookup, |
570 | .install = pty_unix98_install, | 565 | .install = pty_unix98_install, |
571 | .remove = ptm_unix98_remove, | 566 | .remove = pty_unix98_remove, |
572 | .open = pty_open, | 567 | .open = pty_open, |
573 | .close = pty_close, | 568 | .close = pty_close, |
574 | .write = pty_write, | 569 | .write = pty_write, |
@@ -578,14 +573,14 @@ static const struct tty_operations ptm_unix98_ops = { | |||
578 | .unthrottle = pty_unthrottle, | 573 | .unthrottle = pty_unthrottle, |
579 | .set_termios = pty_set_termios, | 574 | .set_termios = pty_set_termios, |
580 | .ioctl = pty_unix98_ioctl, | 575 | .ioctl = pty_unix98_ioctl, |
581 | .shutdown = pty_unix98_shutdown, | 576 | .resize = pty_resize, |
582 | .resize = pty_resize | 577 | .cleanup = pty_cleanup |
583 | }; | 578 | }; |
584 | 579 | ||
585 | static const struct tty_operations pty_unix98_ops = { | 580 | static const struct tty_operations pty_unix98_ops = { |
586 | .lookup = pts_unix98_lookup, | 581 | .lookup = pts_unix98_lookup, |
587 | .install = pty_unix98_install, | 582 | .install = pty_unix98_install, |
588 | .remove = pts_unix98_remove, | 583 | .remove = pty_unix98_remove, |
589 | .open = pty_open, | 584 | .open = pty_open, |
590 | .close = pty_close, | 585 | .close = pty_close, |
591 | .write = pty_write, | 586 | .write = pty_write, |
@@ -594,7 +589,7 @@ static const struct tty_operations pty_unix98_ops = { | |||
594 | .chars_in_buffer = pty_chars_in_buffer, | 589 | .chars_in_buffer = pty_chars_in_buffer, |
595 | .unthrottle = pty_unthrottle, | 590 | .unthrottle = pty_unthrottle, |
596 | .set_termios = pty_set_termios, | 591 | .set_termios = pty_set_termios, |
597 | .shutdown = pty_unix98_shutdown | 592 | .cleanup = pty_cleanup, |
598 | }; | 593 | }; |
599 | 594 | ||
600 | /** | 595 | /** |
diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c index 777d5f9cf6cc..016984a460e0 100644 --- a/drivers/tty/rocket.c +++ b/drivers/tty/rocket.c | |||
@@ -720,7 +720,7 @@ static void configure_r_port(struct tty_struct *tty, struct r_port *info, | |||
720 | unsigned rocketMode; | 720 | unsigned rocketMode; |
721 | int bits, baud, divisor; | 721 | int bits, baud, divisor; |
722 | CHANNEL_t *cp; | 722 | CHANNEL_t *cp; |
723 | struct ktermios *t = tty->termios; | 723 | struct ktermios *t = &tty->termios; |
724 | 724 | ||
725 | cp = &info->channel; | 725 | cp = &info->channel; |
726 | cflag = t->c_cflag; | 726 | cflag = t->c_cflag; |
@@ -978,7 +978,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp) | |||
978 | tty->alt_speed = 460800; | 978 | tty->alt_speed = 460800; |
979 | 979 | ||
980 | configure_r_port(tty, info, NULL); | 980 | configure_r_port(tty, info, NULL); |
981 | if (tty->termios->c_cflag & CBAUD) { | 981 | if (tty->termios.c_cflag & CBAUD) { |
982 | sSetDTR(cp); | 982 | sSetDTR(cp); |
983 | sSetRTS(cp); | 983 | sSetRTS(cp); |
984 | } | 984 | } |
@@ -1089,35 +1089,35 @@ static void rp_set_termios(struct tty_struct *tty, | |||
1089 | if (rocket_paranoia_check(info, "rp_set_termios")) | 1089 | if (rocket_paranoia_check(info, "rp_set_termios")) |
1090 | return; | 1090 | return; |
1091 | 1091 | ||
1092 | cflag = tty->termios->c_cflag; | 1092 | cflag = tty->termios.c_cflag; |
1093 | 1093 | ||
1094 | /* | 1094 | /* |
1095 | * This driver doesn't support CS5 or CS6 | 1095 | * This driver doesn't support CS5 or CS6 |
1096 | */ | 1096 | */ |
1097 | if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6)) | 1097 | if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6)) |
1098 | tty->termios->c_cflag = | 1098 | tty->termios.c_cflag = |
1099 | ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE)); | 1099 | ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE)); |
1100 | /* Or CMSPAR */ | 1100 | /* Or CMSPAR */ |
1101 | tty->termios->c_cflag &= ~CMSPAR; | 1101 | tty->termios.c_cflag &= ~CMSPAR; |
1102 | 1102 | ||
1103 | configure_r_port(tty, info, old_termios); | 1103 | configure_r_port(tty, info, old_termios); |
1104 | 1104 | ||
1105 | cp = &info->channel; | 1105 | cp = &info->channel; |
1106 | 1106 | ||
1107 | /* Handle transition to B0 status */ | 1107 | /* Handle transition to B0 status */ |
1108 | if ((old_termios->c_cflag & CBAUD) && !(tty->termios->c_cflag & CBAUD)) { | 1108 | if ((old_termios->c_cflag & CBAUD) && !(tty->termios.c_cflag & CBAUD)) { |
1109 | sClrDTR(cp); | 1109 | sClrDTR(cp); |
1110 | sClrRTS(cp); | 1110 | sClrRTS(cp); |
1111 | } | 1111 | } |
1112 | 1112 | ||
1113 | /* Handle transition away from B0 status */ | 1113 | /* Handle transition away from B0 status */ |
1114 | if (!(old_termios->c_cflag & CBAUD) && (tty->termios->c_cflag & CBAUD)) { | 1114 | if (!(old_termios->c_cflag & CBAUD) && (tty->termios.c_cflag & CBAUD)) { |
1115 | if (!tty->hw_stopped || !(tty->termios->c_cflag & CRTSCTS)) | 1115 | if (!tty->hw_stopped || !(tty->termios.c_cflag & CRTSCTS)) |
1116 | sSetRTS(cp); | 1116 | sSetRTS(cp); |
1117 | sSetDTR(cp); | 1117 | sSetDTR(cp); |
1118 | } | 1118 | } |
1119 | 1119 | ||
1120 | if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) { | 1120 | if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios.c_cflag & CRTSCTS)) { |
1121 | tty->hw_stopped = 0; | 1121 | tty->hw_stopped = 0; |
1122 | rp_start(tty); | 1122 | rp_start(tty); |
1123 | } | 1123 | } |
diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c index 8123f784bcda..44f52c6f15b9 100644 --- a/drivers/tty/serial/8250/8250.c +++ b/drivers/tty/serial/8250/8250.c | |||
@@ -2202,6 +2202,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, | |||
2202 | unsigned char cval, fcr = 0; | 2202 | unsigned char cval, fcr = 0; |
2203 | unsigned long flags; | 2203 | unsigned long flags; |
2204 | unsigned int baud, quot; | 2204 | unsigned int baud, quot; |
2205 | int fifo_bug = 0; | ||
2205 | 2206 | ||
2206 | switch (termios->c_cflag & CSIZE) { | 2207 | switch (termios->c_cflag & CSIZE) { |
2207 | case CS5: | 2208 | case CS5: |
@@ -2221,8 +2222,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, | |||
2221 | 2222 | ||
2222 | if (termios->c_cflag & CSTOPB) | 2223 | if (termios->c_cflag & CSTOPB) |
2223 | cval |= UART_LCR_STOP; | 2224 | cval |= UART_LCR_STOP; |
2224 | if (termios->c_cflag & PARENB) | 2225 | if (termios->c_cflag & PARENB) { |
2225 | cval |= UART_LCR_PARITY; | 2226 | cval |= UART_LCR_PARITY; |
2227 | if (up->bugs & UART_BUG_PARITY) | ||
2228 | fifo_bug = 1; | ||
2229 | } | ||
2226 | if (!(termios->c_cflag & PARODD)) | 2230 | if (!(termios->c_cflag & PARODD)) |
2227 | cval |= UART_LCR_EPAR; | 2231 | cval |= UART_LCR_EPAR; |
2228 | #ifdef CMSPAR | 2232 | #ifdef CMSPAR |
@@ -2246,7 +2250,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, | |||
2246 | 2250 | ||
2247 | if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) { | 2251 | if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) { |
2248 | fcr = uart_config[port->type].fcr; | 2252 | fcr = uart_config[port->type].fcr; |
2249 | if (baud < 2400) { | 2253 | if (baud < 2400 || fifo_bug) { |
2250 | fcr &= ~UART_FCR_TRIGGER_MASK; | 2254 | fcr &= ~UART_FCR_TRIGGER_MASK; |
2251 | fcr |= UART_FCR_TRIGGER_1; | 2255 | fcr |= UART_FCR_TRIGGER_1; |
2252 | } | 2256 | } |
@@ -2979,36 +2983,36 @@ void serial8250_resume_port(int line) | |||
2979 | static int __devinit serial8250_probe(struct platform_device *dev) | 2983 | static int __devinit serial8250_probe(struct platform_device *dev) |
2980 | { | 2984 | { |
2981 | struct plat_serial8250_port *p = dev->dev.platform_data; | 2985 | struct plat_serial8250_port *p = dev->dev.platform_data; |
2982 | struct uart_port port; | 2986 | struct uart_8250_port uart; |
2983 | int ret, i, irqflag = 0; | 2987 | int ret, i, irqflag = 0; |
2984 | 2988 | ||
2985 | memset(&port, 0, sizeof(struct uart_port)); | 2989 | memset(&uart, 0, sizeof(uart)); |
2986 | 2990 | ||
2987 | if (share_irqs) | 2991 | if (share_irqs) |
2988 | irqflag = IRQF_SHARED; | 2992 | irqflag = IRQF_SHARED; |
2989 | 2993 | ||
2990 | for (i = 0; p && p->flags != 0; p++, i++) { | 2994 | for (i = 0; p && p->flags != 0; p++, i++) { |
2991 | port.iobase = p->iobase; | 2995 | uart.port.iobase = p->iobase; |
2992 | port.membase = p->membase; | 2996 | uart.port.membase = p->membase; |
2993 | port.irq = p->irq; | 2997 | uart.port.irq = p->irq; |
2994 | port.irqflags = p->irqflags; | 2998 | uart.port.irqflags = p->irqflags; |
2995 | port.uartclk = p->uartclk; | 2999 | uart.port.uartclk = p->uartclk; |
2996 | port.regshift = p->regshift; | 3000 | uart.port.regshift = p->regshift; |
2997 | port.iotype = p->iotype; | 3001 | uart.port.iotype = p->iotype; |
2998 | port.flags = p->flags; | 3002 | uart.port.flags = p->flags; |
2999 | port.mapbase = p->mapbase; | 3003 | uart.port.mapbase = p->mapbase; |
3000 | port.hub6 = p->hub6; | 3004 | uart.port.hub6 = p->hub6; |
3001 | port.private_data = p->private_data; | 3005 | uart.port.private_data = p->private_data; |
3002 | port.type = p->type; | 3006 | uart.port.type = p->type; |
3003 | port.serial_in = p->serial_in; | 3007 | uart.port.serial_in = p->serial_in; |
3004 | port.serial_out = p->serial_out; | 3008 | uart.port.serial_out = p->serial_out; |
3005 | port.handle_irq = p->handle_irq; | 3009 | uart.port.handle_irq = p->handle_irq; |
3006 | port.handle_break = p->handle_break; | 3010 | uart.port.handle_break = p->handle_break; |
3007 | port.set_termios = p->set_termios; | 3011 | uart.port.set_termios = p->set_termios; |
3008 | port.pm = p->pm; | 3012 | uart.port.pm = p->pm; |
3009 | port.dev = &dev->dev; | 3013 | uart.port.dev = &dev->dev; |
3010 | port.irqflags |= irqflag; | 3014 | uart.port.irqflags |= irqflag; |
3011 | ret = serial8250_register_port(&port); | 3015 | ret = serial8250_register_8250_port(&uart); |
3012 | if (ret < 0) { | 3016 | if (ret < 0) { |
3013 | dev_err(&dev->dev, "unable to register port at index %d " | 3017 | dev_err(&dev->dev, "unable to register port at index %d " |
3014 | "(IO%lx MEM%llx IRQ%d): %d\n", i, | 3018 | "(IO%lx MEM%llx IRQ%d): %d\n", i, |
@@ -3081,7 +3085,7 @@ static struct platform_driver serial8250_isa_driver = { | |||
3081 | static struct platform_device *serial8250_isa_devs; | 3085 | static struct platform_device *serial8250_isa_devs; |
3082 | 3086 | ||
3083 | /* | 3087 | /* |
3084 | * serial8250_register_port and serial8250_unregister_port allows for | 3088 | * serial8250_register_8250_port and serial8250_unregister_port allows for |
3085 | * 16x50 serial ports to be configured at run-time, to support PCMCIA | 3089 | * 16x50 serial ports to be configured at run-time, to support PCMCIA |
3086 | * modems and PCI multiport cards. | 3090 | * modems and PCI multiport cards. |
3087 | */ | 3091 | */ |
@@ -3155,6 +3159,7 @@ int serial8250_register_8250_port(struct uart_8250_port *up) | |||
3155 | uart->port.regshift = up->port.regshift; | 3159 | uart->port.regshift = up->port.regshift; |
3156 | uart->port.iotype = up->port.iotype; | 3160 | uart->port.iotype = up->port.iotype; |
3157 | uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF; | 3161 | uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF; |
3162 | uart->bugs = up->bugs; | ||
3158 | uart->port.mapbase = up->port.mapbase; | 3163 | uart->port.mapbase = up->port.mapbase; |
3159 | uart->port.private_data = up->port.private_data; | 3164 | uart->port.private_data = up->port.private_data; |
3160 | if (up->port.dev) | 3165 | if (up->port.dev) |
@@ -3198,29 +3203,6 @@ int serial8250_register_8250_port(struct uart_8250_port *up) | |||
3198 | EXPORT_SYMBOL(serial8250_register_8250_port); | 3203 | EXPORT_SYMBOL(serial8250_register_8250_port); |
3199 | 3204 | ||
3200 | /** | 3205 | /** |
3201 | * serial8250_register_port - register a serial port | ||
3202 | * @port: serial port template | ||
3203 | * | ||
3204 | * Configure the serial port specified by the request. If the | ||
3205 | * port exists and is in use, it is hung up and unregistered | ||
3206 | * first. | ||
3207 | * | ||
3208 | * The port is then probed and if necessary the IRQ is autodetected | ||
3209 | * If this fails an error is returned. | ||
3210 | * | ||
3211 | * On success the port is ready to use and the line number is returned. | ||
3212 | */ | ||
3213 | int serial8250_register_port(struct uart_port *port) | ||
3214 | { | ||
3215 | struct uart_8250_port up; | ||
3216 | |||
3217 | memset(&up, 0, sizeof(up)); | ||
3218 | memcpy(&up.port, port, sizeof(*port)); | ||
3219 | return serial8250_register_8250_port(&up); | ||
3220 | } | ||
3221 | EXPORT_SYMBOL(serial8250_register_port); | ||
3222 | |||
3223 | /** | ||
3224 | * serial8250_unregister_port - remove a 16x50 serial port at runtime | 3206 | * serial8250_unregister_port - remove a 16x50 serial port at runtime |
3225 | * @line: serial line number | 3207 | * @line: serial line number |
3226 | * | 3208 | * |
diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h index f9719d167c8d..972b5212b58c 100644 --- a/drivers/tty/serial/8250/8250.h +++ b/drivers/tty/serial/8250/8250.h | |||
@@ -13,36 +13,6 @@ | |||
13 | 13 | ||
14 | #include <linux/serial_8250.h> | 14 | #include <linux/serial_8250.h> |
15 | 15 | ||
16 | struct uart_8250_port { | ||
17 | struct uart_port port; | ||
18 | struct timer_list timer; /* "no irq" timer */ | ||
19 | struct list_head list; /* ports on this IRQ */ | ||
20 | unsigned short capabilities; /* port capabilities */ | ||
21 | unsigned short bugs; /* port bugs */ | ||
22 | unsigned int tx_loadsz; /* transmit fifo load size */ | ||
23 | unsigned char acr; | ||
24 | unsigned char ier; | ||
25 | unsigned char lcr; | ||
26 | unsigned char mcr; | ||
27 | unsigned char mcr_mask; /* mask of user bits */ | ||
28 | unsigned char mcr_force; /* mask of forced bits */ | ||
29 | unsigned char cur_iotype; /* Running I/O type */ | ||
30 | |||
31 | /* | ||
32 | * Some bits in registers are cleared on a read, so they must | ||
33 | * be saved whenever the register is read but the bits will not | ||
34 | * be immediately processed. | ||
35 | */ | ||
36 | #define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS | ||
37 | unsigned char lsr_saved_flags; | ||
38 | #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA | ||
39 | unsigned char msr_saved_flags; | ||
40 | |||
41 | /* 8250 specific callbacks */ | ||
42 | int (*dl_read)(struct uart_8250_port *); | ||
43 | void (*dl_write)(struct uart_8250_port *, int); | ||
44 | }; | ||
45 | |||
46 | struct old_serial_port { | 16 | struct old_serial_port { |
47 | unsigned int uart; | 17 | unsigned int uart; |
48 | unsigned int baud_base; | 18 | unsigned int baud_base; |
@@ -78,6 +48,7 @@ struct serial8250_config { | |||
78 | #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ | 48 | #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ |
79 | #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ | 49 | #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ |
80 | #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ | 50 | #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ |
51 | #define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */ | ||
81 | 52 | ||
82 | #define PROBE_RSA (1 << 0) | 53 | #define PROBE_RSA (1 << 0) |
83 | #define PROBE_ANY (~0) | 54 | #define PROBE_ANY (~0) |
diff --git a/drivers/tty/serial/8250/8250_acorn.c b/drivers/tty/serial/8250/8250_acorn.c index b0ce8c56f1a4..857498312a9a 100644 --- a/drivers/tty/serial/8250/8250_acorn.c +++ b/drivers/tty/serial/8250/8250_acorn.c | |||
@@ -43,7 +43,7 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
43 | { | 43 | { |
44 | struct serial_card_info *info; | 44 | struct serial_card_info *info; |
45 | struct serial_card_type *type = id->data; | 45 | struct serial_card_type *type = id->data; |
46 | struct uart_port port; | 46 | struct uart_8250_port uart; |
47 | unsigned long bus_addr; | 47 | unsigned long bus_addr; |
48 | unsigned int i; | 48 | unsigned int i; |
49 | 49 | ||
@@ -62,19 +62,19 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
62 | 62 | ||
63 | ecard_set_drvdata(ec, info); | 63 | ecard_set_drvdata(ec, info); |
64 | 64 | ||
65 | memset(&port, 0, sizeof(struct uart_port)); | 65 | memset(&uart, 0, sizeof(struct uart_8250_port)); |
66 | port.irq = ec->irq; | 66 | uart.port.irq = ec->irq; |
67 | port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | 67 | uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; |
68 | port.uartclk = type->uartclk; | 68 | uart.port.uartclk = type->uartclk; |
69 | port.iotype = UPIO_MEM; | 69 | uart.port.iotype = UPIO_MEM; |
70 | port.regshift = 2; | 70 | uart.port.regshift = 2; |
71 | port.dev = &ec->dev; | 71 | uart.port.dev = &ec->dev; |
72 | 72 | ||
73 | for (i = 0; i < info->num_ports; i ++) { | 73 | for (i = 0; i < info->num_ports; i ++) { |
74 | port.membase = info->vaddr + type->offset[i]; | 74 | uart.port.membase = info->vaddr + type->offset[i]; |
75 | port.mapbase = bus_addr + type->offset[i]; | 75 | uart.port.mapbase = bus_addr + type->offset[i]; |
76 | 76 | ||
77 | info->ports[i] = serial8250_register_port(&port); | 77 | info->ports[i] = serial8250_register_8250_port(&uart); |
78 | } | 78 | } |
79 | 79 | ||
80 | return 0; | 80 | return 0; |
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index f574eef3075f..c3b2ec0c8c0b 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c | |||
@@ -89,7 +89,7 @@ static int dw8250_handle_irq(struct uart_port *p) | |||
89 | 89 | ||
90 | static int __devinit dw8250_probe(struct platform_device *pdev) | 90 | static int __devinit dw8250_probe(struct platform_device *pdev) |
91 | { | 91 | { |
92 | struct uart_port port = {}; | 92 | struct uart_8250_port uart = {}; |
93 | struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 93 | struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
94 | struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 94 | struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
95 | struct device_node *np = pdev->dev.of_node; | 95 | struct device_node *np = pdev->dev.of_node; |
@@ -104,28 +104,28 @@ static int __devinit dw8250_probe(struct platform_device *pdev) | |||
104 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); | 104 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); |
105 | if (!data) | 105 | if (!data) |
106 | return -ENOMEM; | 106 | return -ENOMEM; |
107 | port.private_data = data; | 107 | uart.port.private_data = data; |
108 | 108 | ||
109 | spin_lock_init(&port.lock); | 109 | spin_lock_init(&uart.port.lock); |
110 | port.mapbase = regs->start; | 110 | uart.port.mapbase = regs->start; |
111 | port.irq = irq->start; | 111 | uart.port.irq = irq->start; |
112 | port.handle_irq = dw8250_handle_irq; | 112 | uart.port.handle_irq = dw8250_handle_irq; |
113 | port.type = PORT_8250; | 113 | uart.port.type = PORT_8250; |
114 | port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | | 114 | uart.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | |
115 | UPF_FIXED_PORT | UPF_FIXED_TYPE; | 115 | UPF_FIXED_PORT | UPF_FIXED_TYPE; |
116 | port.dev = &pdev->dev; | 116 | uart.port.dev = &pdev->dev; |
117 | 117 | ||
118 | port.iotype = UPIO_MEM; | 118 | uart.port.iotype = UPIO_MEM; |
119 | port.serial_in = dw8250_serial_in; | 119 | uart.port.serial_in = dw8250_serial_in; |
120 | port.serial_out = dw8250_serial_out; | 120 | uart.port.serial_out = dw8250_serial_out; |
121 | if (!of_property_read_u32(np, "reg-io-width", &val)) { | 121 | if (!of_property_read_u32(np, "reg-io-width", &val)) { |
122 | switch (val) { | 122 | switch (val) { |
123 | case 1: | 123 | case 1: |
124 | break; | 124 | break; |
125 | case 4: | 125 | case 4: |
126 | port.iotype = UPIO_MEM32; | 126 | uart.port.iotype = UPIO_MEM32; |
127 | port.serial_in = dw8250_serial_in32; | 127 | uart.port.serial_in = dw8250_serial_in32; |
128 | port.serial_out = dw8250_serial_out32; | 128 | uart.port.serial_out = dw8250_serial_out32; |
129 | break; | 129 | break; |
130 | default: | 130 | default: |
131 | dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n", | 131 | dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n", |
@@ -135,15 +135,15 @@ static int __devinit dw8250_probe(struct platform_device *pdev) | |||
135 | } | 135 | } |
136 | 136 | ||
137 | if (!of_property_read_u32(np, "reg-shift", &val)) | 137 | if (!of_property_read_u32(np, "reg-shift", &val)) |
138 | port.regshift = val; | 138 | uart.port.regshift = val; |
139 | 139 | ||
140 | if (of_property_read_u32(np, "clock-frequency", &val)) { | 140 | if (of_property_read_u32(np, "clock-frequency", &val)) { |
141 | dev_err(&pdev->dev, "no clock-frequency property set\n"); | 141 | dev_err(&pdev->dev, "no clock-frequency property set\n"); |
142 | return -EINVAL; | 142 | return -EINVAL; |
143 | } | 143 | } |
144 | port.uartclk = val; | 144 | uart.port.uartclk = val; |
145 | 145 | ||
146 | data->line = serial8250_register_port(&port); | 146 | data->line = serial8250_register_8250_port(&uart); |
147 | if (data->line < 0) | 147 | if (data->line < 0) |
148 | return data->line; | 148 | return data->line; |
149 | 149 | ||
diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c index d8c0ffbfa6e3..097dff9c08ad 100644 --- a/drivers/tty/serial/8250/8250_gsc.c +++ b/drivers/tty/serial/8250/8250_gsc.c | |||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | static int __init serial_init_chip(struct parisc_device *dev) | 27 | static int __init serial_init_chip(struct parisc_device *dev) |
28 | { | 28 | { |
29 | struct uart_port port; | 29 | struct uart_8250_port uart; |
30 | unsigned long address; | 30 | unsigned long address; |
31 | int err; | 31 | int err; |
32 | 32 | ||
@@ -48,21 +48,21 @@ static int __init serial_init_chip(struct parisc_device *dev) | |||
48 | if (dev->id.sversion != 0x8d) | 48 | if (dev->id.sversion != 0x8d) |
49 | address += 0x800; | 49 | address += 0x800; |
50 | 50 | ||
51 | memset(&port, 0, sizeof(port)); | 51 | memset(&uart, 0, sizeof(uart)); |
52 | port.iotype = UPIO_MEM; | 52 | uart.port.iotype = UPIO_MEM; |
53 | /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ | 53 | /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ |
54 | port.uartclk = 7272727; | 54 | uart.port.uartclk = 7272727; |
55 | port.mapbase = address; | 55 | uart.port.mapbase = address; |
56 | port.membase = ioremap_nocache(address, 16); | 56 | uart.port.membase = ioremap_nocache(address, 16); |
57 | port.irq = dev->irq; | 57 | uart.port.irq = dev->irq; |
58 | port.flags = UPF_BOOT_AUTOCONF; | 58 | uart.port.flags = UPF_BOOT_AUTOCONF; |
59 | port.dev = &dev->dev; | 59 | uart.port.dev = &dev->dev; |
60 | 60 | ||
61 | err = serial8250_register_port(&port); | 61 | err = serial8250_register_8250_port(&uart); |
62 | if (err < 0) { | 62 | if (err < 0) { |
63 | printk(KERN_WARNING | 63 | printk(KERN_WARNING |
64 | "serial8250_register_port returned error %d\n", err); | 64 | "serial8250_register_8250_port returned error %d\n", err); |
65 | iounmap(port.membase); | 65 | iounmap(uart.port.membase); |
66 | return err; | 66 | return err; |
67 | } | 67 | } |
68 | 68 | ||
diff --git a/drivers/tty/serial/8250/8250_hp300.c b/drivers/tty/serial/8250/8250_hp300.c index c13438c93012..8f1dd2cc00a8 100644 --- a/drivers/tty/serial/8250/8250_hp300.c +++ b/drivers/tty/serial/8250/8250_hp300.c | |||
@@ -171,7 +171,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d, | |||
171 | return 0; | 171 | return 0; |
172 | } | 172 | } |
173 | #endif | 173 | #endif |
174 | memset(&port, 0, sizeof(struct uart_port)); | 174 | memset(&uart, 0, sizeof(uart)); |
175 | 175 | ||
176 | /* Memory mapped I/O */ | 176 | /* Memory mapped I/O */ |
177 | port.iotype = UPIO_MEM; | 177 | port.iotype = UPIO_MEM; |
@@ -182,7 +182,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d, | |||
182 | port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE); | 182 | port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE); |
183 | port.regshift = 1; | 183 | port.regshift = 1; |
184 | port.dev = &d->dev; | 184 | port.dev = &d->dev; |
185 | line = serial8250_register_port(&port); | 185 | line = serial8250_register_8250_port(&uart); |
186 | 186 | ||
187 | if (line < 0) { | 187 | if (line < 0) { |
188 | printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d" | 188 | printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d" |
@@ -210,7 +210,7 @@ static int __init hp300_8250_init(void) | |||
210 | #ifdef CONFIG_HPAPCI | 210 | #ifdef CONFIG_HPAPCI |
211 | int line; | 211 | int line; |
212 | unsigned long base; | 212 | unsigned long base; |
213 | struct uart_port uport; | 213 | struct uart_8250_port uart; |
214 | struct hp300_port *port; | 214 | struct hp300_port *port; |
215 | int i; | 215 | int i; |
216 | #endif | 216 | #endif |
@@ -248,26 +248,26 @@ static int __init hp300_8250_init(void) | |||
248 | if (!port) | 248 | if (!port) |
249 | return -ENOMEM; | 249 | return -ENOMEM; |
250 | 250 | ||
251 | memset(&uport, 0, sizeof(struct uart_port)); | 251 | memset(&uart, 0, sizeof(uart)); |
252 | 252 | ||
253 | base = (FRODO_BASE + FRODO_APCI_OFFSET(i)); | 253 | base = (FRODO_BASE + FRODO_APCI_OFFSET(i)); |
254 | 254 | ||
255 | /* Memory mapped I/O */ | 255 | /* Memory mapped I/O */ |
256 | uport.iotype = UPIO_MEM; | 256 | uart.port.iotype = UPIO_MEM; |
257 | uport.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \ | 257 | uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \ |
258 | | UPF_BOOT_AUTOCONF; | 258 | | UPF_BOOT_AUTOCONF; |
259 | /* XXX - no interrupt support yet */ | 259 | /* XXX - no interrupt support yet */ |
260 | uport.irq = 0; | 260 | uart.port.irq = 0; |
261 | uport.uartclk = HPAPCI_BAUD_BASE * 16; | 261 | uart.port.uartclk = HPAPCI_BAUD_BASE * 16; |
262 | uport.mapbase = base; | 262 | uart.port.mapbase = base; |
263 | uport.membase = (char *)(base + DIO_VIRADDRBASE); | 263 | uart.port.membase = (char *)(base + DIO_VIRADDRBASE); |
264 | uport.regshift = 2; | 264 | uart.port.regshift = 2; |
265 | 265 | ||
266 | line = serial8250_register_port(&uport); | 266 | line = serial8250_register_8250_port(&uart); |
267 | 267 | ||
268 | if (line < 0) { | 268 | if (line < 0) { |
269 | printk(KERN_NOTICE "8250_hp300: register_serial() APCI" | 269 | printk(KERN_NOTICE "8250_hp300: register_serial() APCI" |
270 | " %d irq %d failed\n", i, uport.irq); | 270 | " %d irq %d failed\n", i, uart.port.irq); |
271 | kfree(port); | 271 | kfree(port); |
272 | continue; | 272 | continue; |
273 | } | 273 | } |
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index 28e7c7cce893..62e10fe747a8 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c | |||
@@ -44,7 +44,7 @@ struct pci_serial_quirk { | |||
44 | int (*init)(struct pci_dev *dev); | 44 | int (*init)(struct pci_dev *dev); |
45 | int (*setup)(struct serial_private *, | 45 | int (*setup)(struct serial_private *, |
46 | const struct pciserial_board *, | 46 | const struct pciserial_board *, |
47 | struct uart_port *, int); | 47 | struct uart_8250_port *, int); |
48 | void (*exit)(struct pci_dev *dev); | 48 | void (*exit)(struct pci_dev *dev); |
49 | }; | 49 | }; |
50 | 50 | ||
@@ -59,7 +59,7 @@ struct serial_private { | |||
59 | }; | 59 | }; |
60 | 60 | ||
61 | static int pci_default_setup(struct serial_private*, | 61 | static int pci_default_setup(struct serial_private*, |
62 | const struct pciserial_board*, struct uart_port*, int); | 62 | const struct pciserial_board*, struct uart_8250_port *, int); |
63 | 63 | ||
64 | static void moan_device(const char *str, struct pci_dev *dev) | 64 | static void moan_device(const char *str, struct pci_dev *dev) |
65 | { | 65 | { |
@@ -74,7 +74,7 @@ static void moan_device(const char *str, struct pci_dev *dev) | |||
74 | } | 74 | } |
75 | 75 | ||
76 | static int | 76 | static int |
77 | setup_port(struct serial_private *priv, struct uart_port *port, | 77 | setup_port(struct serial_private *priv, struct uart_8250_port *port, |
78 | int bar, int offset, int regshift) | 78 | int bar, int offset, int regshift) |
79 | { | 79 | { |
80 | struct pci_dev *dev = priv->dev; | 80 | struct pci_dev *dev = priv->dev; |
@@ -93,17 +93,17 @@ setup_port(struct serial_private *priv, struct uart_port *port, | |||
93 | if (!priv->remapped_bar[bar]) | 93 | if (!priv->remapped_bar[bar]) |
94 | return -ENOMEM; | 94 | return -ENOMEM; |
95 | 95 | ||
96 | port->iotype = UPIO_MEM; | 96 | port->port.iotype = UPIO_MEM; |
97 | port->iobase = 0; | 97 | port->port.iobase = 0; |
98 | port->mapbase = base + offset; | 98 | port->port.mapbase = base + offset; |
99 | port->membase = priv->remapped_bar[bar] + offset; | 99 | port->port.membase = priv->remapped_bar[bar] + offset; |
100 | port->regshift = regshift; | 100 | port->port.regshift = regshift; |
101 | } else { | 101 | } else { |
102 | port->iotype = UPIO_PORT; | 102 | port->port.iotype = UPIO_PORT; |
103 | port->iobase = base + offset; | 103 | port->port.iobase = base + offset; |
104 | port->mapbase = 0; | 104 | port->port.mapbase = 0; |
105 | port->membase = NULL; | 105 | port->port.membase = NULL; |
106 | port->regshift = 0; | 106 | port->port.regshift = 0; |
107 | } | 107 | } |
108 | return 0; | 108 | return 0; |
109 | } | 109 | } |
@@ -113,7 +113,7 @@ setup_port(struct serial_private *priv, struct uart_port *port, | |||
113 | */ | 113 | */ |
114 | static int addidata_apci7800_setup(struct serial_private *priv, | 114 | static int addidata_apci7800_setup(struct serial_private *priv, |
115 | const struct pciserial_board *board, | 115 | const struct pciserial_board *board, |
116 | struct uart_port *port, int idx) | 116 | struct uart_8250_port *port, int idx) |
117 | { | 117 | { |
118 | unsigned int bar = 0, offset = board->first_offset; | 118 | unsigned int bar = 0, offset = board->first_offset; |
119 | bar = FL_GET_BASE(board->flags); | 119 | bar = FL_GET_BASE(board->flags); |
@@ -140,7 +140,7 @@ static int addidata_apci7800_setup(struct serial_private *priv, | |||
140 | */ | 140 | */ |
141 | static int | 141 | static int |
142 | afavlab_setup(struct serial_private *priv, const struct pciserial_board *board, | 142 | afavlab_setup(struct serial_private *priv, const struct pciserial_board *board, |
143 | struct uart_port *port, int idx) | 143 | struct uart_8250_port *port, int idx) |
144 | { | 144 | { |
145 | unsigned int bar, offset = board->first_offset; | 145 | unsigned int bar, offset = board->first_offset; |
146 | 146 | ||
@@ -195,7 +195,7 @@ static int pci_hp_diva_init(struct pci_dev *dev) | |||
195 | static int | 195 | static int |
196 | pci_hp_diva_setup(struct serial_private *priv, | 196 | pci_hp_diva_setup(struct serial_private *priv, |
197 | const struct pciserial_board *board, | 197 | const struct pciserial_board *board, |
198 | struct uart_port *port, int idx) | 198 | struct uart_8250_port *port, int idx) |
199 | { | 199 | { |
200 | unsigned int offset = board->first_offset; | 200 | unsigned int offset = board->first_offset; |
201 | unsigned int bar = FL_GET_BASE(board->flags); | 201 | unsigned int bar = FL_GET_BASE(board->flags); |
@@ -370,7 +370,7 @@ static void __devexit pci_ni8430_exit(struct pci_dev *dev) | |||
370 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ | 370 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ |
371 | static int | 371 | static int |
372 | sbs_setup(struct serial_private *priv, const struct pciserial_board *board, | 372 | sbs_setup(struct serial_private *priv, const struct pciserial_board *board, |
373 | struct uart_port *port, int idx) | 373 | struct uart_8250_port *port, int idx) |
374 | { | 374 | { |
375 | unsigned int bar, offset = board->first_offset; | 375 | unsigned int bar, offset = board->first_offset; |
376 | 376 | ||
@@ -525,7 +525,7 @@ static int pci_siig_init(struct pci_dev *dev) | |||
525 | 525 | ||
526 | static int pci_siig_setup(struct serial_private *priv, | 526 | static int pci_siig_setup(struct serial_private *priv, |
527 | const struct pciserial_board *board, | 527 | const struct pciserial_board *board, |
528 | struct uart_port *port, int idx) | 528 | struct uart_8250_port *port, int idx) |
529 | { | 529 | { |
530 | unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0; | 530 | unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0; |
531 | 531 | ||
@@ -619,7 +619,7 @@ static int pci_timedia_init(struct pci_dev *dev) | |||
619 | static int | 619 | static int |
620 | pci_timedia_setup(struct serial_private *priv, | 620 | pci_timedia_setup(struct serial_private *priv, |
621 | const struct pciserial_board *board, | 621 | const struct pciserial_board *board, |
622 | struct uart_port *port, int idx) | 622 | struct uart_8250_port *port, int idx) |
623 | { | 623 | { |
624 | unsigned int bar = 0, offset = board->first_offset; | 624 | unsigned int bar = 0, offset = board->first_offset; |
625 | 625 | ||
@@ -653,7 +653,7 @@ pci_timedia_setup(struct serial_private *priv, | |||
653 | static int | 653 | static int |
654 | titan_400l_800l_setup(struct serial_private *priv, | 654 | titan_400l_800l_setup(struct serial_private *priv, |
655 | const struct pciserial_board *board, | 655 | const struct pciserial_board *board, |
656 | struct uart_port *port, int idx) | 656 | struct uart_8250_port *port, int idx) |
657 | { | 657 | { |
658 | unsigned int bar, offset = board->first_offset; | 658 | unsigned int bar, offset = board->first_offset; |
659 | 659 | ||
@@ -754,7 +754,7 @@ static int pci_ni8430_init(struct pci_dev *dev) | |||
754 | static int | 754 | static int |
755 | pci_ni8430_setup(struct serial_private *priv, | 755 | pci_ni8430_setup(struct serial_private *priv, |
756 | const struct pciserial_board *board, | 756 | const struct pciserial_board *board, |
757 | struct uart_port *port, int idx) | 757 | struct uart_8250_port *port, int idx) |
758 | { | 758 | { |
759 | void __iomem *p; | 759 | void __iomem *p; |
760 | unsigned long base, len; | 760 | unsigned long base, len; |
@@ -781,7 +781,7 @@ pci_ni8430_setup(struct serial_private *priv, | |||
781 | 781 | ||
782 | static int pci_netmos_9900_setup(struct serial_private *priv, | 782 | static int pci_netmos_9900_setup(struct serial_private *priv, |
783 | const struct pciserial_board *board, | 783 | const struct pciserial_board *board, |
784 | struct uart_port *port, int idx) | 784 | struct uart_8250_port *port, int idx) |
785 | { | 785 | { |
786 | unsigned int bar; | 786 | unsigned int bar; |
787 | 787 | ||
@@ -1032,10 +1032,17 @@ static int pci_oxsemi_tornado_init(struct pci_dev *dev) | |||
1032 | return number_uarts; | 1032 | return number_uarts; |
1033 | } | 1033 | } |
1034 | 1034 | ||
1035 | static int | 1035 | static int pci_asix_setup(struct serial_private *priv, |
1036 | pci_default_setup(struct serial_private *priv, | 1036 | const struct pciserial_board *board, |
1037 | struct uart_8250_port *port, int idx) | ||
1038 | { | ||
1039 | port->bugs |= UART_BUG_PARITY; | ||
1040 | return pci_default_setup(priv, board, port, idx); | ||
1041 | } | ||
1042 | |||
1043 | static int pci_default_setup(struct serial_private *priv, | ||
1037 | const struct pciserial_board *board, | 1044 | const struct pciserial_board *board, |
1038 | struct uart_port *port, int idx) | 1045 | struct uart_8250_port *port, int idx) |
1039 | { | 1046 | { |
1040 | unsigned int bar, offset = board->first_offset, maxnr; | 1047 | unsigned int bar, offset = board->first_offset, maxnr; |
1041 | 1048 | ||
@@ -1057,15 +1064,15 @@ pci_default_setup(struct serial_private *priv, | |||
1057 | static int | 1064 | static int |
1058 | ce4100_serial_setup(struct serial_private *priv, | 1065 | ce4100_serial_setup(struct serial_private *priv, |
1059 | const struct pciserial_board *board, | 1066 | const struct pciserial_board *board, |
1060 | struct uart_port *port, int idx) | 1067 | struct uart_8250_port *port, int idx) |
1061 | { | 1068 | { |
1062 | int ret; | 1069 | int ret; |
1063 | 1070 | ||
1064 | ret = setup_port(priv, port, 0, 0, board->reg_shift); | 1071 | ret = setup_port(priv, port, 0, 0, board->reg_shift); |
1065 | port->iotype = UPIO_MEM32; | 1072 | port->port.iotype = UPIO_MEM32; |
1066 | port->type = PORT_XSCALE; | 1073 | port->port.type = PORT_XSCALE; |
1067 | port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); | 1074 | port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); |
1068 | port->regshift = 2; | 1075 | port->port.regshift = 2; |
1069 | 1076 | ||
1070 | return ret; | 1077 | return ret; |
1071 | } | 1078 | } |
@@ -1073,16 +1080,16 @@ ce4100_serial_setup(struct serial_private *priv, | |||
1073 | static int | 1080 | static int |
1074 | pci_omegapci_setup(struct serial_private *priv, | 1081 | pci_omegapci_setup(struct serial_private *priv, |
1075 | const struct pciserial_board *board, | 1082 | const struct pciserial_board *board, |
1076 | struct uart_port *port, int idx) | 1083 | struct uart_8250_port *port, int idx) |
1077 | { | 1084 | { |
1078 | return setup_port(priv, port, 2, idx * 8, 0); | 1085 | return setup_port(priv, port, 2, idx * 8, 0); |
1079 | } | 1086 | } |
1080 | 1087 | ||
1081 | static int skip_tx_en_setup(struct serial_private *priv, | 1088 | static int skip_tx_en_setup(struct serial_private *priv, |
1082 | const struct pciserial_board *board, | 1089 | const struct pciserial_board *board, |
1083 | struct uart_port *port, int idx) | 1090 | struct uart_8250_port *port, int idx) |
1084 | { | 1091 | { |
1085 | port->flags |= UPF_NO_TXEN_TEST; | 1092 | port->port.flags |= UPF_NO_TXEN_TEST; |
1086 | printk(KERN_DEBUG "serial8250: skipping TxEn test for device " | 1093 | printk(KERN_DEBUG "serial8250: skipping TxEn test for device " |
1087 | "[%04x:%04x] subsystem [%04x:%04x]\n", | 1094 | "[%04x:%04x] subsystem [%04x:%04x]\n", |
1088 | priv->dev->vendor, | 1095 | priv->dev->vendor, |
@@ -1131,11 +1138,11 @@ static unsigned int kt_serial_in(struct uart_port *p, int offset) | |||
1131 | 1138 | ||
1132 | static int kt_serial_setup(struct serial_private *priv, | 1139 | static int kt_serial_setup(struct serial_private *priv, |
1133 | const struct pciserial_board *board, | 1140 | const struct pciserial_board *board, |
1134 | struct uart_port *port, int idx) | 1141 | struct uart_8250_port *port, int idx) |
1135 | { | 1142 | { |
1136 | port->flags |= UPF_BUG_THRE; | 1143 | port->port.flags |= UPF_BUG_THRE; |
1137 | port->serial_in = kt_serial_in; | 1144 | port->port.serial_in = kt_serial_in; |
1138 | port->handle_break = kt_handle_break; | 1145 | port->port.handle_break = kt_handle_break; |
1139 | return skip_tx_en_setup(priv, board, port, idx); | 1146 | return skip_tx_en_setup(priv, board, port, idx); |
1140 | } | 1147 | } |
1141 | 1148 | ||
@@ -1151,9 +1158,9 @@ static int pci_eg20t_init(struct pci_dev *dev) | |||
1151 | static int | 1158 | static int |
1152 | pci_xr17c154_setup(struct serial_private *priv, | 1159 | pci_xr17c154_setup(struct serial_private *priv, |
1153 | const struct pciserial_board *board, | 1160 | const struct pciserial_board *board, |
1154 | struct uart_port *port, int idx) | 1161 | struct uart_8250_port *port, int idx) |
1155 | { | 1162 | { |
1156 | port->flags |= UPF_EXAR_EFR; | 1163 | port->port.flags |= UPF_EXAR_EFR; |
1157 | return pci_default_setup(priv, board, port, idx); | 1164 | return pci_default_setup(priv, board, port, idx); |
1158 | } | 1165 | } |
1159 | 1166 | ||
@@ -1187,6 +1194,7 @@ pci_xr17c154_setup(struct serial_private *priv, | |||
1187 | #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 | 1194 | #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 |
1188 | #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 | 1195 | #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 |
1189 | #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d | 1196 | #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d |
1197 | #define PCI_VENDOR_ID_ASIX 0x9710 | ||
1190 | 1198 | ||
1191 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ | 1199 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ |
1192 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 | 1200 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 |
@@ -1726,7 +1734,17 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { | |||
1726 | .subvendor = PCI_ANY_ID, | 1734 | .subvendor = PCI_ANY_ID, |
1727 | .subdevice = PCI_ANY_ID, | 1735 | .subdevice = PCI_ANY_ID, |
1728 | .setup = pci_omegapci_setup, | 1736 | .setup = pci_omegapci_setup, |
1729 | }, | 1737 | }, |
1738 | /* | ||
1739 | * ASIX devices with FIFO bug | ||
1740 | */ | ||
1741 | { | ||
1742 | .vendor = PCI_VENDOR_ID_ASIX, | ||
1743 | .device = PCI_ANY_ID, | ||
1744 | .subvendor = PCI_ANY_ID, | ||
1745 | .subdevice = PCI_ANY_ID, | ||
1746 | .setup = pci_asix_setup, | ||
1747 | }, | ||
1730 | /* | 1748 | /* |
1731 | * Default "match everything" terminator entry | 1749 | * Default "match everything" terminator entry |
1732 | */ | 1750 | */ |
@@ -1887,7 +1905,6 @@ enum pci_board_num_t { | |||
1887 | pbn_panacom, | 1905 | pbn_panacom, |
1888 | pbn_panacom2, | 1906 | pbn_panacom2, |
1889 | pbn_panacom4, | 1907 | pbn_panacom4, |
1890 | pbn_exsys_4055, | ||
1891 | pbn_plx_romulus, | 1908 | pbn_plx_romulus, |
1892 | pbn_oxsemi, | 1909 | pbn_oxsemi, |
1893 | pbn_oxsemi_1_4000000, | 1910 | pbn_oxsemi_1_4000000, |
@@ -2393,13 +2410,6 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
2393 | .reg_shift = 7, | 2410 | .reg_shift = 7, |
2394 | }, | 2411 | }, |
2395 | 2412 | ||
2396 | [pbn_exsys_4055] = { | ||
2397 | .flags = FL_BASE2, | ||
2398 | .num_ports = 4, | ||
2399 | .base_baud = 115200, | ||
2400 | .uart_offset = 8, | ||
2401 | }, | ||
2402 | |||
2403 | /* I think this entry is broken - the first_offset looks wrong --rmk */ | 2413 | /* I think this entry is broken - the first_offset looks wrong --rmk */ |
2404 | [pbn_plx_romulus] = { | 2414 | [pbn_plx_romulus] = { |
2405 | .flags = FL_BASE2, | 2415 | .flags = FL_BASE2, |
@@ -2728,7 +2738,7 @@ serial_pci_matches(const struct pciserial_board *board, | |||
2728 | struct serial_private * | 2738 | struct serial_private * |
2729 | pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) | 2739 | pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) |
2730 | { | 2740 | { |
2731 | struct uart_port serial_port; | 2741 | struct uart_8250_port uart; |
2732 | struct serial_private *priv; | 2742 | struct serial_private *priv; |
2733 | struct pci_serial_quirk *quirk; | 2743 | struct pci_serial_quirk *quirk; |
2734 | int rc, nr_ports, i; | 2744 | int rc, nr_ports, i; |
@@ -2768,22 +2778,22 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) | |||
2768 | priv->dev = dev; | 2778 | priv->dev = dev; |
2769 | priv->quirk = quirk; | 2779 | priv->quirk = quirk; |
2770 | 2780 | ||
2771 | memset(&serial_port, 0, sizeof(struct uart_port)); | 2781 | memset(&uart, 0, sizeof(uart)); |
2772 | serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | 2782 | uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; |
2773 | serial_port.uartclk = board->base_baud * 16; | 2783 | uart.port.uartclk = board->base_baud * 16; |
2774 | serial_port.irq = get_pci_irq(dev, board); | 2784 | uart.port.irq = get_pci_irq(dev, board); |
2775 | serial_port.dev = &dev->dev; | 2785 | uart.port.dev = &dev->dev; |
2776 | 2786 | ||
2777 | for (i = 0; i < nr_ports; i++) { | 2787 | for (i = 0; i < nr_ports; i++) { |
2778 | if (quirk->setup(priv, board, &serial_port, i)) | 2788 | if (quirk->setup(priv, board, &uart, i)) |
2779 | break; | 2789 | break; |
2780 | 2790 | ||
2781 | #ifdef SERIAL_DEBUG_PCI | 2791 | #ifdef SERIAL_DEBUG_PCI |
2782 | printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n", | 2792 | printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n", |
2783 | serial_port.iobase, serial_port.irq, serial_port.iotype); | 2793 | uart.port.iobase, uart.port.irq, uart.port.iotype); |
2784 | #endif | 2794 | #endif |
2785 | 2795 | ||
2786 | priv->line[i] = serial8250_register_port(&serial_port); | 2796 | priv->line[i] = serial8250_register_8250_port(&uart); |
2787 | if (priv->line[i] < 0) { | 2797 | if (priv->line[i] < 0) { |
2788 | printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); | 2798 | printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); |
2789 | break; | 2799 | break; |
@@ -3193,7 +3203,7 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
3193 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, | 3203 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, |
3194 | PCI_SUBVENDOR_ID_EXSYS, | 3204 | PCI_SUBVENDOR_ID_EXSYS, |
3195 | PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0, | 3205 | PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0, |
3196 | pbn_exsys_4055 }, | 3206 | pbn_b2_4_115200 }, |
3197 | /* | 3207 | /* |
3198 | * Megawolf Romulus PCI Serial Card, from Mike Hudson | 3208 | * Megawolf Romulus PCI Serial Card, from Mike Hudson |
3199 | * (Exoray@isys.ca) | 3209 | * (Exoray@isys.ca) |
diff --git a/drivers/tty/serial/8250/8250_pnp.c b/drivers/tty/serial/8250/8250_pnp.c index a2f236510ff1..fde5aa60d51e 100644 --- a/drivers/tty/serial/8250/8250_pnp.c +++ b/drivers/tty/serial/8250/8250_pnp.c | |||
@@ -424,7 +424,7 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags) | |||
424 | static int __devinit | 424 | static int __devinit |
425 | serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | 425 | serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) |
426 | { | 426 | { |
427 | struct uart_port port; | 427 | struct uart_8250_port uart; |
428 | int ret, line, flags = dev_id->driver_data; | 428 | int ret, line, flags = dev_id->driver_data; |
429 | 429 | ||
430 | if (flags & UNKNOWN_DEV) { | 430 | if (flags & UNKNOWN_DEV) { |
@@ -433,32 +433,32 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | |||
433 | return ret; | 433 | return ret; |
434 | } | 434 | } |
435 | 435 | ||
436 | memset(&port, 0, sizeof(struct uart_port)); | 436 | memset(&uart, 0, sizeof(uart)); |
437 | if (pnp_irq_valid(dev, 0)) | 437 | if (pnp_irq_valid(dev, 0)) |
438 | port.irq = pnp_irq(dev, 0); | 438 | uart.port.irq = pnp_irq(dev, 0); |
439 | if (pnp_port_valid(dev, 0)) { | 439 | if (pnp_port_valid(dev, 0)) { |
440 | port.iobase = pnp_port_start(dev, 0); | 440 | uart.port.iobase = pnp_port_start(dev, 0); |
441 | port.iotype = UPIO_PORT; | 441 | uart.port.iotype = UPIO_PORT; |
442 | } else if (pnp_mem_valid(dev, 0)) { | 442 | } else if (pnp_mem_valid(dev, 0)) { |
443 | port.mapbase = pnp_mem_start(dev, 0); | 443 | uart.port.mapbase = pnp_mem_start(dev, 0); |
444 | port.iotype = UPIO_MEM; | 444 | uart.port.iotype = UPIO_MEM; |
445 | port.flags = UPF_IOREMAP; | 445 | uart.port.flags = UPF_IOREMAP; |
446 | } else | 446 | } else |
447 | return -ENODEV; | 447 | return -ENODEV; |
448 | 448 | ||
449 | #ifdef SERIAL_DEBUG_PNP | 449 | #ifdef SERIAL_DEBUG_PNP |
450 | printk(KERN_DEBUG | 450 | printk(KERN_DEBUG |
451 | "Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n", | 451 | "Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n", |
452 | port.iobase, port.mapbase, port.irq, port.iotype); | 452 | uart.port.iobase, uart.port.mapbase, uart.port.irq, uart.port.iotype); |
453 | #endif | 453 | #endif |
454 | 454 | ||
455 | port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; | 455 | uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; |
456 | if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE) | 456 | if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE) |
457 | port.flags |= UPF_SHARE_IRQ; | 457 | uart.port.flags |= UPF_SHARE_IRQ; |
458 | port.uartclk = 1843200; | 458 | uart.port.uartclk = 1843200; |
459 | port.dev = &dev->dev; | 459 | uart.port.dev = &dev->dev; |
460 | 460 | ||
461 | line = serial8250_register_port(&port); | 461 | line = serial8250_register_8250_port(&uart); |
462 | if (line < 0) | 462 | if (line < 0) |
463 | return -ENODEV; | 463 | return -ENODEV; |
464 | 464 | ||
diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c index 29b695d041ec..b7d48b346393 100644 --- a/drivers/tty/serial/8250/serial_cs.c +++ b/drivers/tty/serial/8250/serial_cs.c | |||
@@ -73,7 +73,7 @@ struct serial_quirk { | |||
73 | unsigned int prodid; | 73 | unsigned int prodid; |
74 | int multi; /* 1 = multifunction, > 1 = # ports */ | 74 | int multi; /* 1 = multifunction, > 1 = # ports */ |
75 | void (*config)(struct pcmcia_device *); | 75 | void (*config)(struct pcmcia_device *); |
76 | void (*setup)(struct pcmcia_device *, struct uart_port *); | 76 | void (*setup)(struct pcmcia_device *, struct uart_8250_port *); |
77 | void (*wakeup)(struct pcmcia_device *); | 77 | void (*wakeup)(struct pcmcia_device *); |
78 | int (*post)(struct pcmcia_device *); | 78 | int (*post)(struct pcmcia_device *); |
79 | }; | 79 | }; |
@@ -105,9 +105,9 @@ struct serial_cfg_mem { | |||
105 | * Elan VPU16551 UART with 14.7456MHz oscillator | 105 | * Elan VPU16551 UART with 14.7456MHz oscillator |
106 | * manfid 0x015D, 0x4C45 | 106 | * manfid 0x015D, 0x4C45 |
107 | */ | 107 | */ |
108 | static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) | 108 | static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart) |
109 | { | 109 | { |
110 | port->uartclk = 14745600; | 110 | uart->port.uartclk = 14745600; |
111 | } | 111 | } |
112 | 112 | ||
113 | static int quirk_post_ibm(struct pcmcia_device *link) | 113 | static int quirk_post_ibm(struct pcmcia_device *link) |
@@ -343,25 +343,25 @@ static void serial_detach(struct pcmcia_device *link) | |||
343 | static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, | 343 | static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, |
344 | unsigned int iobase, int irq) | 344 | unsigned int iobase, int irq) |
345 | { | 345 | { |
346 | struct uart_port port; | 346 | struct uart_8250_port uart; |
347 | int line; | 347 | int line; |
348 | 348 | ||
349 | memset(&port, 0, sizeof (struct uart_port)); | 349 | memset(&uart, 0, sizeof(uart)); |
350 | port.iobase = iobase; | 350 | uart.port.iobase = iobase; |
351 | port.irq = irq; | 351 | uart.port.irq = irq; |
352 | port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; | 352 | uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; |
353 | port.uartclk = 1843200; | 353 | uart.port.uartclk = 1843200; |
354 | port.dev = &handle->dev; | 354 | uart.port.dev = &handle->dev; |
355 | if (buggy_uart) | 355 | if (buggy_uart) |
356 | port.flags |= UPF_BUGGY_UART; | 356 | uart.port.flags |= UPF_BUGGY_UART; |
357 | 357 | ||
358 | if (info->quirk && info->quirk->setup) | 358 | if (info->quirk && info->quirk->setup) |
359 | info->quirk->setup(handle, &port); | 359 | info->quirk->setup(handle, &uart); |
360 | 360 | ||
361 | line = serial8250_register_port(&port); | 361 | line = serial8250_register_8250_port(&uart); |
362 | if (line < 0) { | 362 | if (line < 0) { |
363 | printk(KERN_NOTICE "serial_cs: serial8250_register_port() at " | 363 | pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n", |
364 | "0x%04lx, irq %d failed\n", (u_long)iobase, irq); | 364 | (unsigned long)iobase, irq); |
365 | return -EINVAL; | 365 | return -EINVAL; |
366 | } | 366 | } |
367 | 367 | ||
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 070b442c1f81..00207865ec55 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig | |||
@@ -704,6 +704,25 @@ config SERIAL_PNX8XXX_CONSOLE | |||
704 | If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330 | 704 | If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330 |
705 | and you want to use serial console, say Y. Otherwise, say N. | 705 | and you want to use serial console, say Y. Otherwise, say N. |
706 | 706 | ||
707 | config SERIAL_HS_LPC32XX | ||
708 | tristate "LPC32XX high speed serial port support" | ||
709 | depends on ARCH_LPC32XX && OF | ||
710 | select SERIAL_CORE | ||
711 | help | ||
712 | Support for the LPC32XX high speed serial ports (up to 900kbps). | ||
713 | Those are UARTs completely different from the Standard UARTs on the | ||
714 | LPC32XX SoC. | ||
715 | Choose M or Y here to build this driver. | ||
716 | |||
717 | config SERIAL_HS_LPC32XX_CONSOLE | ||
718 | bool "Enable LPC32XX high speed UART serial console" | ||
719 | depends on SERIAL_HS_LPC32XX | ||
720 | select SERIAL_CORE_CONSOLE | ||
721 | help | ||
722 | If you would like to be able to use one of the high speed serial | ||
723 | ports on the LPC32XX as the console, you can do so by answering | ||
724 | Y to this option. | ||
725 | |||
707 | config SERIAL_CORE | 726 | config SERIAL_CORE |
708 | tristate | 727 | tristate |
709 | 728 | ||
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile index 7257c5d898ae..8a5df3804e5f 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile | |||
@@ -34,6 +34,7 @@ obj-$(CONFIG_SERIAL_MUX) += mux.o | |||
34 | obj-$(CONFIG_SERIAL_68328) += 68328serial.o | 34 | obj-$(CONFIG_SERIAL_68328) += 68328serial.o |
35 | obj-$(CONFIG_SERIAL_MCF) += mcf.o | 35 | obj-$(CONFIG_SERIAL_MCF) += mcf.o |
36 | obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o | 36 | obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o |
37 | obj-$(CONFIG_SERIAL_HS_LPC32XX) += lpc32xx_hs.o | ||
37 | obj-$(CONFIG_SERIAL_DZ) += dz.o | 38 | obj-$(CONFIG_SERIAL_DZ) += dz.o |
38 | obj-$(CONFIG_SERIAL_ZS) += zs.o | 39 | obj-$(CONFIG_SERIAL_ZS) += zs.o |
39 | obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o | 40 | obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index d3553b5d3fca..92b1ac8db63d 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
@@ -1215,14 +1215,14 @@ static irqreturn_t pl011_int(int irq, void *dev_id) | |||
1215 | return IRQ_RETVAL(handled); | 1215 | return IRQ_RETVAL(handled); |
1216 | } | 1216 | } |
1217 | 1217 | ||
1218 | static unsigned int pl01x_tx_empty(struct uart_port *port) | 1218 | static unsigned int pl011_tx_empty(struct uart_port *port) |
1219 | { | 1219 | { |
1220 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1220 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
1221 | unsigned int status = readw(uap->port.membase + UART01x_FR); | 1221 | unsigned int status = readw(uap->port.membase + UART01x_FR); |
1222 | return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT; | 1222 | return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT; |
1223 | } | 1223 | } |
1224 | 1224 | ||
1225 | static unsigned int pl01x_get_mctrl(struct uart_port *port) | 1225 | static unsigned int pl011_get_mctrl(struct uart_port *port) |
1226 | { | 1226 | { |
1227 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1227 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
1228 | unsigned int result = 0; | 1228 | unsigned int result = 0; |
@@ -1285,7 +1285,7 @@ static void pl011_break_ctl(struct uart_port *port, int break_state) | |||
1285 | } | 1285 | } |
1286 | 1286 | ||
1287 | #ifdef CONFIG_CONSOLE_POLL | 1287 | #ifdef CONFIG_CONSOLE_POLL |
1288 | static int pl010_get_poll_char(struct uart_port *port) | 1288 | static int pl011_get_poll_char(struct uart_port *port) |
1289 | { | 1289 | { |
1290 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1290 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
1291 | unsigned int status; | 1291 | unsigned int status; |
@@ -1297,7 +1297,7 @@ static int pl010_get_poll_char(struct uart_port *port) | |||
1297 | return readw(uap->port.membase + UART01x_DR); | 1297 | return readw(uap->port.membase + UART01x_DR); |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | static void pl010_put_poll_char(struct uart_port *port, | 1300 | static void pl011_put_poll_char(struct uart_port *port, |
1301 | unsigned char ch) | 1301 | unsigned char ch) |
1302 | { | 1302 | { |
1303 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1303 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
@@ -1637,7 +1637,7 @@ static const char *pl011_type(struct uart_port *port) | |||
1637 | /* | 1637 | /* |
1638 | * Release the memory region(s) being used by 'port' | 1638 | * Release the memory region(s) being used by 'port' |
1639 | */ | 1639 | */ |
1640 | static void pl010_release_port(struct uart_port *port) | 1640 | static void pl011_release_port(struct uart_port *port) |
1641 | { | 1641 | { |
1642 | release_mem_region(port->mapbase, SZ_4K); | 1642 | release_mem_region(port->mapbase, SZ_4K); |
1643 | } | 1643 | } |
@@ -1645,7 +1645,7 @@ static void pl010_release_port(struct uart_port *port) | |||
1645 | /* | 1645 | /* |
1646 | * Request the memory region(s) being used by 'port' | 1646 | * Request the memory region(s) being used by 'port' |
1647 | */ | 1647 | */ |
1648 | static int pl010_request_port(struct uart_port *port) | 1648 | static int pl011_request_port(struct uart_port *port) |
1649 | { | 1649 | { |
1650 | return request_mem_region(port->mapbase, SZ_4K, "uart-pl011") | 1650 | return request_mem_region(port->mapbase, SZ_4K, "uart-pl011") |
1651 | != NULL ? 0 : -EBUSY; | 1651 | != NULL ? 0 : -EBUSY; |
@@ -1654,18 +1654,18 @@ static int pl010_request_port(struct uart_port *port) | |||
1654 | /* | 1654 | /* |
1655 | * Configure/autoconfigure the port. | 1655 | * Configure/autoconfigure the port. |
1656 | */ | 1656 | */ |
1657 | static void pl010_config_port(struct uart_port *port, int flags) | 1657 | static void pl011_config_port(struct uart_port *port, int flags) |
1658 | { | 1658 | { |
1659 | if (flags & UART_CONFIG_TYPE) { | 1659 | if (flags & UART_CONFIG_TYPE) { |
1660 | port->type = PORT_AMBA; | 1660 | port->type = PORT_AMBA; |
1661 | pl010_request_port(port); | 1661 | pl011_request_port(port); |
1662 | } | 1662 | } |
1663 | } | 1663 | } |
1664 | 1664 | ||
1665 | /* | 1665 | /* |
1666 | * verify the new serial_struct (for TIOCSSERIAL). | 1666 | * verify the new serial_struct (for TIOCSSERIAL). |
1667 | */ | 1667 | */ |
1668 | static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser) | 1668 | static int pl011_verify_port(struct uart_port *port, struct serial_struct *ser) |
1669 | { | 1669 | { |
1670 | int ret = 0; | 1670 | int ret = 0; |
1671 | if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA) | 1671 | if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA) |
@@ -1678,9 +1678,9 @@ static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser) | |||
1678 | } | 1678 | } |
1679 | 1679 | ||
1680 | static struct uart_ops amba_pl011_pops = { | 1680 | static struct uart_ops amba_pl011_pops = { |
1681 | .tx_empty = pl01x_tx_empty, | 1681 | .tx_empty = pl011_tx_empty, |
1682 | .set_mctrl = pl011_set_mctrl, | 1682 | .set_mctrl = pl011_set_mctrl, |
1683 | .get_mctrl = pl01x_get_mctrl, | 1683 | .get_mctrl = pl011_get_mctrl, |
1684 | .stop_tx = pl011_stop_tx, | 1684 | .stop_tx = pl011_stop_tx, |
1685 | .start_tx = pl011_start_tx, | 1685 | .start_tx = pl011_start_tx, |
1686 | .stop_rx = pl011_stop_rx, | 1686 | .stop_rx = pl011_stop_rx, |
@@ -1691,13 +1691,13 @@ static struct uart_ops amba_pl011_pops = { | |||
1691 | .flush_buffer = pl011_dma_flush_buffer, | 1691 | .flush_buffer = pl011_dma_flush_buffer, |
1692 | .set_termios = pl011_set_termios, | 1692 | .set_termios = pl011_set_termios, |
1693 | .type = pl011_type, | 1693 | .type = pl011_type, |
1694 | .release_port = pl010_release_port, | 1694 | .release_port = pl011_release_port, |
1695 | .request_port = pl010_request_port, | 1695 | .request_port = pl011_request_port, |
1696 | .config_port = pl010_config_port, | 1696 | .config_port = pl011_config_port, |
1697 | .verify_port = pl010_verify_port, | 1697 | .verify_port = pl011_verify_port, |
1698 | #ifdef CONFIG_CONSOLE_POLL | 1698 | #ifdef CONFIG_CONSOLE_POLL |
1699 | .poll_get_char = pl010_get_poll_char, | 1699 | .poll_get_char = pl011_get_poll_char, |
1700 | .poll_put_char = pl010_put_poll_char, | 1700 | .poll_put_char = pl011_put_poll_char, |
1701 | #endif | 1701 | #endif |
1702 | }; | 1702 | }; |
1703 | 1703 | ||
diff --git a/drivers/tty/serial/bfin_uart.c b/drivers/tty/serial/bfin_uart.c index bd97db23985b..9242d56ba267 100644 --- a/drivers/tty/serial/bfin_uart.c +++ b/drivers/tty/serial/bfin_uart.c | |||
@@ -182,7 +182,7 @@ static void bfin_serial_start_tx(struct uart_port *port) | |||
182 | * To avoid losting RX interrupt, we reset IR function | 182 | * To avoid losting RX interrupt, we reset IR function |
183 | * before sending data. | 183 | * before sending data. |
184 | */ | 184 | */ |
185 | if (tty->termios->c_line == N_IRDA) | 185 | if (tty->termios.c_line == N_IRDA) |
186 | bfin_serial_reset_irda(port); | 186 | bfin_serial_reset_irda(port); |
187 | 187 | ||
188 | #ifdef CONFIG_SERIAL_BFIN_DMA | 188 | #ifdef CONFIG_SERIAL_BFIN_DMA |
diff --git a/drivers/tty/serial/crisv10.c b/drivers/tty/serial/crisv10.c index 80b6b1b1f725..6b705b243522 100644 --- a/drivers/tty/serial/crisv10.c +++ b/drivers/tty/serial/crisv10.c | |||
@@ -955,7 +955,7 @@ static const struct control_pins e100_modem_pins[NR_PORTS] = | |||
955 | /* Calculate the chartime depending on baudrate, numbor of bits etc. */ | 955 | /* Calculate the chartime depending on baudrate, numbor of bits etc. */ |
956 | static void update_char_time(struct e100_serial * info) | 956 | static void update_char_time(struct e100_serial * info) |
957 | { | 957 | { |
958 | tcflag_t cflags = info->port.tty->termios->c_cflag; | 958 | tcflag_t cflags = info->port.tty->termios.c_cflag; |
959 | int bits; | 959 | int bits; |
960 | 960 | ||
961 | /* calc. number of bits / data byte */ | 961 | /* calc. number of bits / data byte */ |
@@ -1473,7 +1473,7 @@ rs_stop(struct tty_struct *tty) | |||
1473 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, | 1473 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, |
1474 | STOP_CHAR(info->port.tty)); | 1474 | STOP_CHAR(info->port.tty)); |
1475 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop); | 1475 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop); |
1476 | if (tty->termios->c_iflag & IXON ) { | 1476 | if (tty->termios.c_iflag & IXON ) { |
1477 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); | 1477 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
1478 | } | 1478 | } |
1479 | 1479 | ||
@@ -1496,7 +1496,7 @@ rs_start(struct tty_struct *tty) | |||
1496 | info->xmit.tail,SERIAL_XMIT_SIZE))); | 1496 | info->xmit.tail,SERIAL_XMIT_SIZE))); |
1497 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty)); | 1497 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty)); |
1498 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); | 1498 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); |
1499 | if (tty->termios->c_iflag & IXON ) { | 1499 | if (tty->termios.c_iflag & IXON ) { |
1500 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); | 1500 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
1501 | } | 1501 | } |
1502 | 1502 | ||
@@ -2929,7 +2929,7 @@ shutdown(struct e100_serial * info) | |||
2929 | descr[i].buf = 0; | 2929 | descr[i].buf = 0; |
2930 | } | 2930 | } |
2931 | 2931 | ||
2932 | if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) { | 2932 | if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) { |
2933 | /* hang up DTR and RTS if HUPCL is enabled */ | 2933 | /* hang up DTR and RTS if HUPCL is enabled */ |
2934 | e100_dtr(info, 0); | 2934 | e100_dtr(info, 0); |
2935 | e100_rts(info, 0); /* could check CRTSCTS before doing this */ | 2935 | e100_rts(info, 0); /* could check CRTSCTS before doing this */ |
@@ -2953,12 +2953,12 @@ change_speed(struct e100_serial *info) | |||
2953 | unsigned long flags; | 2953 | unsigned long flags; |
2954 | /* first some safety checks */ | 2954 | /* first some safety checks */ |
2955 | 2955 | ||
2956 | if (!info->port.tty || !info->port.tty->termios) | 2956 | if (!info->port.tty) |
2957 | return; | 2957 | return; |
2958 | if (!info->ioport) | 2958 | if (!info->ioport) |
2959 | return; | 2959 | return; |
2960 | 2960 | ||
2961 | cflag = info->port.tty->termios->c_cflag; | 2961 | cflag = info->port.tty->termios.c_cflag; |
2962 | 2962 | ||
2963 | /* possibly, the tx/rx should be disabled first to do this safely */ | 2963 | /* possibly, the tx/rx should be disabled first to do this safely */ |
2964 | 2964 | ||
@@ -3088,7 +3088,7 @@ change_speed(struct e100_serial *info) | |||
3088 | info->ioport[REG_REC_CTRL] = info->rx_ctrl; | 3088 | info->ioport[REG_REC_CTRL] = info->rx_ctrl; |
3089 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); | 3089 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); |
3090 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); | 3090 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); |
3091 | if (info->port.tty->termios->c_iflag & IXON ) { | 3091 | if (info->port.tty->termios.c_iflag & IXON ) { |
3092 | DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n", | 3092 | DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n", |
3093 | STOP_CHAR(info->port.tty))); | 3093 | STOP_CHAR(info->port.tty))); |
3094 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); | 3094 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
@@ -3355,7 +3355,7 @@ rs_throttle(struct tty_struct * tty) | |||
3355 | DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty))); | 3355 | DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty))); |
3356 | 3356 | ||
3357 | /* Do RTS before XOFF since XOFF might take some time */ | 3357 | /* Do RTS before XOFF since XOFF might take some time */ |
3358 | if (tty->termios->c_cflag & CRTSCTS) { | 3358 | if (tty->termios.c_cflag & CRTSCTS) { |
3359 | /* Turn off RTS line */ | 3359 | /* Turn off RTS line */ |
3360 | e100_rts(info, 0); | 3360 | e100_rts(info, 0); |
3361 | } | 3361 | } |
@@ -3377,7 +3377,7 @@ rs_unthrottle(struct tty_struct * tty) | |||
3377 | DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty))); | 3377 | DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty))); |
3378 | DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count)); | 3378 | DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count)); |
3379 | /* Do RTS before XOFF since XOFF might take some time */ | 3379 | /* Do RTS before XOFF since XOFF might take some time */ |
3380 | if (tty->termios->c_cflag & CRTSCTS) { | 3380 | if (tty->termios.c_cflag & CRTSCTS) { |
3381 | /* Assert RTS line */ | 3381 | /* Assert RTS line */ |
3382 | e100_rts(info, 1); | 3382 | e100_rts(info, 1); |
3383 | } | 3383 | } |
@@ -3748,7 +3748,7 @@ rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
3748 | 3748 | ||
3749 | /* Handle turning off CRTSCTS */ | 3749 | /* Handle turning off CRTSCTS */ |
3750 | if ((old_termios->c_cflag & CRTSCTS) && | 3750 | if ((old_termios->c_cflag & CRTSCTS) && |
3751 | !(tty->termios->c_cflag & CRTSCTS)) { | 3751 | !(tty->termios.c_cflag & CRTSCTS)) { |
3752 | tty->hw_stopped = 0; | 3752 | tty->hw_stopped = 0; |
3753 | rs_start(tty); | 3753 | rs_start(tty); |
3754 | } | 3754 | } |
@@ -3815,7 +3815,7 @@ rs_close(struct tty_struct *tty, struct file * filp) | |||
3815 | * separate termios for callout and dialin. | 3815 | * separate termios for callout and dialin. |
3816 | */ | 3816 | */ |
3817 | if (info->flags & ASYNC_NORMAL_ACTIVE) | 3817 | if (info->flags & ASYNC_NORMAL_ACTIVE) |
3818 | info->normal_termios = *tty->termios; | 3818 | info->normal_termios = tty->termios; |
3819 | /* | 3819 | /* |
3820 | * Now we wait for the transmit buffer to clear; and we notify | 3820 | * Now we wait for the transmit buffer to clear; and we notify |
3821 | * the line discipline to only process XON/XOFF characters. | 3821 | * the line discipline to only process XON/XOFF characters. |
@@ -3998,7 +3998,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp, | |||
3998 | return 0; | 3998 | return 0; |
3999 | } | 3999 | } |
4000 | 4000 | ||
4001 | if (tty->termios->c_cflag & CLOCAL) { | 4001 | if (tty->termios.c_cflag & CLOCAL) { |
4002 | do_clocal = 1; | 4002 | do_clocal = 1; |
4003 | } | 4003 | } |
4004 | 4004 | ||
@@ -4219,7 +4219,7 @@ rs_open(struct tty_struct *tty, struct file * filp) | |||
4219 | } | 4219 | } |
4220 | 4220 | ||
4221 | if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) { | 4221 | if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) { |
4222 | *tty->termios = info->normal_termios; | 4222 | tty->termios = info->normal_termios; |
4223 | change_speed(info); | 4223 | change_speed(info); |
4224 | } | 4224 | } |
4225 | 4225 | ||
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index d5c689d6217e..20e911724027 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c | |||
@@ -206,7 +206,7 @@ struct imx_port { | |||
206 | unsigned short trcv_delay; /* transceiver delay */ | 206 | unsigned short trcv_delay; /* transceiver delay */ |
207 | struct clk *clk_ipg; | 207 | struct clk *clk_ipg; |
208 | struct clk *clk_per; | 208 | struct clk *clk_per; |
209 | struct imx_uart_data *devdata; | 209 | const struct imx_uart_data *devdata; |
210 | }; | 210 | }; |
211 | 211 | ||
212 | struct imx_port_ucrs { | 212 | struct imx_port_ucrs { |
diff --git a/drivers/tty/serial/ioc4_serial.c b/drivers/tty/serial/ioc4_serial.c index e16894fb2ca3..cc5aca78ad9b 100644 --- a/drivers/tty/serial/ioc4_serial.c +++ b/drivers/tty/serial/ioc4_serial.c | |||
@@ -1803,7 +1803,7 @@ static inline int ic4_startup_local(struct uart_port *the_port) | |||
1803 | ioc4_set_proto(port, the_port->mapbase); | 1803 | ioc4_set_proto(port, the_port->mapbase); |
1804 | 1804 | ||
1805 | /* set the speed of the serial port */ | 1805 | /* set the speed of the serial port */ |
1806 | ioc4_change_speed(the_port, state->port.tty->termios, | 1806 | ioc4_change_speed(the_port, &state->port.tty->termios, |
1807 | (struct ktermios *)0); | 1807 | (struct ktermios *)0); |
1808 | 1808 | ||
1809 | return 0; | 1809 | return 0; |
diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c index 434bd881fcae..71397961773c 100644 --- a/drivers/tty/serial/jsm/jsm_tty.c +++ b/drivers/tty/serial/jsm/jsm_tty.c | |||
@@ -161,7 +161,7 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch) | |||
161 | struct ktermios *termios; | 161 | struct ktermios *termios; |
162 | 162 | ||
163 | spin_lock_irqsave(&port->lock, lock_flags); | 163 | spin_lock_irqsave(&port->lock, lock_flags); |
164 | termios = port->state->port.tty->termios; | 164 | termios = &port->state->port.tty->termios; |
165 | if (ch == termios->c_cc[VSTART]) | 165 | if (ch == termios->c_cc[VSTART]) |
166 | channel->ch_bd->bd_ops->send_start_character(channel); | 166 | channel->ch_bd->bd_ops->send_start_character(channel); |
167 | 167 | ||
@@ -250,7 +250,7 @@ static int jsm_tty_open(struct uart_port *port) | |||
250 | channel->ch_cached_lsr = 0; | 250 | channel->ch_cached_lsr = 0; |
251 | channel->ch_stops_sent = 0; | 251 | channel->ch_stops_sent = 0; |
252 | 252 | ||
253 | termios = port->state->port.tty->termios; | 253 | termios = &port->state->port.tty->termios; |
254 | channel->ch_c_cflag = termios->c_cflag; | 254 | channel->ch_c_cflag = termios->c_cflag; |
255 | channel->ch_c_iflag = termios->c_iflag; | 255 | channel->ch_c_iflag = termios->c_iflag; |
256 | channel->ch_c_oflag = termios->c_oflag; | 256 | channel->ch_c_oflag = termios->c_oflag; |
@@ -283,7 +283,7 @@ static void jsm_tty_close(struct uart_port *port) | |||
283 | jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n"); | 283 | jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n"); |
284 | 284 | ||
285 | bd = channel->ch_bd; | 285 | bd = channel->ch_bd; |
286 | ts = port->state->port.tty->termios; | 286 | ts = &port->state->port.tty->termios; |
287 | 287 | ||
288 | channel->ch_flags &= ~(CH_STOPI); | 288 | channel->ch_flags &= ~(CH_STOPI); |
289 | 289 | ||
@@ -567,7 +567,7 @@ void jsm_input(struct jsm_channel *ch) | |||
567 | *input data and return immediately. | 567 | *input data and return immediately. |
568 | */ | 568 | */ |
569 | if (!tp || | 569 | if (!tp || |
570 | !(tp->termios->c_cflag & CREAD) ) { | 570 | !(tp->termios.c_cflag & CREAD) ) { |
571 | 571 | ||
572 | jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, | 572 | jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, |
573 | "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum); | 573 | "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum); |
diff --git a/drivers/tty/serial/lpc32xx_hs.c b/drivers/tty/serial/lpc32xx_hs.c new file mode 100644 index 000000000000..ba3af3bf6d43 --- /dev/null +++ b/drivers/tty/serial/lpc32xx_hs.c | |||
@@ -0,0 +1,823 @@ | |||
1 | /* | ||
2 | * High Speed Serial Ports on NXP LPC32xx SoC | ||
3 | * | ||
4 | * Authors: Kevin Wells <kevin.wells@nxp.com> | ||
5 | * Roland Stigge <stigge@antcom.de> | ||
6 | * | ||
7 | * Copyright (C) 2010 NXP Semiconductors | ||
8 | * Copyright (C) 2012 Roland Stigge | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | */ | ||
20 | |||
21 | #include <linux/module.h> | ||
22 | #include <linux/ioport.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/console.h> | ||
25 | #include <linux/sysrq.h> | ||
26 | #include <linux/tty.h> | ||
27 | #include <linux/tty_flip.h> | ||
28 | #include <linux/serial_core.h> | ||
29 | #include <linux/serial.h> | ||
30 | #include <linux/platform_device.h> | ||
31 | #include <linux/delay.h> | ||
32 | #include <linux/nmi.h> | ||
33 | #include <linux/io.h> | ||
34 | #include <linux/irq.h> | ||
35 | #include <linux/gpio.h> | ||
36 | #include <linux/of.h> | ||
37 | #include <mach/platform.h> | ||
38 | #include <mach/hardware.h> | ||
39 | |||
40 | /* | ||
41 | * High Speed UART register offsets | ||
42 | */ | ||
43 | #define LPC32XX_HSUART_FIFO(x) ((x) + 0x00) | ||
44 | #define LPC32XX_HSUART_LEVEL(x) ((x) + 0x04) | ||
45 | #define LPC32XX_HSUART_IIR(x) ((x) + 0x08) | ||
46 | #define LPC32XX_HSUART_CTRL(x) ((x) + 0x0C) | ||
47 | #define LPC32XX_HSUART_RATE(x) ((x) + 0x10) | ||
48 | |||
49 | #define LPC32XX_HSU_BREAK_DATA (1 << 10) | ||
50 | #define LPC32XX_HSU_ERROR_DATA (1 << 9) | ||
51 | #define LPC32XX_HSU_RX_EMPTY (1 << 8) | ||
52 | |||
53 | #define LPC32XX_HSU_TX_LEV(n) (((n) >> 8) & 0xFF) | ||
54 | #define LPC32XX_HSU_RX_LEV(n) ((n) & 0xFF) | ||
55 | |||
56 | #define LPC32XX_HSU_TX_INT_SET (1 << 6) | ||
57 | #define LPC32XX_HSU_RX_OE_INT (1 << 5) | ||
58 | #define LPC32XX_HSU_BRK_INT (1 << 4) | ||
59 | #define LPC32XX_HSU_FE_INT (1 << 3) | ||
60 | #define LPC32XX_HSU_RX_TIMEOUT_INT (1 << 2) | ||
61 | #define LPC32XX_HSU_RX_TRIG_INT (1 << 1) | ||
62 | #define LPC32XX_HSU_TX_INT (1 << 0) | ||
63 | |||
64 | #define LPC32XX_HSU_HRTS_INV (1 << 21) | ||
65 | #define LPC32XX_HSU_HRTS_TRIG_8B (0x0 << 19) | ||
66 | #define LPC32XX_HSU_HRTS_TRIG_16B (0x1 << 19) | ||
67 | #define LPC32XX_HSU_HRTS_TRIG_32B (0x2 << 19) | ||
68 | #define LPC32XX_HSU_HRTS_TRIG_48B (0x3 << 19) | ||
69 | #define LPC32XX_HSU_HRTS_EN (1 << 18) | ||
70 | #define LPC32XX_HSU_TMO_DISABLED (0x0 << 16) | ||
71 | #define LPC32XX_HSU_TMO_INACT_4B (0x1 << 16) | ||
72 | #define LPC32XX_HSU_TMO_INACT_8B (0x2 << 16) | ||
73 | #define LPC32XX_HSU_TMO_INACT_16B (0x3 << 16) | ||
74 | #define LPC32XX_HSU_HCTS_INV (1 << 15) | ||
75 | #define LPC32XX_HSU_HCTS_EN (1 << 14) | ||
76 | #define LPC32XX_HSU_OFFSET(n) ((n) << 9) | ||
77 | #define LPC32XX_HSU_BREAK (1 << 8) | ||
78 | #define LPC32XX_HSU_ERR_INT_EN (1 << 7) | ||
79 | #define LPC32XX_HSU_RX_INT_EN (1 << 6) | ||
80 | #define LPC32XX_HSU_TX_INT_EN (1 << 5) | ||
81 | #define LPC32XX_HSU_RX_TL1B (0x0 << 2) | ||
82 | #define LPC32XX_HSU_RX_TL4B (0x1 << 2) | ||
83 | #define LPC32XX_HSU_RX_TL8B (0x2 << 2) | ||
84 | #define LPC32XX_HSU_RX_TL16B (0x3 << 2) | ||
85 | #define LPC32XX_HSU_RX_TL32B (0x4 << 2) | ||
86 | #define LPC32XX_HSU_RX_TL48B (0x5 << 2) | ||
87 | #define LPC32XX_HSU_TX_TLEMPTY (0x0 << 0) | ||
88 | #define LPC32XX_HSU_TX_TL0B (0x0 << 0) | ||
89 | #define LPC32XX_HSU_TX_TL4B (0x1 << 0) | ||
90 | #define LPC32XX_HSU_TX_TL8B (0x2 << 0) | ||
91 | #define LPC32XX_HSU_TX_TL16B (0x3 << 0) | ||
92 | |||
93 | #define MODNAME "lpc32xx_hsuart" | ||
94 | |||
95 | struct lpc32xx_hsuart_port { | ||
96 | struct uart_port port; | ||
97 | }; | ||
98 | |||
99 | #define FIFO_READ_LIMIT 128 | ||
100 | #define MAX_PORTS 3 | ||
101 | #define LPC32XX_TTY_NAME "ttyTX" | ||
102 | static struct lpc32xx_hsuart_port lpc32xx_hs_ports[MAX_PORTS]; | ||
103 | |||
104 | #ifdef CONFIG_SERIAL_HS_LPC32XX_CONSOLE | ||
105 | static void wait_for_xmit_empty(struct uart_port *port) | ||
106 | { | ||
107 | unsigned int timeout = 10000; | ||
108 | |||
109 | do { | ||
110 | if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL( | ||
111 | port->membase))) == 0) | ||
112 | break; | ||
113 | if (--timeout == 0) | ||
114 | break; | ||
115 | udelay(1); | ||
116 | } while (1); | ||
117 | } | ||
118 | |||
119 | static void wait_for_xmit_ready(struct uart_port *port) | ||
120 | { | ||
121 | unsigned int timeout = 10000; | ||
122 | |||
123 | while (1) { | ||
124 | if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL( | ||
125 | port->membase))) < 32) | ||
126 | break; | ||
127 | if (--timeout == 0) | ||
128 | break; | ||
129 | udelay(1); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | static void lpc32xx_hsuart_console_putchar(struct uart_port *port, int ch) | ||
134 | { | ||
135 | wait_for_xmit_ready(port); | ||
136 | writel((u32)ch, LPC32XX_HSUART_FIFO(port->membase)); | ||
137 | } | ||
138 | |||
139 | static void lpc32xx_hsuart_console_write(struct console *co, const char *s, | ||
140 | unsigned int count) | ||
141 | { | ||
142 | struct lpc32xx_hsuart_port *up = &lpc32xx_hs_ports[co->index]; | ||
143 | unsigned long flags; | ||
144 | int locked = 1; | ||
145 | |||
146 | touch_nmi_watchdog(); | ||
147 | local_irq_save(flags); | ||
148 | if (up->port.sysrq) | ||
149 | locked = 0; | ||
150 | else if (oops_in_progress) | ||
151 | locked = spin_trylock(&up->port.lock); | ||
152 | else | ||
153 | spin_lock(&up->port.lock); | ||
154 | |||
155 | uart_console_write(&up->port, s, count, lpc32xx_hsuart_console_putchar); | ||
156 | wait_for_xmit_empty(&up->port); | ||
157 | |||
158 | if (locked) | ||
159 | spin_unlock(&up->port.lock); | ||
160 | local_irq_restore(flags); | ||
161 | } | ||
162 | |||
163 | static int __init lpc32xx_hsuart_console_setup(struct console *co, | ||
164 | char *options) | ||
165 | { | ||
166 | struct uart_port *port; | ||
167 | int baud = 115200; | ||
168 | int bits = 8; | ||
169 | int parity = 'n'; | ||
170 | int flow = 'n'; | ||
171 | |||
172 | if (co->index >= MAX_PORTS) | ||
173 | co->index = 0; | ||
174 | |||
175 | port = &lpc32xx_hs_ports[co->index].port; | ||
176 | if (!port->membase) | ||
177 | return -ENODEV; | ||
178 | |||
179 | if (options) | ||
180 | uart_parse_options(options, &baud, &parity, &bits, &flow); | ||
181 | |||
182 | return uart_set_options(port, co, baud, parity, bits, flow); | ||
183 | } | ||
184 | |||
185 | static struct uart_driver lpc32xx_hsuart_reg; | ||
186 | static struct console lpc32xx_hsuart_console = { | ||
187 | .name = LPC32XX_TTY_NAME, | ||
188 | .write = lpc32xx_hsuart_console_write, | ||
189 | .device = uart_console_device, | ||
190 | .setup = lpc32xx_hsuart_console_setup, | ||
191 | .flags = CON_PRINTBUFFER, | ||
192 | .index = -1, | ||
193 | .data = &lpc32xx_hsuart_reg, | ||
194 | }; | ||
195 | |||
196 | static int __init lpc32xx_hsuart_console_init(void) | ||
197 | { | ||
198 | register_console(&lpc32xx_hsuart_console); | ||
199 | return 0; | ||
200 | } | ||
201 | console_initcall(lpc32xx_hsuart_console_init); | ||
202 | |||
203 | #define LPC32XX_HSUART_CONSOLE (&lpc32xx_hsuart_console) | ||
204 | #else | ||
205 | #define LPC32XX_HSUART_CONSOLE NULL | ||
206 | #endif | ||
207 | |||
208 | static struct uart_driver lpc32xx_hs_reg = { | ||
209 | .owner = THIS_MODULE, | ||
210 | .driver_name = MODNAME, | ||
211 | .dev_name = LPC32XX_TTY_NAME, | ||
212 | .nr = MAX_PORTS, | ||
213 | .cons = LPC32XX_HSUART_CONSOLE, | ||
214 | }; | ||
215 | static int uarts_registered; | ||
216 | |||
217 | static unsigned int __serial_get_clock_div(unsigned long uartclk, | ||
218 | unsigned long rate) | ||
219 | { | ||
220 | u32 div, goodrate, hsu_rate, l_hsu_rate, comprate; | ||
221 | u32 rate_diff; | ||
222 | |||
223 | /* Find the closest divider to get the desired clock rate */ | ||
224 | div = uartclk / rate; | ||
225 | goodrate = hsu_rate = (div / 14) - 1; | ||
226 | if (hsu_rate != 0) | ||
227 | hsu_rate--; | ||
228 | |||
229 | /* Tweak divider */ | ||
230 | l_hsu_rate = hsu_rate + 3; | ||
231 | rate_diff = 0xFFFFFFFF; | ||
232 | |||
233 | while (hsu_rate < l_hsu_rate) { | ||
234 | comprate = uartclk / ((hsu_rate + 1) * 14); | ||
235 | if (abs(comprate - rate) < rate_diff) { | ||
236 | goodrate = hsu_rate; | ||
237 | rate_diff = abs(comprate - rate); | ||
238 | } | ||
239 | |||
240 | hsu_rate++; | ||
241 | } | ||
242 | if (hsu_rate > 0xFF) | ||
243 | hsu_rate = 0xFF; | ||
244 | |||
245 | return goodrate; | ||
246 | } | ||
247 | |||
248 | static void __serial_uart_flush(struct uart_port *port) | ||
249 | { | ||
250 | u32 tmp; | ||
251 | int cnt = 0; | ||
252 | |||
253 | while ((readl(LPC32XX_HSUART_LEVEL(port->membase)) > 0) && | ||
254 | (cnt++ < FIFO_READ_LIMIT)) | ||
255 | tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); | ||
256 | } | ||
257 | |||
258 | static void __serial_lpc32xx_rx(struct uart_port *port) | ||
259 | { | ||
260 | unsigned int tmp, flag; | ||
261 | struct tty_struct *tty = tty_port_tty_get(&port->state->port); | ||
262 | |||
263 | if (!tty) { | ||
264 | /* Discard data: no tty available */ | ||
265 | while (!(readl(LPC32XX_HSUART_FIFO(port->membase)) & | ||
266 | LPC32XX_HSU_RX_EMPTY)) | ||
267 | ; | ||
268 | |||
269 | return; | ||
270 | } | ||
271 | |||
272 | /* Read data from FIFO and push into terminal */ | ||
273 | tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); | ||
274 | while (!(tmp & LPC32XX_HSU_RX_EMPTY)) { | ||
275 | flag = TTY_NORMAL; | ||
276 | port->icount.rx++; | ||
277 | |||
278 | if (tmp & LPC32XX_HSU_ERROR_DATA) { | ||
279 | /* Framing error */ | ||
280 | writel(LPC32XX_HSU_FE_INT, | ||
281 | LPC32XX_HSUART_IIR(port->membase)); | ||
282 | port->icount.frame++; | ||
283 | flag = TTY_FRAME; | ||
284 | tty_insert_flip_char(tty, 0, TTY_FRAME); | ||
285 | } | ||
286 | |||
287 | tty_insert_flip_char(tty, (tmp & 0xFF), flag); | ||
288 | |||
289 | tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); | ||
290 | } | ||
291 | tty_flip_buffer_push(tty); | ||
292 | tty_kref_put(tty); | ||
293 | } | ||
294 | |||
295 | static void __serial_lpc32xx_tx(struct uart_port *port) | ||
296 | { | ||
297 | struct circ_buf *xmit = &port->state->xmit; | ||
298 | unsigned int tmp; | ||
299 | |||
300 | if (port->x_char) { | ||
301 | writel((u32)port->x_char, LPC32XX_HSUART_FIFO(port->membase)); | ||
302 | port->icount.tx++; | ||
303 | port->x_char = 0; | ||
304 | return; | ||
305 | } | ||
306 | |||
307 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) | ||
308 | goto exit_tx; | ||
309 | |||
310 | /* Transfer data */ | ||
311 | while (LPC32XX_HSU_TX_LEV(readl( | ||
312 | LPC32XX_HSUART_LEVEL(port->membase))) < 64) { | ||
313 | writel((u32) xmit->buf[xmit->tail], | ||
314 | LPC32XX_HSUART_FIFO(port->membase)); | ||
315 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | ||
316 | port->icount.tx++; | ||
317 | if (uart_circ_empty(xmit)) | ||
318 | break; | ||
319 | } | ||
320 | |||
321 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | ||
322 | uart_write_wakeup(port); | ||
323 | |||
324 | exit_tx: | ||
325 | if (uart_circ_empty(xmit)) { | ||
326 | tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | ||
327 | tmp &= ~LPC32XX_HSU_TX_INT_EN; | ||
328 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
329 | } | ||
330 | } | ||
331 | |||
332 | static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id) | ||
333 | { | ||
334 | struct uart_port *port = dev_id; | ||
335 | struct tty_struct *tty = tty_port_tty_get(&port->state->port); | ||
336 | u32 status; | ||
337 | |||
338 | spin_lock(&port->lock); | ||
339 | |||
340 | /* Read UART status and clear latched interrupts */ | ||
341 | status = readl(LPC32XX_HSUART_IIR(port->membase)); | ||
342 | |||
343 | if (status & LPC32XX_HSU_BRK_INT) { | ||
344 | /* Break received */ | ||
345 | writel(LPC32XX_HSU_BRK_INT, LPC32XX_HSUART_IIR(port->membase)); | ||
346 | port->icount.brk++; | ||
347 | uart_handle_break(port); | ||
348 | } | ||
349 | |||
350 | /* Framing error */ | ||
351 | if (status & LPC32XX_HSU_FE_INT) | ||
352 | writel(LPC32XX_HSU_FE_INT, LPC32XX_HSUART_IIR(port->membase)); | ||
353 | |||
354 | if (status & LPC32XX_HSU_RX_OE_INT) { | ||
355 | /* Receive FIFO overrun */ | ||
356 | writel(LPC32XX_HSU_RX_OE_INT, | ||
357 | LPC32XX_HSUART_IIR(port->membase)); | ||
358 | port->icount.overrun++; | ||
359 | if (tty) { | ||
360 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
361 | tty_schedule_flip(tty); | ||
362 | } | ||
363 | } | ||
364 | |||
365 | /* Data received? */ | ||
366 | if (status & (LPC32XX_HSU_RX_TIMEOUT_INT | LPC32XX_HSU_RX_TRIG_INT)) { | ||
367 | __serial_lpc32xx_rx(port); | ||
368 | if (tty) | ||
369 | tty_flip_buffer_push(tty); | ||
370 | } | ||
371 | |||
372 | /* Transmit data request? */ | ||
373 | if ((status & LPC32XX_HSU_TX_INT) && (!uart_tx_stopped(port))) { | ||
374 | writel(LPC32XX_HSU_TX_INT, LPC32XX_HSUART_IIR(port->membase)); | ||
375 | __serial_lpc32xx_tx(port); | ||
376 | } | ||
377 | |||
378 | spin_unlock(&port->lock); | ||
379 | tty_kref_put(tty); | ||
380 | |||
381 | return IRQ_HANDLED; | ||
382 | } | ||
383 | |||
384 | /* port->lock is not held. */ | ||
385 | static unsigned int serial_lpc32xx_tx_empty(struct uart_port *port) | ||
386 | { | ||
387 | unsigned int ret = 0; | ||
388 | |||
389 | if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(port->membase))) == 0) | ||
390 | ret = TIOCSER_TEMT; | ||
391 | |||
392 | return ret; | ||
393 | } | ||
394 | |||
395 | /* port->lock held by caller. */ | ||
396 | static void serial_lpc32xx_set_mctrl(struct uart_port *port, | ||
397 | unsigned int mctrl) | ||
398 | { | ||
399 | /* No signals are supported on HS UARTs */ | ||
400 | } | ||
401 | |||
402 | /* port->lock is held by caller and interrupts are disabled. */ | ||
403 | static unsigned int serial_lpc32xx_get_mctrl(struct uart_port *port) | ||
404 | { | ||
405 | /* No signals are supported on HS UARTs */ | ||
406 | return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS; | ||
407 | } | ||
408 | |||
409 | /* port->lock held by caller. */ | ||
410 | static void serial_lpc32xx_stop_tx(struct uart_port *port) | ||
411 | { | ||
412 | u32 tmp; | ||
413 | |||
414 | tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | ||
415 | tmp &= ~LPC32XX_HSU_TX_INT_EN; | ||
416 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
417 | } | ||
418 | |||
419 | /* port->lock held by caller. */ | ||
420 | static void serial_lpc32xx_start_tx(struct uart_port *port) | ||
421 | { | ||
422 | u32 tmp; | ||
423 | |||
424 | __serial_lpc32xx_tx(port); | ||
425 | tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | ||
426 | tmp |= LPC32XX_HSU_TX_INT_EN; | ||
427 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
428 | } | ||
429 | |||
430 | /* port->lock held by caller. */ | ||
431 | static void serial_lpc32xx_stop_rx(struct uart_port *port) | ||
432 | { | ||
433 | u32 tmp; | ||
434 | |||
435 | tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | ||
436 | tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN); | ||
437 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
438 | |||
439 | writel((LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT | | ||
440 | LPC32XX_HSU_FE_INT), LPC32XX_HSUART_IIR(port->membase)); | ||
441 | } | ||
442 | |||
443 | /* port->lock held by caller. */ | ||
444 | static void serial_lpc32xx_enable_ms(struct uart_port *port) | ||
445 | { | ||
446 | /* Modem status is not supported */ | ||
447 | } | ||
448 | |||
449 | /* port->lock is not held. */ | ||
450 | static void serial_lpc32xx_break_ctl(struct uart_port *port, | ||
451 | int break_state) | ||
452 | { | ||
453 | unsigned long flags; | ||
454 | u32 tmp; | ||
455 | |||
456 | spin_lock_irqsave(&port->lock, flags); | ||
457 | tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | ||
458 | if (break_state != 0) | ||
459 | tmp |= LPC32XX_HSU_BREAK; | ||
460 | else | ||
461 | tmp &= ~LPC32XX_HSU_BREAK; | ||
462 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
463 | spin_unlock_irqrestore(&port->lock, flags); | ||
464 | } | ||
465 | |||
466 | /* LPC3250 Errata HSUART.1: Hang workaround via loopback mode on inactivity */ | ||
467 | static void lpc32xx_loopback_set(resource_size_t mapbase, int state) | ||
468 | { | ||
469 | int bit; | ||
470 | u32 tmp; | ||
471 | |||
472 | switch (mapbase) { | ||
473 | case LPC32XX_HS_UART1_BASE: | ||
474 | bit = 0; | ||
475 | break; | ||
476 | case LPC32XX_HS_UART2_BASE: | ||
477 | bit = 1; | ||
478 | break; | ||
479 | case LPC32XX_HS_UART7_BASE: | ||
480 | bit = 6; | ||
481 | break; | ||
482 | default: | ||
483 | WARN(1, "lpc32xx_hs: Warning: Unknown port at %08x\n", mapbase); | ||
484 | return; | ||
485 | } | ||
486 | |||
487 | tmp = readl(LPC32XX_UARTCTL_CLOOP); | ||
488 | if (state) | ||
489 | tmp |= (1 << bit); | ||
490 | else | ||
491 | tmp &= ~(1 << bit); | ||
492 | writel(tmp, LPC32XX_UARTCTL_CLOOP); | ||
493 | } | ||
494 | |||
495 | /* port->lock is not held. */ | ||
496 | static int serial_lpc32xx_startup(struct uart_port *port) | ||
497 | { | ||
498 | int retval; | ||
499 | unsigned long flags; | ||
500 | u32 tmp; | ||
501 | |||
502 | spin_lock_irqsave(&port->lock, flags); | ||
503 | |||
504 | __serial_uart_flush(port); | ||
505 | |||
506 | writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT | | ||
507 | LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT), | ||
508 | LPC32XX_HSUART_IIR(port->membase)); | ||
509 | |||
510 | writel(0xFF, LPC32XX_HSUART_RATE(port->membase)); | ||
511 | |||
512 | /* | ||
513 | * Set receiver timeout, HSU offset of 20, no break, no interrupts, | ||
514 | * and default FIFO trigger levels | ||
515 | */ | ||
516 | tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B | | ||
517 | LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B; | ||
518 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
519 | |||
520 | lpc32xx_loopback_set(port->mapbase, 0); /* get out of loopback mode */ | ||
521 | |||
522 | spin_unlock_irqrestore(&port->lock, flags); | ||
523 | |||
524 | retval = request_irq(port->irq, serial_lpc32xx_interrupt, | ||
525 | 0, MODNAME, port); | ||
526 | if (!retval) | ||
527 | writel((tmp | LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN), | ||
528 | LPC32XX_HSUART_CTRL(port->membase)); | ||
529 | |||
530 | return retval; | ||
531 | } | ||
532 | |||
533 | /* port->lock is not held. */ | ||
534 | static void serial_lpc32xx_shutdown(struct uart_port *port) | ||
535 | { | ||
536 | u32 tmp; | ||
537 | unsigned long flags; | ||
538 | |||
539 | spin_lock_irqsave(&port->lock, flags); | ||
540 | |||
541 | tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B | | ||
542 | LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B; | ||
543 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
544 | |||
545 | lpc32xx_loopback_set(port->mapbase, 1); /* go to loopback mode */ | ||
546 | |||
547 | spin_unlock_irqrestore(&port->lock, flags); | ||
548 | |||
549 | free_irq(port->irq, port); | ||
550 | } | ||
551 | |||
552 | /* port->lock is not held. */ | ||
553 | static void serial_lpc32xx_set_termios(struct uart_port *port, | ||
554 | struct ktermios *termios, | ||
555 | struct ktermios *old) | ||
556 | { | ||
557 | unsigned long flags; | ||
558 | unsigned int baud, quot; | ||
559 | u32 tmp; | ||
560 | |||
561 | /* Always 8-bit, no parity, 1 stop bit */ | ||
562 | termios->c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD); | ||
563 | termios->c_cflag |= CS8; | ||
564 | |||
565 | termios->c_cflag &= ~(HUPCL | CMSPAR | CLOCAL | CRTSCTS); | ||
566 | |||
567 | baud = uart_get_baud_rate(port, termios, old, 0, | ||
568 | port->uartclk / 14); | ||
569 | |||
570 | quot = __serial_get_clock_div(port->uartclk, baud); | ||
571 | |||
572 | spin_lock_irqsave(&port->lock, flags); | ||
573 | |||
574 | /* Ignore characters? */ | ||
575 | tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | ||
576 | if ((termios->c_cflag & CREAD) == 0) | ||
577 | tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN); | ||
578 | else | ||
579 | tmp |= LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN; | ||
580 | writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | ||
581 | |||
582 | writel(quot, LPC32XX_HSUART_RATE(port->membase)); | ||
583 | |||
584 | uart_update_timeout(port, termios->c_cflag, baud); | ||
585 | |||
586 | spin_unlock_irqrestore(&port->lock, flags); | ||
587 | |||
588 | /* Don't rewrite B0 */ | ||
589 | if (tty_termios_baud_rate(termios)) | ||
590 | tty_termios_encode_baud_rate(termios, baud, baud); | ||
591 | } | ||
592 | |||
593 | static const char *serial_lpc32xx_type(struct uart_port *port) | ||
594 | { | ||
595 | return MODNAME; | ||
596 | } | ||
597 | |||
598 | static void serial_lpc32xx_release_port(struct uart_port *port) | ||
599 | { | ||
600 | if ((port->iotype == UPIO_MEM32) && (port->mapbase)) { | ||
601 | if (port->flags & UPF_IOREMAP) { | ||
602 | iounmap(port->membase); | ||
603 | port->membase = NULL; | ||
604 | } | ||
605 | |||
606 | release_mem_region(port->mapbase, SZ_4K); | ||
607 | } | ||
608 | } | ||
609 | |||
610 | static int serial_lpc32xx_request_port(struct uart_port *port) | ||
611 | { | ||
612 | int ret = -ENODEV; | ||
613 | |||
614 | if ((port->iotype == UPIO_MEM32) && (port->mapbase)) { | ||
615 | ret = 0; | ||
616 | |||
617 | if (!request_mem_region(port->mapbase, SZ_4K, MODNAME)) | ||
618 | ret = -EBUSY; | ||
619 | else if (port->flags & UPF_IOREMAP) { | ||
620 | port->membase = ioremap(port->mapbase, SZ_4K); | ||
621 | if (!port->membase) { | ||
622 | release_mem_region(port->mapbase, SZ_4K); | ||
623 | ret = -ENOMEM; | ||
624 | } | ||
625 | } | ||
626 | } | ||
627 | |||
628 | return ret; | ||
629 | } | ||
630 | |||
631 | static void serial_lpc32xx_config_port(struct uart_port *port, int uflags) | ||
632 | { | ||
633 | int ret; | ||
634 | |||
635 | ret = serial_lpc32xx_request_port(port); | ||
636 | if (ret < 0) | ||
637 | return; | ||
638 | port->type = PORT_UART00; | ||
639 | port->fifosize = 64; | ||
640 | |||
641 | __serial_uart_flush(port); | ||
642 | |||
643 | writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT | | ||
644 | LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT), | ||
645 | LPC32XX_HSUART_IIR(port->membase)); | ||
646 | |||
647 | writel(0xFF, LPC32XX_HSUART_RATE(port->membase)); | ||
648 | |||
649 | /* Set receiver timeout, HSU offset of 20, no break, no interrupts, | ||
650 | and default FIFO trigger levels */ | ||
651 | writel(LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B | | ||
652 | LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B, | ||
653 | LPC32XX_HSUART_CTRL(port->membase)); | ||
654 | } | ||
655 | |||
656 | static int serial_lpc32xx_verify_port(struct uart_port *port, | ||
657 | struct serial_struct *ser) | ||
658 | { | ||
659 | int ret = 0; | ||
660 | |||
661 | if (ser->type != PORT_UART00) | ||
662 | ret = -EINVAL; | ||
663 | |||
664 | return ret; | ||
665 | } | ||
666 | |||
667 | static struct uart_ops serial_lpc32xx_pops = { | ||
668 | .tx_empty = serial_lpc32xx_tx_empty, | ||
669 | .set_mctrl = serial_lpc32xx_set_mctrl, | ||
670 | .get_mctrl = serial_lpc32xx_get_mctrl, | ||
671 | .stop_tx = serial_lpc32xx_stop_tx, | ||
672 | .start_tx = serial_lpc32xx_start_tx, | ||
673 | .stop_rx = serial_lpc32xx_stop_rx, | ||
674 | .enable_ms = serial_lpc32xx_enable_ms, | ||
675 | .break_ctl = serial_lpc32xx_break_ctl, | ||
676 | .startup = serial_lpc32xx_startup, | ||
677 | .shutdown = serial_lpc32xx_shutdown, | ||
678 | .set_termios = serial_lpc32xx_set_termios, | ||
679 | .type = serial_lpc32xx_type, | ||
680 | .release_port = serial_lpc32xx_release_port, | ||
681 | .request_port = serial_lpc32xx_request_port, | ||
682 | .config_port = serial_lpc32xx_config_port, | ||
683 | .verify_port = serial_lpc32xx_verify_port, | ||
684 | }; | ||
685 | |||
686 | /* | ||
687 | * Register a set of serial devices attached to a platform device | ||
688 | */ | ||
689 | static int __devinit serial_hs_lpc32xx_probe(struct platform_device *pdev) | ||
690 | { | ||
691 | struct lpc32xx_hsuart_port *p = &lpc32xx_hs_ports[uarts_registered]; | ||
692 | int ret = 0; | ||
693 | struct resource *res; | ||
694 | |||
695 | if (uarts_registered >= MAX_PORTS) { | ||
696 | dev_err(&pdev->dev, | ||
697 | "Error: Number of possible ports exceeded (%d)!\n", | ||
698 | uarts_registered + 1); | ||
699 | return -ENXIO; | ||
700 | } | ||
701 | |||
702 | memset(p, 0, sizeof(*p)); | ||
703 | |||
704 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
705 | if (!res) { | ||
706 | dev_err(&pdev->dev, | ||
707 | "Error getting mem resource for HS UART port %d\n", | ||
708 | uarts_registered); | ||
709 | return -ENXIO; | ||
710 | } | ||
711 | p->port.mapbase = res->start; | ||
712 | p->port.membase = NULL; | ||
713 | |||
714 | p->port.irq = platform_get_irq(pdev, 0); | ||
715 | if (p->port.irq < 0) { | ||
716 | dev_err(&pdev->dev, "Error getting irq for HS UART port %d\n", | ||
717 | uarts_registered); | ||
718 | return p->port.irq; | ||
719 | } | ||
720 | |||
721 | p->port.iotype = UPIO_MEM32; | ||
722 | p->port.uartclk = LPC32XX_MAIN_OSC_FREQ; | ||
723 | p->port.regshift = 2; | ||
724 | p->port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP; | ||
725 | p->port.dev = &pdev->dev; | ||
726 | p->port.ops = &serial_lpc32xx_pops; | ||
727 | p->port.line = uarts_registered++; | ||
728 | spin_lock_init(&p->port.lock); | ||
729 | |||
730 | /* send port to loopback mode by default */ | ||
731 | lpc32xx_loopback_set(p->port.mapbase, 1); | ||
732 | |||
733 | ret = uart_add_one_port(&lpc32xx_hs_reg, &p->port); | ||
734 | |||
735 | platform_set_drvdata(pdev, p); | ||
736 | |||
737 | return ret; | ||
738 | } | ||
739 | |||
740 | /* | ||
741 | * Remove serial ports registered against a platform device. | ||
742 | */ | ||
743 | static int __devexit serial_hs_lpc32xx_remove(struct platform_device *pdev) | ||
744 | { | ||
745 | struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev); | ||
746 | |||
747 | uart_remove_one_port(&lpc32xx_hs_reg, &p->port); | ||
748 | |||
749 | return 0; | ||
750 | } | ||
751 | |||
752 | |||
753 | #ifdef CONFIG_PM | ||
754 | static int serial_hs_lpc32xx_suspend(struct platform_device *pdev, | ||
755 | pm_message_t state) | ||
756 | { | ||
757 | struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev); | ||
758 | |||
759 | uart_suspend_port(&lpc32xx_hs_reg, &p->port); | ||
760 | |||
761 | return 0; | ||
762 | } | ||
763 | |||
764 | static int serial_hs_lpc32xx_resume(struct platform_device *pdev) | ||
765 | { | ||
766 | struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev); | ||
767 | |||
768 | uart_resume_port(&lpc32xx_hs_reg, &p->port); | ||
769 | |||
770 | return 0; | ||
771 | } | ||
772 | #else | ||
773 | #define serial_hs_lpc32xx_suspend NULL | ||
774 | #define serial_hs_lpc32xx_resume NULL | ||
775 | #endif | ||
776 | |||
777 | static const struct of_device_id serial_hs_lpc32xx_dt_ids[] = { | ||
778 | { .compatible = "nxp,lpc3220-hsuart" }, | ||
779 | { /* sentinel */ } | ||
780 | }; | ||
781 | |||
782 | MODULE_DEVICE_TABLE(of, serial_hs_lpc32xx_dt_ids); | ||
783 | |||
784 | static struct platform_driver serial_hs_lpc32xx_driver = { | ||
785 | .probe = serial_hs_lpc32xx_probe, | ||
786 | .remove = __devexit_p(serial_hs_lpc32xx_remove), | ||
787 | .suspend = serial_hs_lpc32xx_suspend, | ||
788 | .resume = serial_hs_lpc32xx_resume, | ||
789 | .driver = { | ||
790 | .name = MODNAME, | ||
791 | .owner = THIS_MODULE, | ||
792 | .of_match_table = serial_hs_lpc32xx_dt_ids, | ||
793 | }, | ||
794 | }; | ||
795 | |||
796 | static int __init lpc32xx_hsuart_init(void) | ||
797 | { | ||
798 | int ret; | ||
799 | |||
800 | ret = uart_register_driver(&lpc32xx_hs_reg); | ||
801 | if (ret) | ||
802 | return ret; | ||
803 | |||
804 | ret = platform_driver_register(&serial_hs_lpc32xx_driver); | ||
805 | if (ret) | ||
806 | uart_unregister_driver(&lpc32xx_hs_reg); | ||
807 | |||
808 | return ret; | ||
809 | } | ||
810 | |||
811 | static void __exit lpc32xx_hsuart_exit(void) | ||
812 | { | ||
813 | platform_driver_unregister(&serial_hs_lpc32xx_driver); | ||
814 | uart_unregister_driver(&lpc32xx_hs_reg); | ||
815 | } | ||
816 | |||
817 | module_init(lpc32xx_hsuart_init); | ||
818 | module_exit(lpc32xx_hsuart_exit); | ||
819 | |||
820 | MODULE_AUTHOR("Kevin Wells <kevin.wells@nxp.com>"); | ||
821 | MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>"); | ||
822 | MODULE_DESCRIPTION("NXP LPC32XX High Speed UART driver"); | ||
823 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c index 34e71874a892..df443b908ca3 100644 --- a/drivers/tty/serial/of_serial.c +++ b/drivers/tty/serial/of_serial.c | |||
@@ -105,6 +105,10 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev, | |||
105 | port->uartclk = clk; | 105 | port->uartclk = clk; |
106 | port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | 106 | port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP |
107 | | UPF_FIXED_PORT | UPF_FIXED_TYPE; | 107 | | UPF_FIXED_PORT | UPF_FIXED_TYPE; |
108 | |||
109 | if (of_find_property(np, "no-loopback-test", NULL)) | ||
110 | port->flags |= UPF_SKIP_TEST; | ||
111 | |||
108 | port->dev = &ofdev->dev; | 112 | port->dev = &ofdev->dev; |
109 | 113 | ||
110 | if (type == PORT_TEGRA) | 114 | if (type == PORT_TEGRA) |
@@ -144,8 +148,15 @@ static int __devinit of_platform_serial_probe(struct platform_device *ofdev) | |||
144 | switch (port_type) { | 148 | switch (port_type) { |
145 | #ifdef CONFIG_SERIAL_8250 | 149 | #ifdef CONFIG_SERIAL_8250 |
146 | case PORT_8250 ... PORT_MAX_8250: | 150 | case PORT_8250 ... PORT_MAX_8250: |
147 | ret = serial8250_register_port(&port); | 151 | { |
152 | /* For now the of bindings don't support the extra | ||
153 | 8250 specific bits */ | ||
154 | struct uart_8250_port port8250; | ||
155 | memset(&port8250, 0, sizeof(port8250)); | ||
156 | port8250.port = port; | ||
157 | ret = serial8250_register_8250_port(&port8250); | ||
148 | break; | 158 | break; |
159 | } | ||
149 | #endif | 160 | #endif |
150 | #ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL | 161 | #ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL |
151 | case PORT_NWPSERIAL: | 162 | case PORT_NWPSERIAL: |
diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c index 5847a4b855f7..9033fc6e0e4e 100644 --- a/drivers/tty/serial/pxa.c +++ b/drivers/tty/serial/pxa.c | |||
@@ -670,9 +670,19 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) | |||
670 | { | 670 | { |
671 | struct uart_pxa_port *up = serial_pxa_ports[co->index]; | 671 | struct uart_pxa_port *up = serial_pxa_ports[co->index]; |
672 | unsigned int ier; | 672 | unsigned int ier; |
673 | unsigned long flags; | ||
674 | int locked = 1; | ||
673 | 675 | ||
674 | clk_prepare_enable(up->clk); | 676 | clk_prepare_enable(up->clk); |
675 | 677 | ||
678 | local_irq_save(flags); | ||
679 | if (up->port.sysrq) | ||
680 | locked = 0; | ||
681 | else if (oops_in_progress) | ||
682 | locked = spin_trylock(&up->port.lock); | ||
683 | else | ||
684 | spin_lock(&up->port.lock); | ||
685 | |||
676 | /* | 686 | /* |
677 | * First save the IER then disable the interrupts | 687 | * First save the IER then disable the interrupts |
678 | */ | 688 | */ |
@@ -688,6 +698,10 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) | |||
688 | wait_for_xmitr(up); | 698 | wait_for_xmitr(up); |
689 | serial_out(up, UART_IER, ier); | 699 | serial_out(up, UART_IER, ier); |
690 | 700 | ||
701 | if (locked) | ||
702 | spin_unlock(&up->port.lock); | ||
703 | local_irq_restore(flags); | ||
704 | |||
691 | clk_disable_unprepare(up->clk); | 705 | clk_disable_unprepare(up->clk); |
692 | } | 706 | } |
693 | 707 | ||
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 02d07bfcfa8a..5c5e7e09f23e 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c | |||
@@ -529,7 +529,7 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, | |||
529 | 529 | ||
530 | switch (level) { | 530 | switch (level) { |
531 | case 3: | 531 | case 3: |
532 | if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL) | 532 | if (!IS_ERR(ourport->baudclk)) |
533 | clk_disable(ourport->baudclk); | 533 | clk_disable(ourport->baudclk); |
534 | 534 | ||
535 | clk_disable(ourport->clk); | 535 | clk_disable(ourport->clk); |
@@ -538,7 +538,7 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, | |||
538 | case 0: | 538 | case 0: |
539 | clk_enable(ourport->clk); | 539 | clk_enable(ourport->clk); |
540 | 540 | ||
541 | if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL) | 541 | if (!IS_ERR(ourport->baudclk)) |
542 | clk_enable(ourport->baudclk); | 542 | clk_enable(ourport->baudclk); |
543 | 543 | ||
544 | break; | 544 | break; |
@@ -604,7 +604,6 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, | |||
604 | char clkname[MAX_CLK_NAME_LENGTH]; | 604 | char clkname[MAX_CLK_NAME_LENGTH]; |
605 | int calc_deviation, deviation = (1 << 30) - 1; | 605 | int calc_deviation, deviation = (1 << 30) - 1; |
606 | 606 | ||
607 | *best_clk = NULL; | ||
608 | clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel : | 607 | clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel : |
609 | ourport->info->def_clk_sel; | 608 | ourport->info->def_clk_sel; |
610 | for (cnt = 0; cnt < info->num_clks; cnt++) { | 609 | for (cnt = 0; cnt < info->num_clks; cnt++) { |
@@ -613,7 +612,7 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, | |||
613 | 612 | ||
614 | sprintf(clkname, "clk_uart_baud%d", cnt); | 613 | sprintf(clkname, "clk_uart_baud%d", cnt); |
615 | clk = clk_get(ourport->port.dev, clkname); | 614 | clk = clk_get(ourport->port.dev, clkname); |
616 | if (IS_ERR_OR_NULL(clk)) | 615 | if (IS_ERR(clk)) |
617 | continue; | 616 | continue; |
618 | 617 | ||
619 | rate = clk_get_rate(clk); | 618 | rate = clk_get_rate(clk); |
@@ -684,7 +683,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, | |||
684 | { | 683 | { |
685 | struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port); | 684 | struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port); |
686 | struct s3c24xx_uart_port *ourport = to_ourport(port); | 685 | struct s3c24xx_uart_port *ourport = to_ourport(port); |
687 | struct clk *clk = NULL; | 686 | struct clk *clk = ERR_PTR(-EINVAL); |
688 | unsigned long flags; | 687 | unsigned long flags; |
689 | unsigned int baud, quot, clk_sel = 0; | 688 | unsigned int baud, quot, clk_sel = 0; |
690 | unsigned int ulcon; | 689 | unsigned int ulcon; |
@@ -705,7 +704,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, | |||
705 | quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel); | 704 | quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel); |
706 | if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST) | 705 | if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST) |
707 | quot = port->custom_divisor; | 706 | quot = port->custom_divisor; |
708 | if (!clk) | 707 | if (IS_ERR(clk)) |
709 | return; | 708 | return; |
710 | 709 | ||
711 | /* check to see if we need to change clock source */ | 710 | /* check to see if we need to change clock source */ |
@@ -713,9 +712,9 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, | |||
713 | if (ourport->baudclk != clk) { | 712 | if (ourport->baudclk != clk) { |
714 | s3c24xx_serial_setsource(port, clk_sel); | 713 | s3c24xx_serial_setsource(port, clk_sel); |
715 | 714 | ||
716 | if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) { | 715 | if (!IS_ERR(ourport->baudclk)) { |
717 | clk_disable(ourport->baudclk); | 716 | clk_disable(ourport->baudclk); |
718 | ourport->baudclk = NULL; | 717 | ourport->baudclk = ERR_PTR(-EINVAL); |
719 | } | 718 | } |
720 | 719 | ||
721 | clk_enable(clk); | 720 | clk_enable(clk); |
@@ -1036,7 +1035,7 @@ static int s3c24xx_serial_cpufreq_transition(struct notifier_block *nb, | |||
1036 | if (tty == NULL) | 1035 | if (tty == NULL) |
1037 | goto exit; | 1036 | goto exit; |
1038 | 1037 | ||
1039 | termios = tty->termios; | 1038 | termios = &tty->termios; |
1040 | 1039 | ||
1041 | if (termios == NULL) { | 1040 | if (termios == NULL) { |
1042 | printk(KERN_WARNING "%s: no termios?\n", __func__); | 1041 | printk(KERN_WARNING "%s: no termios?\n", __func__); |
@@ -1160,7 +1159,11 @@ static ssize_t s3c24xx_serial_show_clksrc(struct device *dev, | |||
1160 | struct uart_port *port = s3c24xx_dev_to_port(dev); | 1159 | struct uart_port *port = s3c24xx_dev_to_port(dev); |
1161 | struct s3c24xx_uart_port *ourport = to_ourport(port); | 1160 | struct s3c24xx_uart_port *ourport = to_ourport(port); |
1162 | 1161 | ||
1163 | return snprintf(buf, PAGE_SIZE, "* %s\n", ourport->baudclk->name); | 1162 | if (IS_ERR(ourport->baudclk)) |
1163 | return -EINVAL; | ||
1164 | |||
1165 | return snprintf(buf, PAGE_SIZE, "* %s\n", | ||
1166 | ourport->baudclk->name ?: "(null)"); | ||
1164 | } | 1167 | } |
1165 | 1168 | ||
1166 | static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL); | 1169 | static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL); |
@@ -1200,6 +1203,7 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) | |||
1200 | return -ENODEV; | 1203 | return -ENODEV; |
1201 | } | 1204 | } |
1202 | 1205 | ||
1206 | ourport->baudclk = ERR_PTR(-EINVAL); | ||
1203 | ourport->info = ourport->drv_data->info; | 1207 | ourport->info = ourport->drv_data->info; |
1204 | ourport->cfg = (pdev->dev.platform_data) ? | 1208 | ourport->cfg = (pdev->dev.platform_data) ? |
1205 | (struct s3c2410_uartcfg *)pdev->dev.platform_data : | 1209 | (struct s3c2410_uartcfg *)pdev->dev.platform_data : |
@@ -1387,7 +1391,7 @@ s3c24xx_serial_get_options(struct uart_port *port, int *baud, | |||
1387 | sprintf(clk_name, "clk_uart_baud%d", clk_sel); | 1391 | sprintf(clk_name, "clk_uart_baud%d", clk_sel); |
1388 | 1392 | ||
1389 | clk = clk_get(port->dev, clk_name); | 1393 | clk = clk_get(port->dev, clk_name); |
1390 | if (!IS_ERR(clk) && clk != NULL) | 1394 | if (!IS_ERR(clk)) |
1391 | rate = clk_get_rate(clk); | 1395 | rate = clk_get_rate(clk); |
1392 | else | 1396 | else |
1393 | rate = 1; | 1397 | rate = 1; |
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index a21dc8e3b7c0..d98b1bd407f6 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
@@ -159,7 +159,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, | |||
159 | retval = uport->ops->startup(uport); | 159 | retval = uport->ops->startup(uport); |
160 | if (retval == 0) { | 160 | if (retval == 0) { |
161 | if (uart_console(uport) && uport->cons->cflag) { | 161 | if (uart_console(uport) && uport->cons->cflag) { |
162 | tty->termios->c_cflag = uport->cons->cflag; | 162 | tty->termios.c_cflag = uport->cons->cflag; |
163 | uport->cons->cflag = 0; | 163 | uport->cons->cflag = 0; |
164 | } | 164 | } |
165 | /* | 165 | /* |
@@ -172,7 +172,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, | |||
172 | * Setup the RTS and DTR signals once the | 172 | * Setup the RTS and DTR signals once the |
173 | * port is open and ready to respond. | 173 | * port is open and ready to respond. |
174 | */ | 174 | */ |
175 | if (tty->termios->c_cflag & CBAUD) | 175 | if (tty->termios.c_cflag & CBAUD) |
176 | uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR); | 176 | uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR); |
177 | } | 177 | } |
178 | 178 | ||
@@ -240,7 +240,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state) | |||
240 | /* | 240 | /* |
241 | * Turn off DTR and RTS early. | 241 | * Turn off DTR and RTS early. |
242 | */ | 242 | */ |
243 | if (!tty || (tty->termios->c_cflag & HUPCL)) | 243 | if (!tty || (tty->termios.c_cflag & HUPCL)) |
244 | uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); | 244 | uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); |
245 | 245 | ||
246 | uart_port_shutdown(port); | 246 | uart_port_shutdown(port); |
@@ -440,10 +440,10 @@ static void uart_change_speed(struct tty_struct *tty, struct uart_state *state, | |||
440 | * If we have no tty, termios, or the port does not exist, | 440 | * If we have no tty, termios, or the port does not exist, |
441 | * then we can't set the parameters for this port. | 441 | * then we can't set the parameters for this port. |
442 | */ | 442 | */ |
443 | if (!tty || !tty->termios || uport->type == PORT_UNKNOWN) | 443 | if (!tty || uport->type == PORT_UNKNOWN) |
444 | return; | 444 | return; |
445 | 445 | ||
446 | termios = tty->termios; | 446 | termios = &tty->termios; |
447 | 447 | ||
448 | /* | 448 | /* |
449 | * Set flags based on termios cflag | 449 | * Set flags based on termios cflag |
@@ -614,7 +614,7 @@ static void uart_throttle(struct tty_struct *tty) | |||
614 | if (I_IXOFF(tty)) | 614 | if (I_IXOFF(tty)) |
615 | uart_send_xchar(tty, STOP_CHAR(tty)); | 615 | uart_send_xchar(tty, STOP_CHAR(tty)); |
616 | 616 | ||
617 | if (tty->termios->c_cflag & CRTSCTS) | 617 | if (tty->termios.c_cflag & CRTSCTS) |
618 | uart_clear_mctrl(state->uart_port, TIOCM_RTS); | 618 | uart_clear_mctrl(state->uart_port, TIOCM_RTS); |
619 | } | 619 | } |
620 | 620 | ||
@@ -630,7 +630,7 @@ static void uart_unthrottle(struct tty_struct *tty) | |||
630 | uart_send_xchar(tty, START_CHAR(tty)); | 630 | uart_send_xchar(tty, START_CHAR(tty)); |
631 | } | 631 | } |
632 | 632 | ||
633 | if (tty->termios->c_cflag & CRTSCTS) | 633 | if (tty->termios.c_cflag & CRTSCTS) |
634 | uart_set_mctrl(port, TIOCM_RTS); | 634 | uart_set_mctrl(port, TIOCM_RTS); |
635 | } | 635 | } |
636 | 636 | ||
@@ -1187,7 +1187,7 @@ static void uart_set_ldisc(struct tty_struct *tty) | |||
1187 | struct uart_port *uport = state->uart_port; | 1187 | struct uart_port *uport = state->uart_port; |
1188 | 1188 | ||
1189 | if (uport->ops->set_ldisc) | 1189 | if (uport->ops->set_ldisc) |
1190 | uport->ops->set_ldisc(uport, tty->termios->c_line); | 1190 | uport->ops->set_ldisc(uport, tty->termios.c_line); |
1191 | } | 1191 | } |
1192 | 1192 | ||
1193 | static void uart_set_termios(struct tty_struct *tty, | 1193 | static void uart_set_termios(struct tty_struct *tty, |
@@ -1195,7 +1195,7 @@ static void uart_set_termios(struct tty_struct *tty, | |||
1195 | { | 1195 | { |
1196 | struct uart_state *state = tty->driver_data; | 1196 | struct uart_state *state = tty->driver_data; |
1197 | unsigned long flags; | 1197 | unsigned long flags; |
1198 | unsigned int cflag = tty->termios->c_cflag; | 1198 | unsigned int cflag = tty->termios.c_cflag; |
1199 | 1199 | ||
1200 | 1200 | ||
1201 | /* | 1201 | /* |
@@ -1206,9 +1206,9 @@ static void uart_set_termios(struct tty_struct *tty, | |||
1206 | */ | 1206 | */ |
1207 | #define RELEVANT_IFLAG(iflag) ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) | 1207 | #define RELEVANT_IFLAG(iflag) ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) |
1208 | if ((cflag ^ old_termios->c_cflag) == 0 && | 1208 | if ((cflag ^ old_termios->c_cflag) == 0 && |
1209 | tty->termios->c_ospeed == old_termios->c_ospeed && | 1209 | tty->termios.c_ospeed == old_termios->c_ospeed && |
1210 | tty->termios->c_ispeed == old_termios->c_ispeed && | 1210 | tty->termios.c_ispeed == old_termios->c_ispeed && |
1211 | RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) { | 1211 | RELEVANT_IFLAG(tty->termios.c_iflag ^ old_termios->c_iflag) == 0) { |
1212 | return; | 1212 | return; |
1213 | } | 1213 | } |
1214 | 1214 | ||
@@ -1960,8 +1960,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) | |||
1960 | /* | 1960 | /* |
1961 | * If that's unset, use the tty termios setting. | 1961 | * If that's unset, use the tty termios setting. |
1962 | */ | 1962 | */ |
1963 | if (port->tty && port->tty->termios && termios.c_cflag == 0) | 1963 | if (port->tty && termios.c_cflag == 0) |
1964 | termios = *(port->tty->termios); | 1964 | termios = port->tty->termios; |
1965 | 1965 | ||
1966 | if (console_suspend_enabled) | 1966 | if (console_suspend_enabled) |
1967 | uart_change_pm(state, 0); | 1967 | uart_change_pm(state, 0); |
diff --git a/drivers/tty/synclink.c b/drivers/tty/synclink.c index 593d40ad0a6b..bdeeb3133f62 100644 --- a/drivers/tty/synclink.c +++ b/drivers/tty/synclink.c | |||
@@ -1840,22 +1840,22 @@ static void shutdown(struct mgsl_struct * info) | |||
1840 | usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS + | 1840 | usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS + |
1841 | TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC ); | 1841 | TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC ); |
1842 | usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE); | 1842 | usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE); |
1843 | 1843 | ||
1844 | /* Disable DMAEN (Port 7, Bit 14) */ | 1844 | /* Disable DMAEN (Port 7, Bit 14) */ |
1845 | /* This disconnects the DMA request signal from the ISA bus */ | 1845 | /* This disconnects the DMA request signal from the ISA bus */ |
1846 | /* on the ISA adapter. This has no effect for the PCI adapter */ | 1846 | /* on the ISA adapter. This has no effect for the PCI adapter */ |
1847 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14)); | 1847 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14)); |
1848 | 1848 | ||
1849 | /* Disable INTEN (Port 6, Bit12) */ | 1849 | /* Disable INTEN (Port 6, Bit12) */ |
1850 | /* This disconnects the IRQ request signal to the ISA bus */ | 1850 | /* This disconnects the IRQ request signal to the ISA bus */ |
1851 | /* on the ISA adapter. This has no effect for the PCI adapter */ | 1851 | /* on the ISA adapter. This has no effect for the PCI adapter */ |
1852 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12)); | 1852 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12)); |
1853 | 1853 | ||
1854 | if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { | 1854 | if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { |
1855 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); | 1855 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
1856 | usc_set_serial_signals(info); | 1856 | usc_set_serial_signals(info); |
1857 | } | 1857 | } |
1858 | 1858 | ||
1859 | spin_unlock_irqrestore(&info->irq_spinlock,flags); | 1859 | spin_unlock_irqrestore(&info->irq_spinlock,flags); |
1860 | 1860 | ||
1861 | mgsl_release_resources(info); | 1861 | mgsl_release_resources(info); |
@@ -1895,7 +1895,7 @@ static void mgsl_program_hw(struct mgsl_struct *info) | |||
1895 | usc_EnableInterrupts(info, IO_PIN); | 1895 | usc_EnableInterrupts(info, IO_PIN); |
1896 | usc_get_serial_signals(info); | 1896 | usc_get_serial_signals(info); |
1897 | 1897 | ||
1898 | if (info->netcount || info->port.tty->termios->c_cflag & CREAD) | 1898 | if (info->netcount || info->port.tty->termios.c_cflag & CREAD) |
1899 | usc_start_receiver(info); | 1899 | usc_start_receiver(info); |
1900 | 1900 | ||
1901 | spin_unlock_irqrestore(&info->irq_spinlock,flags); | 1901 | spin_unlock_irqrestore(&info->irq_spinlock,flags); |
@@ -1908,14 +1908,14 @@ static void mgsl_change_params(struct mgsl_struct *info) | |||
1908 | unsigned cflag; | 1908 | unsigned cflag; |
1909 | int bits_per_char; | 1909 | int bits_per_char; |
1910 | 1910 | ||
1911 | if (!info->port.tty || !info->port.tty->termios) | 1911 | if (!info->port.tty) |
1912 | return; | 1912 | return; |
1913 | 1913 | ||
1914 | if (debug_level >= DEBUG_LEVEL_INFO) | 1914 | if (debug_level >= DEBUG_LEVEL_INFO) |
1915 | printk("%s(%d):mgsl_change_params(%s)\n", | 1915 | printk("%s(%d):mgsl_change_params(%s)\n", |
1916 | __FILE__,__LINE__, info->device_name ); | 1916 | __FILE__,__LINE__, info->device_name ); |
1917 | 1917 | ||
1918 | cflag = info->port.tty->termios->c_cflag; | 1918 | cflag = info->port.tty->termios.c_cflag; |
1919 | 1919 | ||
1920 | /* if B0 rate (hangup) specified then negate DTR and RTS */ | 1920 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
1921 | /* otherwise assert DTR and RTS */ | 1921 | /* otherwise assert DTR and RTS */ |
@@ -2367,8 +2367,8 @@ static void mgsl_throttle(struct tty_struct * tty) | |||
2367 | 2367 | ||
2368 | if (I_IXOFF(tty)) | 2368 | if (I_IXOFF(tty)) |
2369 | mgsl_send_xchar(tty, STOP_CHAR(tty)); | 2369 | mgsl_send_xchar(tty, STOP_CHAR(tty)); |
2370 | 2370 | ||
2371 | if (tty->termios->c_cflag & CRTSCTS) { | 2371 | if (tty->termios.c_cflag & CRTSCTS) { |
2372 | spin_lock_irqsave(&info->irq_spinlock,flags); | 2372 | spin_lock_irqsave(&info->irq_spinlock,flags); |
2373 | info->serial_signals &= ~SerialSignal_RTS; | 2373 | info->serial_signals &= ~SerialSignal_RTS; |
2374 | usc_set_serial_signals(info); | 2374 | usc_set_serial_signals(info); |
@@ -2401,8 +2401,8 @@ static void mgsl_unthrottle(struct tty_struct * tty) | |||
2401 | else | 2401 | else |
2402 | mgsl_send_xchar(tty, START_CHAR(tty)); | 2402 | mgsl_send_xchar(tty, START_CHAR(tty)); |
2403 | } | 2403 | } |
2404 | 2404 | ||
2405 | if (tty->termios->c_cflag & CRTSCTS) { | 2405 | if (tty->termios.c_cflag & CRTSCTS) { |
2406 | spin_lock_irqsave(&info->irq_spinlock,flags); | 2406 | spin_lock_irqsave(&info->irq_spinlock,flags); |
2407 | info->serial_signals |= SerialSignal_RTS; | 2407 | info->serial_signals |= SerialSignal_RTS; |
2408 | usc_set_serial_signals(info); | 2408 | usc_set_serial_signals(info); |
@@ -3045,7 +3045,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio | |||
3045 | 3045 | ||
3046 | /* Handle transition to B0 status */ | 3046 | /* Handle transition to B0 status */ |
3047 | if (old_termios->c_cflag & CBAUD && | 3047 | if (old_termios->c_cflag & CBAUD && |
3048 | !(tty->termios->c_cflag & CBAUD)) { | 3048 | !(tty->termios.c_cflag & CBAUD)) { |
3049 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); | 3049 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
3050 | spin_lock_irqsave(&info->irq_spinlock,flags); | 3050 | spin_lock_irqsave(&info->irq_spinlock,flags); |
3051 | usc_set_serial_signals(info); | 3051 | usc_set_serial_signals(info); |
@@ -3054,9 +3054,9 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio | |||
3054 | 3054 | ||
3055 | /* Handle transition away from B0 status */ | 3055 | /* Handle transition away from B0 status */ |
3056 | if (!(old_termios->c_cflag & CBAUD) && | 3056 | if (!(old_termios->c_cflag & CBAUD) && |
3057 | tty->termios->c_cflag & CBAUD) { | 3057 | tty->termios.c_cflag & CBAUD) { |
3058 | info->serial_signals |= SerialSignal_DTR; | 3058 | info->serial_signals |= SerialSignal_DTR; |
3059 | if (!(tty->termios->c_cflag & CRTSCTS) || | 3059 | if (!(tty->termios.c_cflag & CRTSCTS) || |
3060 | !test_bit(TTY_THROTTLED, &tty->flags)) { | 3060 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
3061 | info->serial_signals |= SerialSignal_RTS; | 3061 | info->serial_signals |= SerialSignal_RTS; |
3062 | } | 3062 | } |
@@ -3067,7 +3067,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio | |||
3067 | 3067 | ||
3068 | /* Handle turning off CRTSCTS */ | 3068 | /* Handle turning off CRTSCTS */ |
3069 | if (old_termios->c_cflag & CRTSCTS && | 3069 | if (old_termios->c_cflag & CRTSCTS && |
3070 | !(tty->termios->c_cflag & CRTSCTS)) { | 3070 | !(tty->termios.c_cflag & CRTSCTS)) { |
3071 | tty->hw_stopped = 0; | 3071 | tty->hw_stopped = 0; |
3072 | mgsl_start(tty); | 3072 | mgsl_start(tty); |
3073 | } | 3073 | } |
@@ -3287,7 +3287,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, | |||
3287 | return 0; | 3287 | return 0; |
3288 | } | 3288 | } |
3289 | 3289 | ||
3290 | if (tty->termios->c_cflag & CLOCAL) | 3290 | if (tty->termios.c_cflag & CLOCAL) |
3291 | do_clocal = true; | 3291 | do_clocal = true; |
3292 | 3292 | ||
3293 | /* Wait for carrier detect and the line to become | 3293 | /* Wait for carrier detect and the line to become |
@@ -3313,7 +3313,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, | |||
3313 | port->blocked_open++; | 3313 | port->blocked_open++; |
3314 | 3314 | ||
3315 | while (1) { | 3315 | while (1) { |
3316 | if (tty->termios->c_cflag & CBAUD) | 3316 | if (tty->termios.c_cflag & CBAUD) |
3317 | tty_port_raise_dtr_rts(port); | 3317 | tty_port_raise_dtr_rts(port); |
3318 | 3318 | ||
3319 | set_current_state(TASK_INTERRUPTIBLE); | 3319 | set_current_state(TASK_INTERRUPTIBLE); |
diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c index aa1debf97cc7..f02d18a391e5 100644 --- a/drivers/tty/synclink_gt.c +++ b/drivers/tty/synclink_gt.c | |||
@@ -785,7 +785,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
785 | 785 | ||
786 | /* Handle transition to B0 status */ | 786 | /* Handle transition to B0 status */ |
787 | if (old_termios->c_cflag & CBAUD && | 787 | if (old_termios->c_cflag & CBAUD && |
788 | !(tty->termios->c_cflag & CBAUD)) { | 788 | !(tty->termios.c_cflag & CBAUD)) { |
789 | info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR); | 789 | info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
790 | spin_lock_irqsave(&info->lock,flags); | 790 | spin_lock_irqsave(&info->lock,flags); |
791 | set_signals(info); | 791 | set_signals(info); |
@@ -794,9 +794,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
794 | 794 | ||
795 | /* Handle transition away from B0 status */ | 795 | /* Handle transition away from B0 status */ |
796 | if (!(old_termios->c_cflag & CBAUD) && | 796 | if (!(old_termios->c_cflag & CBAUD) && |
797 | tty->termios->c_cflag & CBAUD) { | 797 | tty->termios.c_cflag & CBAUD) { |
798 | info->signals |= SerialSignal_DTR; | 798 | info->signals |= SerialSignal_DTR; |
799 | if (!(tty->termios->c_cflag & CRTSCTS) || | 799 | if (!(tty->termios.c_cflag & CRTSCTS) || |
800 | !test_bit(TTY_THROTTLED, &tty->flags)) { | 800 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
801 | info->signals |= SerialSignal_RTS; | 801 | info->signals |= SerialSignal_RTS; |
802 | } | 802 | } |
@@ -807,7 +807,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
807 | 807 | ||
808 | /* Handle turning off CRTSCTS */ | 808 | /* Handle turning off CRTSCTS */ |
809 | if (old_termios->c_cflag & CRTSCTS && | 809 | if (old_termios->c_cflag & CRTSCTS && |
810 | !(tty->termios->c_cflag & CRTSCTS)) { | 810 | !(tty->termios.c_cflag & CRTSCTS)) { |
811 | tty->hw_stopped = 0; | 811 | tty->hw_stopped = 0; |
812 | tx_release(tty); | 812 | tx_release(tty); |
813 | } | 813 | } |
@@ -1372,7 +1372,7 @@ static void throttle(struct tty_struct * tty) | |||
1372 | DBGINFO(("%s throttle\n", info->device_name)); | 1372 | DBGINFO(("%s throttle\n", info->device_name)); |
1373 | if (I_IXOFF(tty)) | 1373 | if (I_IXOFF(tty)) |
1374 | send_xchar(tty, STOP_CHAR(tty)); | 1374 | send_xchar(tty, STOP_CHAR(tty)); |
1375 | if (tty->termios->c_cflag & CRTSCTS) { | 1375 | if (tty->termios.c_cflag & CRTSCTS) { |
1376 | spin_lock_irqsave(&info->lock,flags); | 1376 | spin_lock_irqsave(&info->lock,flags); |
1377 | info->signals &= ~SerialSignal_RTS; | 1377 | info->signals &= ~SerialSignal_RTS; |
1378 | set_signals(info); | 1378 | set_signals(info); |
@@ -1397,7 +1397,7 @@ static void unthrottle(struct tty_struct * tty) | |||
1397 | else | 1397 | else |
1398 | send_xchar(tty, START_CHAR(tty)); | 1398 | send_xchar(tty, START_CHAR(tty)); |
1399 | } | 1399 | } |
1400 | if (tty->termios->c_cflag & CRTSCTS) { | 1400 | if (tty->termios.c_cflag & CRTSCTS) { |
1401 | spin_lock_irqsave(&info->lock,flags); | 1401 | spin_lock_irqsave(&info->lock,flags); |
1402 | info->signals |= SerialSignal_RTS; | 1402 | info->signals |= SerialSignal_RTS; |
1403 | set_signals(info); | 1403 | set_signals(info); |
@@ -2493,7 +2493,7 @@ static void shutdown(struct slgt_info *info) | |||
2493 | 2493 | ||
2494 | slgt_irq_off(info, IRQ_ALL | IRQ_MASTER); | 2494 | slgt_irq_off(info, IRQ_ALL | IRQ_MASTER); |
2495 | 2495 | ||
2496 | if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { | 2496 | if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { |
2497 | info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS); | 2497 | info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
2498 | set_signals(info); | 2498 | set_signals(info); |
2499 | } | 2499 | } |
@@ -2534,7 +2534,7 @@ static void program_hw(struct slgt_info *info) | |||
2534 | get_signals(info); | 2534 | get_signals(info); |
2535 | 2535 | ||
2536 | if (info->netcount || | 2536 | if (info->netcount || |
2537 | (info->port.tty && info->port.tty->termios->c_cflag & CREAD)) | 2537 | (info->port.tty && info->port.tty->termios.c_cflag & CREAD)) |
2538 | rx_start(info); | 2538 | rx_start(info); |
2539 | 2539 | ||
2540 | spin_unlock_irqrestore(&info->lock,flags); | 2540 | spin_unlock_irqrestore(&info->lock,flags); |
@@ -2548,11 +2548,11 @@ static void change_params(struct slgt_info *info) | |||
2548 | unsigned cflag; | 2548 | unsigned cflag; |
2549 | int bits_per_char; | 2549 | int bits_per_char; |
2550 | 2550 | ||
2551 | if (!info->port.tty || !info->port.tty->termios) | 2551 | if (!info->port.tty) |
2552 | return; | 2552 | return; |
2553 | DBGINFO(("%s change_params\n", info->device_name)); | 2553 | DBGINFO(("%s change_params\n", info->device_name)); |
2554 | 2554 | ||
2555 | cflag = info->port.tty->termios->c_cflag; | 2555 | cflag = info->port.tty->termios.c_cflag; |
2556 | 2556 | ||
2557 | /* if B0 rate (hangup) specified then negate DTR and RTS */ | 2557 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
2558 | /* otherwise assert DTR and RTS */ | 2558 | /* otherwise assert DTR and RTS */ |
@@ -3292,7 +3292,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, | |||
3292 | return 0; | 3292 | return 0; |
3293 | } | 3293 | } |
3294 | 3294 | ||
3295 | if (tty->termios->c_cflag & CLOCAL) | 3295 | if (tty->termios.c_cflag & CLOCAL) |
3296 | do_clocal = true; | 3296 | do_clocal = true; |
3297 | 3297 | ||
3298 | /* Wait for carrier detect and the line to become | 3298 | /* Wait for carrier detect and the line to become |
@@ -3314,7 +3314,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, | |||
3314 | port->blocked_open++; | 3314 | port->blocked_open++; |
3315 | 3315 | ||
3316 | while (1) { | 3316 | while (1) { |
3317 | if ((tty->termios->c_cflag & CBAUD)) | 3317 | if ((tty->termios.c_cflag & CBAUD)) |
3318 | tty_port_raise_dtr_rts(port); | 3318 | tty_port_raise_dtr_rts(port); |
3319 | 3319 | ||
3320 | set_current_state(TASK_INTERRUPTIBLE); | 3320 | set_current_state(TASK_INTERRUPTIBLE); |
diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c index a3dddc12d2fe..ae75a3c21fd3 100644 --- a/drivers/tty/synclinkmp.c +++ b/drivers/tty/synclinkmp.c | |||
@@ -873,7 +873,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
873 | 873 | ||
874 | /* Handle transition to B0 status */ | 874 | /* Handle transition to B0 status */ |
875 | if (old_termios->c_cflag & CBAUD && | 875 | if (old_termios->c_cflag & CBAUD && |
876 | !(tty->termios->c_cflag & CBAUD)) { | 876 | !(tty->termios.c_cflag & CBAUD)) { |
877 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); | 877 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
878 | spin_lock_irqsave(&info->lock,flags); | 878 | spin_lock_irqsave(&info->lock,flags); |
879 | set_signals(info); | 879 | set_signals(info); |
@@ -882,9 +882,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
882 | 882 | ||
883 | /* Handle transition away from B0 status */ | 883 | /* Handle transition away from B0 status */ |
884 | if (!(old_termios->c_cflag & CBAUD) && | 884 | if (!(old_termios->c_cflag & CBAUD) && |
885 | tty->termios->c_cflag & CBAUD) { | 885 | tty->termios.c_cflag & CBAUD) { |
886 | info->serial_signals |= SerialSignal_DTR; | 886 | info->serial_signals |= SerialSignal_DTR; |
887 | if (!(tty->termios->c_cflag & CRTSCTS) || | 887 | if (!(tty->termios.c_cflag & CRTSCTS) || |
888 | !test_bit(TTY_THROTTLED, &tty->flags)) { | 888 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
889 | info->serial_signals |= SerialSignal_RTS; | 889 | info->serial_signals |= SerialSignal_RTS; |
890 | } | 890 | } |
@@ -895,7 +895,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
895 | 895 | ||
896 | /* Handle turning off CRTSCTS */ | 896 | /* Handle turning off CRTSCTS */ |
897 | if (old_termios->c_cflag & CRTSCTS && | 897 | if (old_termios->c_cflag & CRTSCTS && |
898 | !(tty->termios->c_cflag & CRTSCTS)) { | 898 | !(tty->termios.c_cflag & CRTSCTS)) { |
899 | tty->hw_stopped = 0; | 899 | tty->hw_stopped = 0; |
900 | tx_release(tty); | 900 | tx_release(tty); |
901 | } | 901 | } |
@@ -1473,7 +1473,7 @@ static void throttle(struct tty_struct * tty) | |||
1473 | if (I_IXOFF(tty)) | 1473 | if (I_IXOFF(tty)) |
1474 | send_xchar(tty, STOP_CHAR(tty)); | 1474 | send_xchar(tty, STOP_CHAR(tty)); |
1475 | 1475 | ||
1476 | if (tty->termios->c_cflag & CRTSCTS) { | 1476 | if (tty->termios.c_cflag & CRTSCTS) { |
1477 | spin_lock_irqsave(&info->lock,flags); | 1477 | spin_lock_irqsave(&info->lock,flags); |
1478 | info->serial_signals &= ~SerialSignal_RTS; | 1478 | info->serial_signals &= ~SerialSignal_RTS; |
1479 | set_signals(info); | 1479 | set_signals(info); |
@@ -1502,7 +1502,7 @@ static void unthrottle(struct tty_struct * tty) | |||
1502 | send_xchar(tty, START_CHAR(tty)); | 1502 | send_xchar(tty, START_CHAR(tty)); |
1503 | } | 1503 | } |
1504 | 1504 | ||
1505 | if (tty->termios->c_cflag & CRTSCTS) { | 1505 | if (tty->termios.c_cflag & CRTSCTS) { |
1506 | spin_lock_irqsave(&info->lock,flags); | 1506 | spin_lock_irqsave(&info->lock,flags); |
1507 | info->serial_signals |= SerialSignal_RTS; | 1507 | info->serial_signals |= SerialSignal_RTS; |
1508 | set_signals(info); | 1508 | set_signals(info); |
@@ -2708,7 +2708,7 @@ static void shutdown(SLMP_INFO * info) | |||
2708 | 2708 | ||
2709 | reset_port(info); | 2709 | reset_port(info); |
2710 | 2710 | ||
2711 | if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { | 2711 | if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { |
2712 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); | 2712 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
2713 | set_signals(info); | 2713 | set_signals(info); |
2714 | } | 2714 | } |
@@ -2749,7 +2749,7 @@ static void program_hw(SLMP_INFO *info) | |||
2749 | 2749 | ||
2750 | get_signals(info); | 2750 | get_signals(info); |
2751 | 2751 | ||
2752 | if (info->netcount || (info->port.tty && info->port.tty->termios->c_cflag & CREAD) ) | 2752 | if (info->netcount || (info->port.tty && info->port.tty->termios.c_cflag & CREAD) ) |
2753 | rx_start(info); | 2753 | rx_start(info); |
2754 | 2754 | ||
2755 | spin_unlock_irqrestore(&info->lock,flags); | 2755 | spin_unlock_irqrestore(&info->lock,flags); |
@@ -2762,14 +2762,14 @@ static void change_params(SLMP_INFO *info) | |||
2762 | unsigned cflag; | 2762 | unsigned cflag; |
2763 | int bits_per_char; | 2763 | int bits_per_char; |
2764 | 2764 | ||
2765 | if (!info->port.tty || !info->port.tty->termios) | 2765 | if (!info->port.tty) |
2766 | return; | 2766 | return; |
2767 | 2767 | ||
2768 | if (debug_level >= DEBUG_LEVEL_INFO) | 2768 | if (debug_level >= DEBUG_LEVEL_INFO) |
2769 | printk("%s(%d):%s change_params()\n", | 2769 | printk("%s(%d):%s change_params()\n", |
2770 | __FILE__,__LINE__, info->device_name ); | 2770 | __FILE__,__LINE__, info->device_name ); |
2771 | 2771 | ||
2772 | cflag = info->port.tty->termios->c_cflag; | 2772 | cflag = info->port.tty->termios.c_cflag; |
2773 | 2773 | ||
2774 | /* if B0 rate (hangup) specified then negate DTR and RTS */ | 2774 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
2775 | /* otherwise assert DTR and RTS */ | 2775 | /* otherwise assert DTR and RTS */ |
@@ -3306,7 +3306,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, | |||
3306 | return 0; | 3306 | return 0; |
3307 | } | 3307 | } |
3308 | 3308 | ||
3309 | if (tty->termios->c_cflag & CLOCAL) | 3309 | if (tty->termios.c_cflag & CLOCAL) |
3310 | do_clocal = true; | 3310 | do_clocal = true; |
3311 | 3311 | ||
3312 | /* Wait for carrier detect and the line to become | 3312 | /* Wait for carrier detect and the line to become |
@@ -3332,7 +3332,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, | |||
3332 | port->blocked_open++; | 3332 | port->blocked_open++; |
3333 | 3333 | ||
3334 | while (1) { | 3334 | while (1) { |
3335 | if (tty->termios->c_cflag & CBAUD) | 3335 | if (tty->termios.c_cflag & CBAUD) |
3336 | tty_port_raise_dtr_rts(port); | 3336 | tty_port_raise_dtr_rts(port); |
3337 | 3337 | ||
3338 | set_current_state(TASK_INTERRUPTIBLE); | 3338 | set_current_state(TASK_INTERRUPTIBLE); |
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index b425c79675ad..c6f4d711771b 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c | |||
@@ -1249,21 +1249,19 @@ int tty_init_termios(struct tty_struct *tty) | |||
1249 | struct ktermios *tp; | 1249 | struct ktermios *tp; |
1250 | int idx = tty->index; | 1250 | int idx = tty->index; |
1251 | 1251 | ||
1252 | tp = tty->driver->termios[idx]; | 1252 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) |
1253 | if (tp == NULL) { | 1253 | tty->termios = tty->driver->init_termios; |
1254 | tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); | 1254 | else { |
1255 | if (tp == NULL) | 1255 | /* Check for lazy saved data */ |
1256 | return -ENOMEM; | 1256 | tp = tty->driver->termios[idx]; |
1257 | memcpy(tp, &tty->driver->init_termios, | 1257 | if (tp != NULL) |
1258 | sizeof(struct ktermios)); | 1258 | tty->termios = *tp; |
1259 | tty->driver->termios[idx] = tp; | 1259 | else |
1260 | tty->termios = tty->driver->init_termios; | ||
1260 | } | 1261 | } |
1261 | tty->termios = tp; | ||
1262 | tty->termios_locked = tp + 1; | ||
1263 | |||
1264 | /* Compatibility until drivers always set this */ | 1262 | /* Compatibility until drivers always set this */ |
1265 | tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); | 1263 | tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); |
1266 | tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); | 1264 | tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); |
1267 | return 0; | 1265 | return 0; |
1268 | } | 1266 | } |
1269 | EXPORT_SYMBOL_GPL(tty_init_termios); | 1267 | EXPORT_SYMBOL_GPL(tty_init_termios); |
@@ -1407,6 +1405,9 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx) | |||
1407 | if (retval < 0) | 1405 | if (retval < 0) |
1408 | goto err_deinit_tty; | 1406 | goto err_deinit_tty; |
1409 | 1407 | ||
1408 | if (!tty->port) | ||
1409 | tty->port = driver->ports[idx]; | ||
1410 | |||
1410 | /* | 1411 | /* |
1411 | * Structures all installed ... call the ldisc open routines. | 1412 | * Structures all installed ... call the ldisc open routines. |
1412 | * If we fail here just call release_tty to clean up. No need | 1413 | * If we fail here just call release_tty to clean up. No need |
@@ -1436,22 +1437,24 @@ void tty_free_termios(struct tty_struct *tty) | |||
1436 | { | 1437 | { |
1437 | struct ktermios *tp; | 1438 | struct ktermios *tp; |
1438 | int idx = tty->index; | 1439 | int idx = tty->index; |
1439 | /* Kill this flag and push into drivers for locking etc */ | 1440 | |
1440 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { | 1441 | /* If the port is going to reset then it has no termios to save */ |
1441 | /* FIXME: Locking on ->termios array */ | 1442 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) |
1442 | tp = tty->termios; | 1443 | return; |
1443 | tty->driver->termios[idx] = NULL; | 1444 | |
1444 | kfree(tp); | 1445 | /* Stash the termios data */ |
1446 | tp = tty->driver->termios[idx]; | ||
1447 | if (tp == NULL) { | ||
1448 | tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL); | ||
1449 | if (tp == NULL) { | ||
1450 | pr_warn("tty: no memory to save termios state.\n"); | ||
1451 | return; | ||
1452 | } | ||
1445 | } | 1453 | } |
1454 | *tp = tty->termios; | ||
1446 | } | 1455 | } |
1447 | EXPORT_SYMBOL(tty_free_termios); | 1456 | EXPORT_SYMBOL(tty_free_termios); |
1448 | 1457 | ||
1449 | void tty_shutdown(struct tty_struct *tty) | ||
1450 | { | ||
1451 | tty_driver_remove_tty(tty->driver, tty); | ||
1452 | tty_free_termios(tty); | ||
1453 | } | ||
1454 | EXPORT_SYMBOL(tty_shutdown); | ||
1455 | 1458 | ||
1456 | /** | 1459 | /** |
1457 | * release_one_tty - release tty structure memory | 1460 | * release_one_tty - release tty structure memory |
@@ -1462,7 +1465,6 @@ EXPORT_SYMBOL(tty_shutdown); | |||
1462 | * in use. It also gets called when setup of a device fails. | 1465 | * in use. It also gets called when setup of a device fails. |
1463 | * | 1466 | * |
1464 | * Locking: | 1467 | * Locking: |
1465 | * tty_mutex - sometimes only | ||
1466 | * takes the file list lock internally when working on the list | 1468 | * takes the file list lock internally when working on the list |
1467 | * of ttys that the driver keeps. | 1469 | * of ttys that the driver keeps. |
1468 | * | 1470 | * |
@@ -1495,11 +1497,6 @@ static void queue_release_one_tty(struct kref *kref) | |||
1495 | { | 1497 | { |
1496 | struct tty_struct *tty = container_of(kref, struct tty_struct, kref); | 1498 | struct tty_struct *tty = container_of(kref, struct tty_struct, kref); |
1497 | 1499 | ||
1498 | if (tty->ops->shutdown) | ||
1499 | tty->ops->shutdown(tty); | ||
1500 | else | ||
1501 | tty_shutdown(tty); | ||
1502 | |||
1503 | /* The hangup queue is now free so we can reuse it rather than | 1500 | /* The hangup queue is now free so we can reuse it rather than |
1504 | waste a chunk of memory for each port */ | 1501 | waste a chunk of memory for each port */ |
1505 | INIT_WORK(&tty->hangup_work, release_one_tty); | 1502 | INIT_WORK(&tty->hangup_work, release_one_tty); |
@@ -1528,16 +1525,20 @@ EXPORT_SYMBOL(tty_kref_put); | |||
1528 | * and decrement the refcount of the backing module. | 1525 | * and decrement the refcount of the backing module. |
1529 | * | 1526 | * |
1530 | * Locking: | 1527 | * Locking: |
1531 | * tty_mutex - sometimes only | 1528 | * tty_mutex |
1532 | * takes the file list lock internally when working on the list | 1529 | * takes the file list lock internally when working on the list |
1533 | * of ttys that the driver keeps. | 1530 | * of ttys that the driver keeps. |
1534 | * FIXME: should we require tty_mutex is held here ?? | ||
1535 | * | 1531 | * |
1536 | */ | 1532 | */ |
1537 | static void release_tty(struct tty_struct *tty, int idx) | 1533 | static void release_tty(struct tty_struct *tty, int idx) |
1538 | { | 1534 | { |
1539 | /* This should always be true but check for the moment */ | 1535 | /* This should always be true but check for the moment */ |
1540 | WARN_ON(tty->index != idx); | 1536 | WARN_ON(tty->index != idx); |
1537 | WARN_ON(!mutex_is_locked(&tty_mutex)); | ||
1538 | if (tty->ops->shutdown) | ||
1539 | tty->ops->shutdown(tty); | ||
1540 | tty_free_termios(tty); | ||
1541 | tty_driver_remove_tty(tty->driver, tty); | ||
1541 | 1542 | ||
1542 | if (tty->link) | 1543 | if (tty->link) |
1543 | tty_kref_put(tty->link); | 1544 | tty_kref_put(tty->link); |
@@ -1572,22 +1573,12 @@ static int tty_release_checks(struct tty_struct *tty, struct tty_struct *o_tty, | |||
1572 | __func__, idx, tty->name); | 1573 | __func__, idx, tty->name); |
1573 | return -1; | 1574 | return -1; |
1574 | } | 1575 | } |
1575 | if (tty->termios != tty->driver->termios[idx]) { | ||
1576 | printk(KERN_DEBUG "%s: driver.termios[%d] not termios for (%s)\n", | ||
1577 | __func__, idx, tty->name); | ||
1578 | return -1; | ||
1579 | } | ||
1580 | if (tty->driver->other) { | 1576 | if (tty->driver->other) { |
1581 | if (o_tty != tty->driver->other->ttys[idx]) { | 1577 | if (o_tty != tty->driver->other->ttys[idx]) { |
1582 | printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n", | 1578 | printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n", |
1583 | __func__, idx, tty->name); | 1579 | __func__, idx, tty->name); |
1584 | return -1; | 1580 | return -1; |
1585 | } | 1581 | } |
1586 | if (o_tty->termios != tty->driver->other->termios[idx]) { | ||
1587 | printk(KERN_DEBUG "%s: other->termios[%d] not o_termios for (%s)\n", | ||
1588 | __func__, idx, tty->name); | ||
1589 | return -1; | ||
1590 | } | ||
1591 | if (o_tty->link != tty) { | 1582 | if (o_tty->link != tty) { |
1592 | printk(KERN_DEBUG "%s: bad pty pointers\n", __func__); | 1583 | printk(KERN_DEBUG "%s: bad pty pointers\n", __func__); |
1593 | return -1; | 1584 | return -1; |
@@ -1715,6 +1706,9 @@ int tty_release(struct inode *inode, struct file *filp) | |||
1715 | * The closing flags are now consistent with the open counts on | 1706 | * The closing flags are now consistent with the open counts on |
1716 | * both sides, and we've completed the last operation that could | 1707 | * both sides, and we've completed the last operation that could |
1717 | * block, so it's safe to proceed with closing. | 1708 | * block, so it's safe to proceed with closing. |
1709 | * | ||
1710 | * We must *not* drop the tty_mutex until we ensure that a further | ||
1711 | * entry into tty_open can not pick up this tty. | ||
1718 | */ | 1712 | */ |
1719 | if (pty_master) { | 1713 | if (pty_master) { |
1720 | if (--o_tty->count < 0) { | 1714 | if (--o_tty->count < 0) { |
@@ -1766,12 +1760,13 @@ int tty_release(struct inode *inode, struct file *filp) | |||
1766 | } | 1760 | } |
1767 | 1761 | ||
1768 | mutex_unlock(&tty_mutex); | 1762 | mutex_unlock(&tty_mutex); |
1763 | tty_unlock(); | ||
1764 | /* At this point the TTY_CLOSING flag should ensure a dead tty | ||
1765 | cannot be re-opened by a racing opener */ | ||
1769 | 1766 | ||
1770 | /* check whether both sides are closing ... */ | 1767 | /* check whether both sides are closing ... */ |
1771 | if (!tty_closing || (o_tty && !o_tty_closing)) { | 1768 | if (!tty_closing || (o_tty && !o_tty_closing)) |
1772 | tty_unlock(); | ||
1773 | return 0; | 1769 | return 0; |
1774 | } | ||
1775 | 1770 | ||
1776 | #ifdef TTY_DEBUG_HANGUP | 1771 | #ifdef TTY_DEBUG_HANGUP |
1777 | printk(KERN_DEBUG "%s: freeing tty structure...\n", __func__); | 1772 | printk(KERN_DEBUG "%s: freeing tty structure...\n", __func__); |
@@ -1784,12 +1779,14 @@ int tty_release(struct inode *inode, struct file *filp) | |||
1784 | * The release_tty function takes care of the details of clearing | 1779 | * The release_tty function takes care of the details of clearing |
1785 | * the slots and preserving the termios structure. | 1780 | * the slots and preserving the termios structure. |
1786 | */ | 1781 | */ |
1782 | mutex_lock(&tty_mutex); | ||
1787 | release_tty(tty, idx); | 1783 | release_tty(tty, idx); |
1784 | mutex_unlock(&tty_mutex); | ||
1788 | 1785 | ||
1789 | /* Make this pty number available for reallocation */ | 1786 | /* Make this pty number available for reallocation */ |
1790 | if (devpts) | 1787 | if (devpts) |
1791 | devpts_kill_index(inode, idx); | 1788 | devpts_kill_index(inode, idx); |
1792 | tty_unlock(); | 1789 | |
1793 | return 0; | 1790 | return 0; |
1794 | } | 1791 | } |
1795 | 1792 | ||
@@ -3094,6 +3091,7 @@ static void destruct_tty_driver(struct kref *kref) | |||
3094 | kfree(p); | 3091 | kfree(p); |
3095 | cdev_del(&driver->cdev); | 3092 | cdev_del(&driver->cdev); |
3096 | } | 3093 | } |
3094 | kfree(driver->ports); | ||
3097 | kfree(driver); | 3095 | kfree(driver); |
3098 | } | 3096 | } |
3099 | 3097 | ||
@@ -3132,6 +3130,18 @@ int tty_register_driver(struct tty_driver *driver) | |||
3132 | if (!p) | 3130 | if (!p) |
3133 | return -ENOMEM; | 3131 | return -ENOMEM; |
3134 | } | 3132 | } |
3133 | /* | ||
3134 | * There is too many lines in PTY and we won't need the array there | ||
3135 | * since it has an ->install hook where it assigns ports properly. | ||
3136 | */ | ||
3137 | if (driver->type != TTY_DRIVER_TYPE_PTY) { | ||
3138 | driver->ports = kcalloc(driver->num, sizeof(struct tty_port *), | ||
3139 | GFP_KERNEL); | ||
3140 | if (!driver->ports) { | ||
3141 | error = -ENOMEM; | ||
3142 | goto err_free_p; | ||
3143 | } | ||
3144 | } | ||
3135 | 3145 | ||
3136 | if (!driver->major) { | 3146 | if (!driver->major) { |
3137 | error = alloc_chrdev_region(&dev, driver->minor_start, | 3147 | error = alloc_chrdev_region(&dev, driver->minor_start, |
@@ -3144,10 +3154,8 @@ int tty_register_driver(struct tty_driver *driver) | |||
3144 | dev = MKDEV(driver->major, driver->minor_start); | 3154 | dev = MKDEV(driver->major, driver->minor_start); |
3145 | error = register_chrdev_region(dev, driver->num, driver->name); | 3155 | error = register_chrdev_region(dev, driver->num, driver->name); |
3146 | } | 3156 | } |
3147 | if (error < 0) { | 3157 | if (error < 0) |
3148 | kfree(p); | 3158 | goto err_free_p; |
3149 | return error; | ||
3150 | } | ||
3151 | 3159 | ||
3152 | if (p) { | 3160 | if (p) { |
3153 | driver->ttys = (struct tty_struct **)p; | 3161 | driver->ttys = (struct tty_struct **)p; |
@@ -3160,13 +3168,8 @@ int tty_register_driver(struct tty_driver *driver) | |||
3160 | cdev_init(&driver->cdev, &tty_fops); | 3168 | cdev_init(&driver->cdev, &tty_fops); |
3161 | driver->cdev.owner = driver->owner; | 3169 | driver->cdev.owner = driver->owner; |
3162 | error = cdev_add(&driver->cdev, dev, driver->num); | 3170 | error = cdev_add(&driver->cdev, dev, driver->num); |
3163 | if (error) { | 3171 | if (error) |
3164 | unregister_chrdev_region(dev, driver->num); | 3172 | goto err_unreg_char; |
3165 | driver->ttys = NULL; | ||
3166 | driver->termios = NULL; | ||
3167 | kfree(p); | ||
3168 | return error; | ||
3169 | } | ||
3170 | 3173 | ||
3171 | mutex_lock(&tty_mutex); | 3174 | mutex_lock(&tty_mutex); |
3172 | list_add(&driver->tty_drivers, &tty_drivers); | 3175 | list_add(&driver->tty_drivers, &tty_drivers); |
@@ -3193,13 +3196,14 @@ err: | |||
3193 | list_del(&driver->tty_drivers); | 3196 | list_del(&driver->tty_drivers); |
3194 | mutex_unlock(&tty_mutex); | 3197 | mutex_unlock(&tty_mutex); |
3195 | 3198 | ||
3199 | err_unreg_char: | ||
3196 | unregister_chrdev_region(dev, driver->num); | 3200 | unregister_chrdev_region(dev, driver->num); |
3197 | driver->ttys = NULL; | 3201 | driver->ttys = NULL; |
3198 | driver->termios = NULL; | 3202 | driver->termios = NULL; |
3203 | err_free_p: /* destruct_tty_driver will free driver->ports */ | ||
3199 | kfree(p); | 3204 | kfree(p); |
3200 | return error; | 3205 | return error; |
3201 | } | 3206 | } |
3202 | |||
3203 | EXPORT_SYMBOL(tty_register_driver); | 3207 | EXPORT_SYMBOL(tty_register_driver); |
3204 | 3208 | ||
3205 | /* | 3209 | /* |
diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c index a1b9a2f68567..12b1fa0f4f86 100644 --- a/drivers/tty/tty_ioctl.c +++ b/drivers/tty/tty_ioctl.c | |||
@@ -410,7 +410,7 @@ EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate); | |||
410 | 410 | ||
411 | void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud) | 411 | void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud) |
412 | { | 412 | { |
413 | tty_termios_encode_baud_rate(tty->termios, ibaud, obaud); | 413 | tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud); |
414 | } | 414 | } |
415 | EXPORT_SYMBOL_GPL(tty_encode_baud_rate); | 415 | EXPORT_SYMBOL_GPL(tty_encode_baud_rate); |
416 | 416 | ||
@@ -427,7 +427,7 @@ EXPORT_SYMBOL_GPL(tty_encode_baud_rate); | |||
427 | 427 | ||
428 | speed_t tty_get_baud_rate(struct tty_struct *tty) | 428 | speed_t tty_get_baud_rate(struct tty_struct *tty) |
429 | { | 429 | { |
430 | speed_t baud = tty_termios_baud_rate(tty->termios); | 430 | speed_t baud = tty_termios_baud_rate(&tty->termios); |
431 | 431 | ||
432 | if (baud == 38400 && tty->alt_speed) { | 432 | if (baud == 38400 && tty->alt_speed) { |
433 | if (!tty->warned) { | 433 | if (!tty->warned) { |
@@ -509,14 +509,14 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) | |||
509 | /* FIXME: we need to decide on some locking/ordering semantics | 509 | /* FIXME: we need to decide on some locking/ordering semantics |
510 | for the set_termios notification eventually */ | 510 | for the set_termios notification eventually */ |
511 | mutex_lock(&tty->termios_mutex); | 511 | mutex_lock(&tty->termios_mutex); |
512 | old_termios = *tty->termios; | 512 | old_termios = tty->termios; |
513 | *tty->termios = *new_termios; | 513 | tty->termios = *new_termios; |
514 | unset_locked_termios(tty->termios, &old_termios, tty->termios_locked); | 514 | unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked); |
515 | 515 | ||
516 | /* See if packet mode change of state. */ | 516 | /* See if packet mode change of state. */ |
517 | if (tty->link && tty->link->packet) { | 517 | if (tty->link && tty->link->packet) { |
518 | int extproc = (old_termios.c_lflag & EXTPROC) | | 518 | int extproc = (old_termios.c_lflag & EXTPROC) | |
519 | (tty->termios->c_lflag & EXTPROC); | 519 | (tty->termios.c_lflag & EXTPROC); |
520 | int old_flow = ((old_termios.c_iflag & IXON) && | 520 | int old_flow = ((old_termios.c_iflag & IXON) && |
521 | (old_termios.c_cc[VSTOP] == '\023') && | 521 | (old_termios.c_cc[VSTOP] == '\023') && |
522 | (old_termios.c_cc[VSTART] == '\021')); | 522 | (old_termios.c_cc[VSTART] == '\021')); |
@@ -542,7 +542,7 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) | |||
542 | if (tty->ops->set_termios) | 542 | if (tty->ops->set_termios) |
543 | (*tty->ops->set_termios)(tty, &old_termios); | 543 | (*tty->ops->set_termios)(tty, &old_termios); |
544 | else | 544 | else |
545 | tty_termios_copy_hw(tty->termios, &old_termios); | 545 | tty_termios_copy_hw(&tty->termios, &old_termios); |
546 | 546 | ||
547 | ld = tty_ldisc_ref(tty); | 547 | ld = tty_ldisc_ref(tty); |
548 | if (ld != NULL) { | 548 | if (ld != NULL) { |
@@ -578,7 +578,7 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt) | |||
578 | return retval; | 578 | return retval; |
579 | 579 | ||
580 | mutex_lock(&tty->termios_mutex); | 580 | mutex_lock(&tty->termios_mutex); |
581 | memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios)); | 581 | tmp_termios = tty->termios; |
582 | mutex_unlock(&tty->termios_mutex); | 582 | mutex_unlock(&tty->termios_mutex); |
583 | 583 | ||
584 | if (opt & TERMIOS_TERMIO) { | 584 | if (opt & TERMIOS_TERMIO) { |
@@ -632,14 +632,14 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt) | |||
632 | static void copy_termios(struct tty_struct *tty, struct ktermios *kterm) | 632 | static void copy_termios(struct tty_struct *tty, struct ktermios *kterm) |
633 | { | 633 | { |
634 | mutex_lock(&tty->termios_mutex); | 634 | mutex_lock(&tty->termios_mutex); |
635 | memcpy(kterm, tty->termios, sizeof(struct ktermios)); | 635 | *kterm = tty->termios; |
636 | mutex_unlock(&tty->termios_mutex); | 636 | mutex_unlock(&tty->termios_mutex); |
637 | } | 637 | } |
638 | 638 | ||
639 | static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm) | 639 | static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm) |
640 | { | 640 | { |
641 | mutex_lock(&tty->termios_mutex); | 641 | mutex_lock(&tty->termios_mutex); |
642 | memcpy(kterm, tty->termios_locked, sizeof(struct ktermios)); | 642 | *kterm = tty->termios_locked; |
643 | mutex_unlock(&tty->termios_mutex); | 643 | mutex_unlock(&tty->termios_mutex); |
644 | } | 644 | } |
645 | 645 | ||
@@ -707,16 +707,16 @@ static int get_sgflags(struct tty_struct *tty) | |||
707 | { | 707 | { |
708 | int flags = 0; | 708 | int flags = 0; |
709 | 709 | ||
710 | if (!(tty->termios->c_lflag & ICANON)) { | 710 | if (!(tty->termios.c_lflag & ICANON)) { |
711 | if (tty->termios->c_lflag & ISIG) | 711 | if (tty->termios.c_lflag & ISIG) |
712 | flags |= 0x02; /* cbreak */ | 712 | flags |= 0x02; /* cbreak */ |
713 | else | 713 | else |
714 | flags |= 0x20; /* raw */ | 714 | flags |= 0x20; /* raw */ |
715 | } | 715 | } |
716 | if (tty->termios->c_lflag & ECHO) | 716 | if (tty->termios.c_lflag & ECHO) |
717 | flags |= 0x08; /* echo */ | 717 | flags |= 0x08; /* echo */ |
718 | if (tty->termios->c_oflag & OPOST) | 718 | if (tty->termios.c_oflag & OPOST) |
719 | if (tty->termios->c_oflag & ONLCR) | 719 | if (tty->termios.c_oflag & ONLCR) |
720 | flags |= 0x10; /* crmod */ | 720 | flags |= 0x10; /* crmod */ |
721 | return flags; | 721 | return flags; |
722 | } | 722 | } |
@@ -726,10 +726,10 @@ static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb) | |||
726 | struct sgttyb tmp; | 726 | struct sgttyb tmp; |
727 | 727 | ||
728 | mutex_lock(&tty->termios_mutex); | 728 | mutex_lock(&tty->termios_mutex); |
729 | tmp.sg_ispeed = tty->termios->c_ispeed; | 729 | tmp.sg_ispeed = tty->termios.c_ispeed; |
730 | tmp.sg_ospeed = tty->termios->c_ospeed; | 730 | tmp.sg_ospeed = tty->termios.c_ospeed; |
731 | tmp.sg_erase = tty->termios->c_cc[VERASE]; | 731 | tmp.sg_erase = tty->termios.c_cc[VERASE]; |
732 | tmp.sg_kill = tty->termios->c_cc[VKILL]; | 732 | tmp.sg_kill = tty->termios.c_cc[VKILL]; |
733 | tmp.sg_flags = get_sgflags(tty); | 733 | tmp.sg_flags = get_sgflags(tty); |
734 | mutex_unlock(&tty->termios_mutex); | 734 | mutex_unlock(&tty->termios_mutex); |
735 | 735 | ||
@@ -787,7 +787,7 @@ static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb) | |||
787 | return -EFAULT; | 787 | return -EFAULT; |
788 | 788 | ||
789 | mutex_lock(&tty->termios_mutex); | 789 | mutex_lock(&tty->termios_mutex); |
790 | termios = *tty->termios; | 790 | termios = tty->termios; |
791 | termios.c_cc[VERASE] = tmp.sg_erase; | 791 | termios.c_cc[VERASE] = tmp.sg_erase; |
792 | termios.c_cc[VKILL] = tmp.sg_kill; | 792 | termios.c_cc[VKILL] = tmp.sg_kill; |
793 | set_sgflags(&termios, tmp.sg_flags); | 793 | set_sgflags(&termios, tmp.sg_flags); |
@@ -808,12 +808,12 @@ static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars) | |||
808 | struct tchars tmp; | 808 | struct tchars tmp; |
809 | 809 | ||
810 | mutex_lock(&tty->termios_mutex); | 810 | mutex_lock(&tty->termios_mutex); |
811 | tmp.t_intrc = tty->termios->c_cc[VINTR]; | 811 | tmp.t_intrc = tty->termios.c_cc[VINTR]; |
812 | tmp.t_quitc = tty->termios->c_cc[VQUIT]; | 812 | tmp.t_quitc = tty->termios.c_cc[VQUIT]; |
813 | tmp.t_startc = tty->termios->c_cc[VSTART]; | 813 | tmp.t_startc = tty->termios.c_cc[VSTART]; |
814 | tmp.t_stopc = tty->termios->c_cc[VSTOP]; | 814 | tmp.t_stopc = tty->termios.c_cc[VSTOP]; |
815 | tmp.t_eofc = tty->termios->c_cc[VEOF]; | 815 | tmp.t_eofc = tty->termios.c_cc[VEOF]; |
816 | tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */ | 816 | tmp.t_brkc = tty->termios.c_cc[VEOL2]; /* what is brkc anyway? */ |
817 | mutex_unlock(&tty->termios_mutex); | 817 | mutex_unlock(&tty->termios_mutex); |
818 | return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; | 818 | return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
819 | } | 819 | } |
@@ -825,12 +825,12 @@ static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars) | |||
825 | if (copy_from_user(&tmp, tchars, sizeof(tmp))) | 825 | if (copy_from_user(&tmp, tchars, sizeof(tmp))) |
826 | return -EFAULT; | 826 | return -EFAULT; |
827 | mutex_lock(&tty->termios_mutex); | 827 | mutex_lock(&tty->termios_mutex); |
828 | tty->termios->c_cc[VINTR] = tmp.t_intrc; | 828 | tty->termios.c_cc[VINTR] = tmp.t_intrc; |
829 | tty->termios->c_cc[VQUIT] = tmp.t_quitc; | 829 | tty->termios.c_cc[VQUIT] = tmp.t_quitc; |
830 | tty->termios->c_cc[VSTART] = tmp.t_startc; | 830 | tty->termios.c_cc[VSTART] = tmp.t_startc; |
831 | tty->termios->c_cc[VSTOP] = tmp.t_stopc; | 831 | tty->termios.c_cc[VSTOP] = tmp.t_stopc; |
832 | tty->termios->c_cc[VEOF] = tmp.t_eofc; | 832 | tty->termios.c_cc[VEOF] = tmp.t_eofc; |
833 | tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */ | 833 | tty->termios.c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */ |
834 | mutex_unlock(&tty->termios_mutex); | 834 | mutex_unlock(&tty->termios_mutex); |
835 | return 0; | 835 | return 0; |
836 | } | 836 | } |
@@ -842,14 +842,14 @@ static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars) | |||
842 | struct ltchars tmp; | 842 | struct ltchars tmp; |
843 | 843 | ||
844 | mutex_lock(&tty->termios_mutex); | 844 | mutex_lock(&tty->termios_mutex); |
845 | tmp.t_suspc = tty->termios->c_cc[VSUSP]; | 845 | tmp.t_suspc = tty->termios.c_cc[VSUSP]; |
846 | /* what is dsuspc anyway? */ | 846 | /* what is dsuspc anyway? */ |
847 | tmp.t_dsuspc = tty->termios->c_cc[VSUSP]; | 847 | tmp.t_dsuspc = tty->termios.c_cc[VSUSP]; |
848 | tmp.t_rprntc = tty->termios->c_cc[VREPRINT]; | 848 | tmp.t_rprntc = tty->termios.c_cc[VREPRINT]; |
849 | /* what is flushc anyway? */ | 849 | /* what is flushc anyway? */ |
850 | tmp.t_flushc = tty->termios->c_cc[VEOL2]; | 850 | tmp.t_flushc = tty->termios.c_cc[VEOL2]; |
851 | tmp.t_werasc = tty->termios->c_cc[VWERASE]; | 851 | tmp.t_werasc = tty->termios.c_cc[VWERASE]; |
852 | tmp.t_lnextc = tty->termios->c_cc[VLNEXT]; | 852 | tmp.t_lnextc = tty->termios.c_cc[VLNEXT]; |
853 | mutex_unlock(&tty->termios_mutex); | 853 | mutex_unlock(&tty->termios_mutex); |
854 | return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; | 854 | return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
855 | } | 855 | } |
@@ -862,14 +862,14 @@ static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars) | |||
862 | return -EFAULT; | 862 | return -EFAULT; |
863 | 863 | ||
864 | mutex_lock(&tty->termios_mutex); | 864 | mutex_lock(&tty->termios_mutex); |
865 | tty->termios->c_cc[VSUSP] = tmp.t_suspc; | 865 | tty->termios.c_cc[VSUSP] = tmp.t_suspc; |
866 | /* what is dsuspc anyway? */ | 866 | /* what is dsuspc anyway? */ |
867 | tty->termios->c_cc[VEOL2] = tmp.t_dsuspc; | 867 | tty->termios.c_cc[VEOL2] = tmp.t_dsuspc; |
868 | tty->termios->c_cc[VREPRINT] = tmp.t_rprntc; | 868 | tty->termios.c_cc[VREPRINT] = tmp.t_rprntc; |
869 | /* what is flushc anyway? */ | 869 | /* what is flushc anyway? */ |
870 | tty->termios->c_cc[VEOL2] = tmp.t_flushc; | 870 | tty->termios.c_cc[VEOL2] = tmp.t_flushc; |
871 | tty->termios->c_cc[VWERASE] = tmp.t_werasc; | 871 | tty->termios.c_cc[VWERASE] = tmp.t_werasc; |
872 | tty->termios->c_cc[VLNEXT] = tmp.t_lnextc; | 872 | tty->termios.c_cc[VLNEXT] = tmp.t_lnextc; |
873 | mutex_unlock(&tty->termios_mutex); | 873 | mutex_unlock(&tty->termios_mutex); |
874 | return 0; | 874 | return 0; |
875 | } | 875 | } |
@@ -920,12 +920,12 @@ static int tty_change_softcar(struct tty_struct *tty, int arg) | |||
920 | struct ktermios old; | 920 | struct ktermios old; |
921 | 921 | ||
922 | mutex_lock(&tty->termios_mutex); | 922 | mutex_lock(&tty->termios_mutex); |
923 | old = *tty->termios; | 923 | old = tty->termios; |
924 | tty->termios->c_cflag &= ~CLOCAL; | 924 | tty->termios.c_cflag &= ~CLOCAL; |
925 | tty->termios->c_cflag |= bit; | 925 | tty->termios.c_cflag |= bit; |
926 | if (tty->ops->set_termios) | 926 | if (tty->ops->set_termios) |
927 | tty->ops->set_termios(tty, &old); | 927 | tty->ops->set_termios(tty, &old); |
928 | if ((tty->termios->c_cflag & CLOCAL) != bit) | 928 | if ((tty->termios.c_cflag & CLOCAL) != bit) |
929 | ret = -EINVAL; | 929 | ret = -EINVAL; |
930 | mutex_unlock(&tty->termios_mutex); | 930 | mutex_unlock(&tty->termios_mutex); |
931 | return ret; | 931 | return ret; |
@@ -1031,7 +1031,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file, | |||
1031 | (struct termios __user *) arg)) | 1031 | (struct termios __user *) arg)) |
1032 | return -EFAULT; | 1032 | return -EFAULT; |
1033 | mutex_lock(&real_tty->termios_mutex); | 1033 | mutex_lock(&real_tty->termios_mutex); |
1034 | memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios)); | 1034 | real_tty->termios_locked = kterm; |
1035 | mutex_unlock(&real_tty->termios_mutex); | 1035 | mutex_unlock(&real_tty->termios_mutex); |
1036 | return 0; | 1036 | return 0; |
1037 | #else | 1037 | #else |
@@ -1048,7 +1048,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file, | |||
1048 | (struct termios __user *) arg)) | 1048 | (struct termios __user *) arg)) |
1049 | return -EFAULT; | 1049 | return -EFAULT; |
1050 | mutex_lock(&real_tty->termios_mutex); | 1050 | mutex_lock(&real_tty->termios_mutex); |
1051 | memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios)); | 1051 | real_tty->termios_locked = kterm; |
1052 | mutex_unlock(&real_tty->termios_mutex); | 1052 | mutex_unlock(&real_tty->termios_mutex); |
1053 | return ret; | 1053 | return ret; |
1054 | #endif | 1054 | #endif |
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c index 6f99c9959f0c..3d0687197d09 100644 --- a/drivers/tty/tty_ldisc.c +++ b/drivers/tty/tty_ldisc.c | |||
@@ -413,7 +413,7 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); | |||
413 | static void tty_set_termios_ldisc(struct tty_struct *tty, int num) | 413 | static void tty_set_termios_ldisc(struct tty_struct *tty, int num) |
414 | { | 414 | { |
415 | mutex_lock(&tty->termios_mutex); | 415 | mutex_lock(&tty->termios_mutex); |
416 | tty->termios->c_line = num; | 416 | tty->termios.c_line = num; |
417 | mutex_unlock(&tty->termios_mutex); | 417 | mutex_unlock(&tty->termios_mutex); |
418 | } | 418 | } |
419 | 419 | ||
@@ -722,9 +722,9 @@ enable: | |||
722 | static void tty_reset_termios(struct tty_struct *tty) | 722 | static void tty_reset_termios(struct tty_struct *tty) |
723 | { | 723 | { |
724 | mutex_lock(&tty->termios_mutex); | 724 | mutex_lock(&tty->termios_mutex); |
725 | *tty->termios = tty->driver->init_termios; | 725 | tty->termios = tty->driver->init_termios; |
726 | tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); | 726 | tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); |
727 | tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); | 727 | tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); |
728 | mutex_unlock(&tty->termios_mutex); | 728 | mutex_unlock(&tty->termios_mutex); |
729 | } | 729 | } |
730 | 730 | ||
@@ -846,7 +846,7 @@ retry: | |||
846 | 846 | ||
847 | if (reset == 0) { | 847 | if (reset == 0) { |
848 | 848 | ||
849 | if (!tty_ldisc_reinit(tty, tty->termios->c_line)) | 849 | if (!tty_ldisc_reinit(tty, tty->termios.c_line)) |
850 | err = tty_ldisc_open(tty, tty->ldisc); | 850 | err = tty_ldisc_open(tty, tty->ldisc); |
851 | else | 851 | else |
852 | err = 1; | 852 | err = 1; |
@@ -912,7 +912,6 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty) | |||
912 | * race with the set_ldisc code path. | 912 | * race with the set_ldisc code path. |
913 | */ | 913 | */ |
914 | 914 | ||
915 | tty_unlock(); | ||
916 | tty_ldisc_halt(tty); | 915 | tty_ldisc_halt(tty); |
917 | tty_ldisc_flush_works(tty); | 916 | tty_ldisc_flush_works(tty); |
918 | tty_lock(); | 917 | tty_lock(); |
@@ -930,6 +929,8 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty) | |||
930 | tty_set_termios_ldisc(tty, N_TTY); | 929 | tty_set_termios_ldisc(tty, N_TTY); |
931 | mutex_unlock(&tty->ldisc_mutex); | 930 | mutex_unlock(&tty->ldisc_mutex); |
932 | 931 | ||
932 | tty_unlock(); | ||
933 | |||
933 | /* This will need doing differently if we need to lock */ | 934 | /* This will need doing differently if we need to lock */ |
934 | if (o_tty) | 935 | if (o_tty) |
935 | tty_ldisc_release(o_tty, NULL); | 936 | tty_ldisc_release(o_tty, NULL); |
diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c index bf6e238146ae..edcb827c1286 100644 --- a/drivers/tty/tty_port.c +++ b/drivers/tty/tty_port.c | |||
@@ -33,6 +33,15 @@ void tty_port_init(struct tty_port *port) | |||
33 | } | 33 | } |
34 | EXPORT_SYMBOL(tty_port_init); | 34 | EXPORT_SYMBOL(tty_port_init); |
35 | 35 | ||
36 | struct device *tty_port_register_device(struct tty_port *port, | ||
37 | struct tty_driver *driver, unsigned index, | ||
38 | struct device *device) | ||
39 | { | ||
40 | driver->ports[index] = port; | ||
41 | return tty_register_device(driver, index, device); | ||
42 | } | ||
43 | EXPORT_SYMBOL_GPL(tty_port_register_device); | ||
44 | |||
36 | int tty_port_alloc_xmit_buf(struct tty_port *port) | 45 | int tty_port_alloc_xmit_buf(struct tty_port *port) |
37 | { | 46 | { |
38 | /* We may sleep in get_zeroed_page() */ | 47 | /* We may sleep in get_zeroed_page() */ |
@@ -246,7 +255,7 @@ int tty_port_block_til_ready(struct tty_port *port, | |||
246 | } | 255 | } |
247 | if (filp->f_flags & O_NONBLOCK) { | 256 | if (filp->f_flags & O_NONBLOCK) { |
248 | /* Indicate we are open */ | 257 | /* Indicate we are open */ |
249 | if (tty->termios->c_cflag & CBAUD) | 258 | if (tty->termios.c_cflag & CBAUD) |
250 | tty_port_raise_dtr_rts(port); | 259 | tty_port_raise_dtr_rts(port); |
251 | port->flags |= ASYNC_NORMAL_ACTIVE; | 260 | port->flags |= ASYNC_NORMAL_ACTIVE; |
252 | return 0; | 261 | return 0; |
@@ -270,7 +279,7 @@ int tty_port_block_til_ready(struct tty_port *port, | |||
270 | 279 | ||
271 | while (1) { | 280 | while (1) { |
272 | /* Indicate we are open */ | 281 | /* Indicate we are open */ |
273 | if (tty->termios->c_cflag & CBAUD) | 282 | if (tty->termios.c_cflag & CBAUD) |
274 | tty_port_raise_dtr_rts(port); | 283 | tty_port_raise_dtr_rts(port); |
275 | 284 | ||
276 | prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE); | 285 | prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE); |
@@ -369,7 +378,7 @@ int tty_port_close_start(struct tty_port *port, | |||
369 | 378 | ||
370 | /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to | 379 | /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to |
371 | hang up the line */ | 380 | hang up the line */ |
372 | if (tty->termios->c_cflag & HUPCL) | 381 | if (tty->termios.c_cflag & HUPCL) |
373 | tty_port_lower_dtr_rts(port); | 382 | tty_port_lower_dtr_rts(port); |
374 | 383 | ||
375 | /* Don't call port->drop for the last reference. Callers will want | 384 | /* Don't call port->drop for the last reference. Callers will want |
@@ -413,6 +422,14 @@ void tty_port_close(struct tty_port *port, struct tty_struct *tty, | |||
413 | } | 422 | } |
414 | EXPORT_SYMBOL(tty_port_close); | 423 | EXPORT_SYMBOL(tty_port_close); |
415 | 424 | ||
425 | int tty_port_install(struct tty_port *port, struct tty_driver *driver, | ||
426 | struct tty_struct *tty) | ||
427 | { | ||
428 | tty->port = port; | ||
429 | return tty_standard_install(driver, tty); | ||
430 | } | ||
431 | EXPORT_SYMBOL_GPL(tty_port_install); | ||
432 | |||
416 | int tty_port_open(struct tty_port *port, struct tty_struct *tty, | 433 | int tty_port_open(struct tty_port *port, struct tty_struct *tty, |
417 | struct file *filp) | 434 | struct file *filp) |
418 | { | 435 | { |
diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c index 48cc6f25cfd3..681765baef69 100644 --- a/drivers/tty/vt/keyboard.c +++ b/drivers/tty/vt/keyboard.c | |||
@@ -119,6 +119,7 @@ static const int NR_TYPES = ARRAY_SIZE(max_vals); | |||
119 | 119 | ||
120 | static struct input_handler kbd_handler; | 120 | static struct input_handler kbd_handler; |
121 | static DEFINE_SPINLOCK(kbd_event_lock); | 121 | static DEFINE_SPINLOCK(kbd_event_lock); |
122 | static DEFINE_SPINLOCK(led_lock); | ||
122 | static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; /* keyboard key bitmap */ | 123 | static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; /* keyboard key bitmap */ |
123 | static unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */ | 124 | static unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */ |
124 | static bool dead_key_next; | 125 | static bool dead_key_next; |
@@ -310,7 +311,7 @@ static void put_queue(struct vc_data *vc, int ch) | |||
310 | 311 | ||
311 | if (tty) { | 312 | if (tty) { |
312 | tty_insert_flip_char(tty, ch, 0); | 313 | tty_insert_flip_char(tty, ch, 0); |
313 | con_schedule_flip(tty); | 314 | tty_schedule_flip(tty); |
314 | } | 315 | } |
315 | } | 316 | } |
316 | 317 | ||
@@ -325,7 +326,7 @@ static void puts_queue(struct vc_data *vc, char *cp) | |||
325 | tty_insert_flip_char(tty, *cp, 0); | 326 | tty_insert_flip_char(tty, *cp, 0); |
326 | cp++; | 327 | cp++; |
327 | } | 328 | } |
328 | con_schedule_flip(tty); | 329 | tty_schedule_flip(tty); |
329 | } | 330 | } |
330 | 331 | ||
331 | static void applkey(struct vc_data *vc, int key, char mode) | 332 | static void applkey(struct vc_data *vc, int key, char mode) |
@@ -586,7 +587,7 @@ static void fn_send_intr(struct vc_data *vc) | |||
586 | if (!tty) | 587 | if (!tty) |
587 | return; | 588 | return; |
588 | tty_insert_flip_char(tty, 0, TTY_BREAK); | 589 | tty_insert_flip_char(tty, 0, TTY_BREAK); |
589 | con_schedule_flip(tty); | 590 | tty_schedule_flip(tty); |
590 | } | 591 | } |
591 | 592 | ||
592 | static void fn_scroll_forw(struct vc_data *vc) | 593 | static void fn_scroll_forw(struct vc_data *vc) |
@@ -984,7 +985,7 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag) | |||
984 | * or (ii) whatever pattern of lights people want to show using KDSETLED, | 985 | * or (ii) whatever pattern of lights people want to show using KDSETLED, |
985 | * or (iii) specified bits of specified words in kernel memory. | 986 | * or (iii) specified bits of specified words in kernel memory. |
986 | */ | 987 | */ |
987 | unsigned char getledstate(void) | 988 | static unsigned char getledstate(void) |
988 | { | 989 | { |
989 | return ledstate; | 990 | return ledstate; |
990 | } | 991 | } |
@@ -992,7 +993,7 @@ unsigned char getledstate(void) | |||
992 | void setledstate(struct kbd_struct *kbd, unsigned int led) | 993 | void setledstate(struct kbd_struct *kbd, unsigned int led) |
993 | { | 994 | { |
994 | unsigned long flags; | 995 | unsigned long flags; |
995 | spin_lock_irqsave(&kbd_event_lock, flags); | 996 | spin_lock_irqsave(&led_lock, flags); |
996 | if (!(led & ~7)) { | 997 | if (!(led & ~7)) { |
997 | ledioctl = led; | 998 | ledioctl = led; |
998 | kbd->ledmode = LED_SHOW_IOCTL; | 999 | kbd->ledmode = LED_SHOW_IOCTL; |
@@ -1000,7 +1001,7 @@ void setledstate(struct kbd_struct *kbd, unsigned int led) | |||
1000 | kbd->ledmode = LED_SHOW_FLAGS; | 1001 | kbd->ledmode = LED_SHOW_FLAGS; |
1001 | 1002 | ||
1002 | set_leds(); | 1003 | set_leds(); |
1003 | spin_unlock_irqrestore(&kbd_event_lock, flags); | 1004 | spin_unlock_irqrestore(&led_lock, flags); |
1004 | } | 1005 | } |
1005 | 1006 | ||
1006 | static inline unsigned char getleds(void) | 1007 | static inline unsigned char getleds(void) |
@@ -1049,13 +1050,13 @@ static int kbd_update_leds_helper(struct input_handle *handle, void *data) | |||
1049 | */ | 1050 | */ |
1050 | int vt_get_leds(int console, int flag) | 1051 | int vt_get_leds(int console, int flag) |
1051 | { | 1052 | { |
1052 | unsigned long flags; | ||
1053 | struct kbd_struct * kbd = kbd_table + console; | 1053 | struct kbd_struct * kbd = kbd_table + console; |
1054 | int ret; | 1054 | int ret; |
1055 | unsigned long flags; | ||
1055 | 1056 | ||
1056 | spin_lock_irqsave(&kbd_event_lock, flags); | 1057 | spin_lock_irqsave(&led_lock, flags); |
1057 | ret = vc_kbd_led(kbd, flag); | 1058 | ret = vc_kbd_led(kbd, flag); |
1058 | spin_unlock_irqrestore(&kbd_event_lock, flags); | 1059 | spin_unlock_irqrestore(&led_lock, flags); |
1059 | 1060 | ||
1060 | return ret; | 1061 | return ret; |
1061 | } | 1062 | } |
@@ -1091,11 +1092,11 @@ void vt_set_led_state(int console, int leds) | |||
1091 | void vt_kbd_con_start(int console) | 1092 | void vt_kbd_con_start(int console) |
1092 | { | 1093 | { |
1093 | struct kbd_struct * kbd = kbd_table + console; | 1094 | struct kbd_struct * kbd = kbd_table + console; |
1094 | /* unsigned long flags; */ | 1095 | unsigned long flags; |
1095 | /* spin_lock_irqsave(&kbd_event_lock, flags); */ | 1096 | spin_lock_irqsave(&led_lock, flags); |
1096 | clr_vc_kbd_led(kbd, VC_SCROLLOCK); | 1097 | clr_vc_kbd_led(kbd, VC_SCROLLOCK); |
1097 | set_leds(); | 1098 | set_leds(); |
1098 | /* spin_unlock_irqrestore(&kbd_event_lock, flags); */ | 1099 | spin_unlock_irqrestore(&led_lock, flags); |
1099 | } | 1100 | } |
1100 | 1101 | ||
1101 | /** | 1102 | /** |
@@ -1104,21 +1105,15 @@ void vt_kbd_con_start(int console) | |||
1104 | * | 1105 | * |
1105 | * Handle console stop. This is a wrapper for the VT layer | 1106 | * Handle console stop. This is a wrapper for the VT layer |
1106 | * so that we can keep kbd knowledge internal | 1107 | * so that we can keep kbd knowledge internal |
1107 | * | ||
1108 | * FIXME: We eventually need to hold the kbd lock here to protect | ||
1109 | * the LED updating. We can't do it yet because fn_hold calls stop_tty | ||
1110 | * and start_tty under the kbd_event_lock, while normal tty paths | ||
1111 | * don't hold the lock. We probably need to split out an LED lock | ||
1112 | * but not during an -rc release! | ||
1113 | */ | 1108 | */ |
1114 | void vt_kbd_con_stop(int console) | 1109 | void vt_kbd_con_stop(int console) |
1115 | { | 1110 | { |
1116 | struct kbd_struct * kbd = kbd_table + console; | 1111 | struct kbd_struct * kbd = kbd_table + console; |
1117 | /* unsigned long flags; */ | 1112 | unsigned long flags; |
1118 | /* spin_lock_irqsave(&kbd_event_lock, flags); */ | 1113 | spin_lock_irqsave(&led_lock, flags); |
1119 | set_vc_kbd_led(kbd, VC_SCROLLOCK); | 1114 | set_vc_kbd_led(kbd, VC_SCROLLOCK); |
1120 | set_leds(); | 1115 | set_leds(); |
1121 | /* spin_unlock_irqrestore(&kbd_event_lock, flags); */ | 1116 | spin_unlock_irqrestore(&led_lock, flags); |
1122 | } | 1117 | } |
1123 | 1118 | ||
1124 | /* | 1119 | /* |
@@ -1130,7 +1125,12 @@ void vt_kbd_con_stop(int console) | |||
1130 | */ | 1125 | */ |
1131 | static void kbd_bh(unsigned long dummy) | 1126 | static void kbd_bh(unsigned long dummy) |
1132 | { | 1127 | { |
1133 | unsigned char leds = getleds(); | 1128 | unsigned char leds; |
1129 | unsigned long flags; | ||
1130 | |||
1131 | spin_lock_irqsave(&led_lock, flags); | ||
1132 | leds = getleds(); | ||
1133 | spin_unlock_irqrestore(&led_lock, flags); | ||
1134 | 1134 | ||
1135 | if (leds != ledstate) { | 1135 | if (leds != ledstate) { |
1136 | input_handler_for_each_handle(&kbd_handler, &leds, | 1136 | input_handler_for_each_handle(&kbd_handler, &leds, |
@@ -2035,11 +2035,11 @@ int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm) | |||
2035 | return -EPERM; | 2035 | return -EPERM; |
2036 | if (arg & ~0x77) | 2036 | if (arg & ~0x77) |
2037 | return -EINVAL; | 2037 | return -EINVAL; |
2038 | spin_lock_irqsave(&kbd_event_lock, flags); | 2038 | spin_lock_irqsave(&led_lock, flags); |
2039 | kbd->ledflagstate = (arg & 7); | 2039 | kbd->ledflagstate = (arg & 7); |
2040 | kbd->default_ledflagstate = ((arg >> 4) & 7); | 2040 | kbd->default_ledflagstate = ((arg >> 4) & 7); |
2041 | set_leds(); | 2041 | set_leds(); |
2042 | spin_unlock_irqrestore(&kbd_event_lock, flags); | 2042 | spin_unlock_irqrestore(&led_lock, flags); |
2043 | return 0; | 2043 | return 0; |
2044 | 2044 | ||
2045 | /* the ioctls below only set the lights, not the functions */ | 2045 | /* the ioctls below only set the lights, not the functions */ |
@@ -2134,8 +2134,10 @@ void vt_reset_keyboard(int console) | |||
2134 | clr_vc_kbd_mode(kbd, VC_CRLF); | 2134 | clr_vc_kbd_mode(kbd, VC_CRLF); |
2135 | kbd->lockstate = 0; | 2135 | kbd->lockstate = 0; |
2136 | kbd->slockstate = 0; | 2136 | kbd->slockstate = 0; |
2137 | spin_lock(&led_lock); | ||
2137 | kbd->ledmode = LED_SHOW_FLAGS; | 2138 | kbd->ledmode = LED_SHOW_FLAGS; |
2138 | kbd->ledflagstate = kbd->default_ledflagstate; | 2139 | kbd->ledflagstate = kbd->default_ledflagstate; |
2140 | spin_unlock(&led_lock); | ||
2139 | /* do not do set_leds here because this causes an endless tasklet loop | 2141 | /* do not do set_leds here because this causes an endless tasklet loop |
2140 | when the keyboard hasn't been initialized yet */ | 2142 | when the keyboard hasn't been initialized yet */ |
2141 | spin_unlock_irqrestore(&kbd_event_lock, flags); | 2143 | spin_unlock_irqrestore(&kbd_event_lock, flags); |
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 84cbf298c094..e07ded30fc7f 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
@@ -1380,7 +1380,7 @@ static void respond_string(const char *p, struct tty_struct *tty) | |||
1380 | tty_insert_flip_char(tty, *p, 0); | 1380 | tty_insert_flip_char(tty, *p, 0); |
1381 | p++; | 1381 | p++; |
1382 | } | 1382 | } |
1383 | con_schedule_flip(tty); | 1383 | tty_schedule_flip(tty); |
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | static void cursor_report(struct vc_data *vc, struct tty_struct *tty) | 1386 | static void cursor_report(struct vc_data *vc, struct tty_struct *tty) |
@@ -2792,41 +2792,52 @@ static void con_flush_chars(struct tty_struct *tty) | |||
2792 | /* | 2792 | /* |
2793 | * Allocate the console screen memory. | 2793 | * Allocate the console screen memory. |
2794 | */ | 2794 | */ |
2795 | static int con_open(struct tty_struct *tty, struct file *filp) | 2795 | static int con_install(struct tty_driver *driver, struct tty_struct *tty) |
2796 | { | 2796 | { |
2797 | unsigned int currcons = tty->index; | 2797 | unsigned int currcons = tty->index; |
2798 | int ret = 0; | 2798 | struct vc_data *vc; |
2799 | int ret; | ||
2799 | 2800 | ||
2800 | console_lock(); | 2801 | console_lock(); |
2801 | if (tty->driver_data == NULL) { | 2802 | ret = vc_allocate(currcons); |
2802 | ret = vc_allocate(currcons); | 2803 | if (ret) |
2803 | if (ret == 0) { | 2804 | goto unlock; |
2804 | struct vc_data *vc = vc_cons[currcons].d; | ||
2805 | 2805 | ||
2806 | /* Still being freed */ | 2806 | vc = vc_cons[currcons].d; |
2807 | if (vc->port.tty) { | ||
2808 | console_unlock(); | ||
2809 | return -ERESTARTSYS; | ||
2810 | } | ||
2811 | tty->driver_data = vc; | ||
2812 | vc->port.tty = tty; | ||
2813 | 2807 | ||
2814 | if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | 2808 | /* Still being freed */ |
2815 | tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; | 2809 | if (vc->port.tty) { |
2816 | tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; | 2810 | ret = -ERESTARTSYS; |
2817 | } | 2811 | goto unlock; |
2818 | if (vc->vc_utf) | ||
2819 | tty->termios->c_iflag |= IUTF8; | ||
2820 | else | ||
2821 | tty->termios->c_iflag &= ~IUTF8; | ||
2822 | console_unlock(); | ||
2823 | return ret; | ||
2824 | } | ||
2825 | } | 2812 | } |
2813 | |||
2814 | ret = tty_port_install(&vc->port, driver, tty); | ||
2815 | if (ret) | ||
2816 | goto unlock; | ||
2817 | |||
2818 | tty->driver_data = vc; | ||
2819 | vc->port.tty = tty; | ||
2820 | |||
2821 | if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | ||
2822 | tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; | ||
2823 | tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; | ||
2824 | } | ||
2825 | if (vc->vc_utf) | ||
2826 | tty->termios.c_iflag |= IUTF8; | ||
2827 | else | ||
2828 | tty->termios.c_iflag &= ~IUTF8; | ||
2829 | unlock: | ||
2826 | console_unlock(); | 2830 | console_unlock(); |
2827 | return ret; | 2831 | return ret; |
2828 | } | 2832 | } |
2829 | 2833 | ||
2834 | static int con_open(struct tty_struct *tty, struct file *filp) | ||
2835 | { | ||
2836 | /* everything done in install */ | ||
2837 | return 0; | ||
2838 | } | ||
2839 | |||
2840 | |||
2830 | static void con_close(struct tty_struct *tty, struct file *filp) | 2841 | static void con_close(struct tty_struct *tty, struct file *filp) |
2831 | { | 2842 | { |
2832 | /* Nothing to do - we defer to shutdown */ | 2843 | /* Nothing to do - we defer to shutdown */ |
@@ -2839,7 +2850,6 @@ static void con_shutdown(struct tty_struct *tty) | |||
2839 | console_lock(); | 2850 | console_lock(); |
2840 | vc->port.tty = NULL; | 2851 | vc->port.tty = NULL; |
2841 | console_unlock(); | 2852 | console_unlock(); |
2842 | tty_shutdown(tty); | ||
2843 | } | 2853 | } |
2844 | 2854 | ||
2845 | static int default_italic_color = 2; // green (ASCII) | 2855 | static int default_italic_color = 2; // green (ASCII) |
@@ -2947,6 +2957,7 @@ static int __init con_init(void) | |||
2947 | console_initcall(con_init); | 2957 | console_initcall(con_init); |
2948 | 2958 | ||
2949 | static const struct tty_operations con_ops = { | 2959 | static const struct tty_operations con_ops = { |
2960 | .install = con_install, | ||
2950 | .open = con_open, | 2961 | .open = con_open, |
2951 | .close = con_close, | 2962 | .close = con_close, |
2952 | .write = con_write, | 2963 | .write = con_write, |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 56d6bf668488..18f4e62aaa75 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -826,7 +826,7 @@ static void acm_tty_set_termios(struct tty_struct *tty, | |||
826 | struct ktermios *termios_old) | 826 | struct ktermios *termios_old) |
827 | { | 827 | { |
828 | struct acm *acm = tty->driver_data; | 828 | struct acm *acm = tty->driver_data; |
829 | struct ktermios *termios = tty->termios; | 829 | struct ktermios *termios = &tty->termios; |
830 | struct usb_cdc_line_coding newline; | 830 | struct usb_cdc_line_coding newline; |
831 | int newctrl = acm->ctrlout; | 831 | int newctrl = acm->ctrlout; |
832 | 832 | ||
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index f8ce97d8b0ad..3b98fb733362 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -215,7 +215,7 @@ static void ark3116_release(struct usb_serial *serial) | |||
215 | 215 | ||
216 | static void ark3116_init_termios(struct tty_struct *tty) | 216 | static void ark3116_init_termios(struct tty_struct *tty) |
217 | { | 217 | { |
218 | struct ktermios *termios = tty->termios; | 218 | struct ktermios *termios = &tty->termios; |
219 | *termios = tty_std_termios; | 219 | *termios = tty_std_termios; |
220 | termios->c_cflag = B9600 | CS8 | 220 | termios->c_cflag = B9600 | CS8 |
221 | | CREAD | HUPCL | CLOCAL; | 221 | | CREAD | HUPCL | CLOCAL; |
@@ -229,7 +229,7 @@ static void ark3116_set_termios(struct tty_struct *tty, | |||
229 | { | 229 | { |
230 | struct usb_serial *serial = port->serial; | 230 | struct usb_serial *serial = port->serial; |
231 | struct ark3116_private *priv = usb_get_serial_port_data(port); | 231 | struct ark3116_private *priv = usb_get_serial_port_data(port); |
232 | struct ktermios *termios = tty->termios; | 232 | struct ktermios *termios = &tty->termios; |
233 | unsigned int cflag = termios->c_cflag; | 233 | unsigned int cflag = termios->c_cflag; |
234 | int bps = tty_get_baud_rate(tty); | 234 | int bps = tty_get_baud_rate(tty); |
235 | int quot; | 235 | int quot; |
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 6b7365632951..a46df73ee96e 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c | |||
@@ -307,7 +307,7 @@ static void belkin_sa_set_termios(struct tty_struct *tty, | |||
307 | unsigned long control_state; | 307 | unsigned long control_state; |
308 | int bad_flow_control; | 308 | int bad_flow_control; |
309 | speed_t baud; | 309 | speed_t baud; |
310 | struct ktermios *termios = tty->termios; | 310 | struct ktermios *termios = &tty->termios; |
311 | 311 | ||
312 | iflag = termios->c_iflag; | 312 | iflag = termios->c_iflag; |
313 | cflag = termios->c_cflag; | 313 | cflag = termios->c_cflag; |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 1e71079ce33b..ba5e07e188a0 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -469,7 +469,7 @@ static void cp210x_get_termios(struct tty_struct *tty, | |||
469 | 469 | ||
470 | if (tty) { | 470 | if (tty) { |
471 | cp210x_get_termios_port(tty->driver_data, | 471 | cp210x_get_termios_port(tty->driver_data, |
472 | &tty->termios->c_cflag, &baud); | 472 | &tty->termios.c_cflag, &baud); |
473 | tty_encode_baud_rate(tty, baud, baud); | 473 | tty_encode_baud_rate(tty, baud, baud); |
474 | } | 474 | } |
475 | 475 | ||
@@ -631,7 +631,7 @@ static void cp210x_change_speed(struct tty_struct *tty, | |||
631 | { | 631 | { |
632 | u32 baud; | 632 | u32 baud; |
633 | 633 | ||
634 | baud = tty->termios->c_ospeed; | 634 | baud = tty->termios.c_ospeed; |
635 | 635 | ||
636 | /* This maps the requested rate to a rate valid on cp2102 or cp2103, | 636 | /* This maps the requested rate to a rate valid on cp2102 or cp2103, |
637 | * or to an arbitrary rate in [1M,2M]. | 637 | * or to an arbitrary rate in [1M,2M]. |
@@ -665,10 +665,10 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
665 | if (!tty) | 665 | if (!tty) |
666 | return; | 666 | return; |
667 | 667 | ||
668 | cflag = tty->termios->c_cflag; | 668 | cflag = tty->termios.c_cflag; |
669 | old_cflag = old_termios->c_cflag; | 669 | old_cflag = old_termios->c_cflag; |
670 | 670 | ||
671 | if (tty->termios->c_ospeed != old_termios->c_ospeed) | 671 | if (tty->termios.c_ospeed != old_termios->c_ospeed) |
672 | cp210x_change_speed(tty, port, old_termios); | 672 | cp210x_change_speed(tty, port, old_termios); |
673 | 673 | ||
674 | /* If the number of data bits is to be updated */ | 674 | /* If the number of data bits is to be updated */ |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index b78c34eb5d3f..be34f153e566 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -922,38 +922,38 @@ static void cypress_set_termios(struct tty_struct *tty, | |||
922 | early enough */ | 922 | early enough */ |
923 | if (!priv->termios_initialized) { | 923 | if (!priv->termios_initialized) { |
924 | if (priv->chiptype == CT_EARTHMATE) { | 924 | if (priv->chiptype == CT_EARTHMATE) { |
925 | *(tty->termios) = tty_std_termios; | 925 | tty->termios = tty_std_termios; |
926 | tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | | 926 | tty->termios.c_cflag = B4800 | CS8 | CREAD | HUPCL | |
927 | CLOCAL; | 927 | CLOCAL; |
928 | tty->termios->c_ispeed = 4800; | 928 | tty->termios.c_ispeed = 4800; |
929 | tty->termios->c_ospeed = 4800; | 929 | tty->termios.c_ospeed = 4800; |
930 | } else if (priv->chiptype == CT_CYPHIDCOM) { | 930 | } else if (priv->chiptype == CT_CYPHIDCOM) { |
931 | *(tty->termios) = tty_std_termios; | 931 | tty->termios = tty_std_termios; |
932 | tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | | 932 | tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | |
933 | CLOCAL; | 933 | CLOCAL; |
934 | tty->termios->c_ispeed = 9600; | 934 | tty->termios.c_ispeed = 9600; |
935 | tty->termios->c_ospeed = 9600; | 935 | tty->termios.c_ospeed = 9600; |
936 | } else if (priv->chiptype == CT_CA42V2) { | 936 | } else if (priv->chiptype == CT_CA42V2) { |
937 | *(tty->termios) = tty_std_termios; | 937 | tty->termios = tty_std_termios; |
938 | tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | | 938 | tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | |
939 | CLOCAL; | 939 | CLOCAL; |
940 | tty->termios->c_ispeed = 9600; | 940 | tty->termios.c_ispeed = 9600; |
941 | tty->termios->c_ospeed = 9600; | 941 | tty->termios.c_ospeed = 9600; |
942 | } | 942 | } |
943 | priv->termios_initialized = 1; | 943 | priv->termios_initialized = 1; |
944 | } | 944 | } |
945 | spin_unlock_irqrestore(&priv->lock, flags); | 945 | spin_unlock_irqrestore(&priv->lock, flags); |
946 | 946 | ||
947 | /* Unsupported features need clearing */ | 947 | /* Unsupported features need clearing */ |
948 | tty->termios->c_cflag &= ~(CMSPAR|CRTSCTS); | 948 | tty->termios.c_cflag &= ~(CMSPAR|CRTSCTS); |
949 | 949 | ||
950 | cflag = tty->termios->c_cflag; | 950 | cflag = tty->termios.c_cflag; |
951 | iflag = tty->termios->c_iflag; | 951 | iflag = tty->termios.c_iflag; |
952 | 952 | ||
953 | /* check if there are new settings */ | 953 | /* check if there are new settings */ |
954 | if (old_termios) { | 954 | if (old_termios) { |
955 | spin_lock_irqsave(&priv->lock, flags); | 955 | spin_lock_irqsave(&priv->lock, flags); |
956 | priv->tmp_termios = *(tty->termios); | 956 | priv->tmp_termios = tty->termios; |
957 | spin_unlock_irqrestore(&priv->lock, flags); | 957 | spin_unlock_irqrestore(&priv->lock, flags); |
958 | } | 958 | } |
959 | 959 | ||
@@ -1021,7 +1021,7 @@ static void cypress_set_termios(struct tty_struct *tty, | |||
1021 | "4800bps."); | 1021 | "4800bps."); |
1022 | /* define custom termios settings for NMEA protocol */ | 1022 | /* define custom termios settings for NMEA protocol */ |
1023 | 1023 | ||
1024 | tty->termios->c_iflag /* input modes - */ | 1024 | tty->termios.c_iflag /* input modes - */ |
1025 | &= ~(IGNBRK /* disable ignore break */ | 1025 | &= ~(IGNBRK /* disable ignore break */ |
1026 | | BRKINT /* disable break causes interrupt */ | 1026 | | BRKINT /* disable break causes interrupt */ |
1027 | | PARMRK /* disable mark parity errors */ | 1027 | | PARMRK /* disable mark parity errors */ |
@@ -1031,10 +1031,10 @@ static void cypress_set_termios(struct tty_struct *tty, | |||
1031 | | ICRNL /* disable translate CR to NL */ | 1031 | | ICRNL /* disable translate CR to NL */ |
1032 | | IXON); /* disable enable XON/XOFF flow control */ | 1032 | | IXON); /* disable enable XON/XOFF flow control */ |
1033 | 1033 | ||
1034 | tty->termios->c_oflag /* output modes */ | 1034 | tty->termios.c_oflag /* output modes */ |
1035 | &= ~OPOST; /* disable postprocess output char */ | 1035 | &= ~OPOST; /* disable postprocess output char */ |
1036 | 1036 | ||
1037 | tty->termios->c_lflag /* line discipline modes */ | 1037 | tty->termios.c_lflag /* line discipline modes */ |
1038 | &= ~(ECHO /* disable echo input characters */ | 1038 | &= ~(ECHO /* disable echo input characters */ |
1039 | | ECHONL /* disable echo new line */ | 1039 | | ECHONL /* disable echo new line */ |
1040 | | ICANON /* disable erase, kill, werase, and rprnt | 1040 | | ICANON /* disable erase, kill, werase, and rprnt |
@@ -1200,7 +1200,7 @@ static void cypress_read_int_callback(struct urb *urb) | |||
1200 | 1200 | ||
1201 | /* hangup, as defined in acm.c... this might be a bad place for it | 1201 | /* hangup, as defined in acm.c... this might be a bad place for it |
1202 | * though */ | 1202 | * though */ |
1203 | if (tty && !(tty->termios->c_cflag & CLOCAL) && | 1203 | if (tty && !(tty->termios.c_cflag & CLOCAL) && |
1204 | !(priv->current_status & UART_CD)) { | 1204 | !(priv->current_status & UART_CD)) { |
1205 | dbg("%s - calling hangup", __func__); | 1205 | dbg("%s - calling hangup", __func__); |
1206 | tty_hangup(tty); | 1206 | tty_hangup(tty); |
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index b5cd838093ef..afd9d2ec577b 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -687,8 +687,8 @@ static void digi_set_termios(struct tty_struct *tty, | |||
687 | struct usb_serial_port *port, struct ktermios *old_termios) | 687 | struct usb_serial_port *port, struct ktermios *old_termios) |
688 | { | 688 | { |
689 | struct digi_port *priv = usb_get_serial_port_data(port); | 689 | struct digi_port *priv = usb_get_serial_port_data(port); |
690 | unsigned int iflag = tty->termios->c_iflag; | 690 | unsigned int iflag = tty->termios.c_iflag; |
691 | unsigned int cflag = tty->termios->c_cflag; | 691 | unsigned int cflag = tty->termios.c_cflag; |
692 | unsigned int old_iflag = old_termios->c_iflag; | 692 | unsigned int old_iflag = old_termios->c_iflag; |
693 | unsigned int old_cflag = old_termios->c_cflag; | 693 | unsigned int old_cflag = old_termios->c_cflag; |
694 | unsigned char buf[32]; | 694 | unsigned char buf[32]; |
@@ -709,7 +709,7 @@ static void digi_set_termios(struct tty_struct *tty, | |||
709 | /* don't set RTS if using hardware flow control */ | 709 | /* don't set RTS if using hardware flow control */ |
710 | /* and throttling input */ | 710 | /* and throttling input */ |
711 | modem_signals = TIOCM_DTR; | 711 | modem_signals = TIOCM_DTR; |
712 | if (!(tty->termios->c_cflag & CRTSCTS) || | 712 | if (!(tty->termios.c_cflag & CRTSCTS) || |
713 | !test_bit(TTY_THROTTLED, &tty->flags)) | 713 | !test_bit(TTY_THROTTLED, &tty->flags)) |
714 | modem_signals |= TIOCM_RTS; | 714 | modem_signals |= TIOCM_RTS; |
715 | digi_set_modem_signals(port, modem_signals, 1); | 715 | digi_set_modem_signals(port, modem_signals, 1); |
@@ -748,7 +748,7 @@ static void digi_set_termios(struct tty_struct *tty, | |||
748 | } | 748 | } |
749 | } | 749 | } |
750 | /* set parity */ | 750 | /* set parity */ |
751 | tty->termios->c_cflag &= ~CMSPAR; | 751 | tty->termios.c_cflag &= ~CMSPAR; |
752 | 752 | ||
753 | if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) { | 753 | if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) { |
754 | if (cflag&PARENB) { | 754 | if (cflag&PARENB) { |
@@ -1124,8 +1124,8 @@ static int digi_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1124 | 1124 | ||
1125 | /* set termios settings */ | 1125 | /* set termios settings */ |
1126 | if (tty) { | 1126 | if (tty) { |
1127 | not_termios.c_cflag = ~tty->termios->c_cflag; | 1127 | not_termios.c_cflag = ~tty->termios.c_cflag; |
1128 | not_termios.c_iflag = ~tty->termios->c_iflag; | 1128 | not_termios.c_iflag = ~tty->termios.c_iflag; |
1129 | digi_set_termios(tty, port, ¬_termios); | 1129 | digi_set_termios(tty, port, ¬_termios); |
1130 | } | 1130 | } |
1131 | return 0; | 1131 | return 0; |
@@ -1500,7 +1500,7 @@ static int digi_read_oob_callback(struct urb *urb) | |||
1500 | 1500 | ||
1501 | rts = 0; | 1501 | rts = 0; |
1502 | if (tty) | 1502 | if (tty) |
1503 | rts = tty->termios->c_cflag & CRTSCTS; | 1503 | rts = tty->termios.c_cflag & CRTSCTS; |
1504 | 1504 | ||
1505 | if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) { | 1505 | if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) { |
1506 | spin_lock(&priv->dp_port_lock); | 1506 | spin_lock(&priv->dp_port_lock); |
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index cdf61dd07318..34e86383090a 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
@@ -87,7 +87,7 @@ static int empeg_startup(struct usb_serial *serial) | |||
87 | 87 | ||
88 | static void empeg_init_termios(struct tty_struct *tty) | 88 | static void empeg_init_termios(struct tty_struct *tty) |
89 | { | 89 | { |
90 | struct ktermios *termios = tty->termios; | 90 | struct ktermios *termios = &tty->termios; |
91 | 91 | ||
92 | /* | 92 | /* |
93 | * The empeg-car player wants these particular tty settings. | 93 | * The empeg-car player wants these particular tty settings. |
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index 499b15fd82f1..79451ee12ca0 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c | |||
@@ -173,10 +173,11 @@ static void f81232_set_termios(struct tty_struct *tty, | |||
173 | /* FIXME - Stubbed out for now */ | 173 | /* FIXME - Stubbed out for now */ |
174 | 174 | ||
175 | /* Don't change anything if nothing has changed */ | 175 | /* Don't change anything if nothing has changed */ |
176 | if (!tty_termios_hw_change(tty->termios, old_termios)) | 176 | if (!tty_termios_hw_change(&tty->termios, old_termios)) |
177 | return; | 177 | return; |
178 | 178 | ||
179 | /* Do the real work here... */ | 179 | /* Do the real work here... */ |
180 | tty_termios_copy_hw(&tty->termios, old_termios); | ||
180 | } | 181 | } |
181 | 182 | ||
182 | static int f81232_tiocmget(struct tty_struct *tty) | 183 | static int f81232_tiocmget(struct tty_struct *tty) |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index bc912e5a3beb..4b8b41a3351f 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -2081,7 +2081,7 @@ static void ftdi_set_termios(struct tty_struct *tty, | |||
2081 | { | 2081 | { |
2082 | struct usb_device *dev = port->serial->dev; | 2082 | struct usb_device *dev = port->serial->dev; |
2083 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 2083 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
2084 | struct ktermios *termios = tty->termios; | 2084 | struct ktermios *termios = &tty->termios; |
2085 | unsigned int cflag = termios->c_cflag; | 2085 | unsigned int cflag = termios->c_cflag; |
2086 | __u16 urb_value; /* will hold the new flags */ | 2086 | __u16 urb_value; /* will hold the new flags */ |
2087 | 2087 | ||
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index e1f5ccd1e8f8..f435575c4e6e 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -1458,7 +1458,7 @@ static void edge_throttle(struct tty_struct *tty) | |||
1458 | } | 1458 | } |
1459 | 1459 | ||
1460 | /* if we are implementing RTS/CTS, toggle that line */ | 1460 | /* if we are implementing RTS/CTS, toggle that line */ |
1461 | if (tty->termios->c_cflag & CRTSCTS) { | 1461 | if (tty->termios.c_cflag & CRTSCTS) { |
1462 | edge_port->shadowMCR &= ~MCR_RTS; | 1462 | edge_port->shadowMCR &= ~MCR_RTS; |
1463 | status = send_cmd_write_uart_register(edge_port, MCR, | 1463 | status = send_cmd_write_uart_register(edge_port, MCR, |
1464 | edge_port->shadowMCR); | 1464 | edge_port->shadowMCR); |
@@ -1497,7 +1497,7 @@ static void edge_unthrottle(struct tty_struct *tty) | |||
1497 | return; | 1497 | return; |
1498 | } | 1498 | } |
1499 | /* if we are implementing RTS/CTS, toggle that line */ | 1499 | /* if we are implementing RTS/CTS, toggle that line */ |
1500 | if (tty->termios->c_cflag & CRTSCTS) { | 1500 | if (tty->termios.c_cflag & CRTSCTS) { |
1501 | edge_port->shadowMCR |= MCR_RTS; | 1501 | edge_port->shadowMCR |= MCR_RTS; |
1502 | send_cmd_write_uart_register(edge_port, MCR, | 1502 | send_cmd_write_uart_register(edge_port, MCR, |
1503 | edge_port->shadowMCR); | 1503 | edge_port->shadowMCR); |
@@ -1516,9 +1516,9 @@ static void edge_set_termios(struct tty_struct *tty, | |||
1516 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 1516 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
1517 | unsigned int cflag; | 1517 | unsigned int cflag; |
1518 | 1518 | ||
1519 | cflag = tty->termios->c_cflag; | 1519 | cflag = tty->termios.c_cflag; |
1520 | dbg("%s - clfag %08x iflag %08x", __func__, | 1520 | dbg("%s - clfag %08x iflag %08x", __func__, |
1521 | tty->termios->c_cflag, tty->termios->c_iflag); | 1521 | tty->termios.c_cflag, tty->termios.c_iflag); |
1522 | dbg("%s - old clfag %08x old iflag %08x", __func__, | 1522 | dbg("%s - old clfag %08x old iflag %08x", __func__, |
1523 | old_termios->c_cflag, old_termios->c_iflag); | 1523 | old_termios->c_cflag, old_termios->c_iflag); |
1524 | 1524 | ||
@@ -1987,7 +1987,7 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial, | |||
1987 | tty = tty_port_tty_get(&edge_port->port->port); | 1987 | tty = tty_port_tty_get(&edge_port->port->port); |
1988 | if (tty) { | 1988 | if (tty) { |
1989 | change_port_settings(tty, | 1989 | change_port_settings(tty, |
1990 | edge_port, tty->termios); | 1990 | edge_port, &tty->termios); |
1991 | tty_kref_put(tty); | 1991 | tty_kref_put(tty); |
1992 | } | 1992 | } |
1993 | 1993 | ||
@@ -2570,7 +2570,7 @@ static void change_port_settings(struct tty_struct *tty, | |||
2570 | return; | 2570 | return; |
2571 | } | 2571 | } |
2572 | 2572 | ||
2573 | cflag = tty->termios->c_cflag; | 2573 | cflag = tty->termios.c_cflag; |
2574 | 2574 | ||
2575 | switch (cflag & CSIZE) { | 2575 | switch (cflag & CSIZE) { |
2576 | case CS5: | 2576 | case CS5: |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 3936904c6419..765978ae752e 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -1870,7 +1870,7 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1870 | 1870 | ||
1871 | /* set up the port settings */ | 1871 | /* set up the port settings */ |
1872 | if (tty) | 1872 | if (tty) |
1873 | edge_set_termios(tty, port, tty->termios); | 1873 | edge_set_termios(tty, port, &tty->termios); |
1874 | 1874 | ||
1875 | /* open up the port */ | 1875 | /* open up the port */ |
1876 | 1876 | ||
@@ -2272,13 +2272,13 @@ static void change_port_settings(struct tty_struct *tty, | |||
2272 | 2272 | ||
2273 | config = kmalloc (sizeof (*config), GFP_KERNEL); | 2273 | config = kmalloc (sizeof (*config), GFP_KERNEL); |
2274 | if (!config) { | 2274 | if (!config) { |
2275 | *tty->termios = *old_termios; | 2275 | tty->termios = *old_termios; |
2276 | dev_err(&edge_port->port->dev, "%s - out of memory\n", | 2276 | dev_err(&edge_port->port->dev, "%s - out of memory\n", |
2277 | __func__); | 2277 | __func__); |
2278 | return; | 2278 | return; |
2279 | } | 2279 | } |
2280 | 2280 | ||
2281 | cflag = tty->termios->c_cflag; | 2281 | cflag = tty->termios.c_cflag; |
2282 | 2282 | ||
2283 | config->wFlags = 0; | 2283 | config->wFlags = 0; |
2284 | 2284 | ||
@@ -2362,7 +2362,7 @@ static void change_port_settings(struct tty_struct *tty, | |||
2362 | } else | 2362 | } else |
2363 | dbg("%s - OUTBOUND XON/XOFF is disabled", __func__); | 2363 | dbg("%s - OUTBOUND XON/XOFF is disabled", __func__); |
2364 | 2364 | ||
2365 | tty->termios->c_cflag &= ~CMSPAR; | 2365 | tty->termios.c_cflag &= ~CMSPAR; |
2366 | 2366 | ||
2367 | /* Round the baud rate */ | 2367 | /* Round the baud rate */ |
2368 | baud = tty_get_baud_rate(tty); | 2368 | baud = tty_get_baud_rate(tty); |
@@ -2408,10 +2408,10 @@ static void edge_set_termios(struct tty_struct *tty, | |||
2408 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2408 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2409 | unsigned int cflag; | 2409 | unsigned int cflag; |
2410 | 2410 | ||
2411 | cflag = tty->termios->c_cflag; | 2411 | cflag = tty->termios.c_cflag; |
2412 | 2412 | ||
2413 | dbg("%s - clfag %08x iflag %08x", __func__, | 2413 | dbg("%s - clfag %08x iflag %08x", __func__, |
2414 | tty->termios->c_cflag, tty->termios->c_iflag); | 2414 | tty->termios.c_cflag, tty->termios.c_iflag); |
2415 | dbg("%s - old clfag %08x old iflag %08x", __func__, | 2415 | dbg("%s - old clfag %08x old iflag %08x", __func__, |
2416 | old_termios->c_cflag, old_termios->c_iflag); | 2416 | old_termios->c_cflag, old_termios->c_iflag); |
2417 | dbg("%s - port %d", __func__, port->number); | 2417 | dbg("%s - port %d", __func__, port->number); |
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index fc09414c960f..5a96692b12a2 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c | |||
@@ -381,7 +381,7 @@ static void ir_set_termios(struct tty_struct *tty, | |||
381 | ir_xbof = ir_xbof_change(xbof) ; | 381 | ir_xbof = ir_xbof_change(xbof) ; |
382 | 382 | ||
383 | /* Only speed changes are supported */ | 383 | /* Only speed changes are supported */ |
384 | tty_termios_copy_hw(tty->termios, old_termios); | 384 | tty_termios_copy_hw(&tty->termios, old_termios); |
385 | tty_encode_baud_rate(tty, baud, baud); | 385 | tty_encode_baud_rate(tty, baud, baud); |
386 | 386 | ||
387 | /* | 387 | /* |
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 22b1eb5040b7..bf3864045c18 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
@@ -921,7 +921,7 @@ static void iuu_set_termios(struct tty_struct *tty, | |||
921 | { | 921 | { |
922 | const u32 supported_mask = CMSPAR|PARENB|PARODD; | 922 | const u32 supported_mask = CMSPAR|PARENB|PARODD; |
923 | struct iuu_private *priv = usb_get_serial_port_data(port); | 923 | struct iuu_private *priv = usb_get_serial_port_data(port); |
924 | unsigned int cflag = tty->termios->c_cflag; | 924 | unsigned int cflag = tty->termios.c_cflag; |
925 | int status; | 925 | int status; |
926 | u32 actual; | 926 | u32 actual; |
927 | u32 parity; | 927 | u32 parity; |
@@ -930,7 +930,7 @@ static void iuu_set_termios(struct tty_struct *tty, | |||
930 | u32 newval = cflag & supported_mask; | 930 | u32 newval = cflag & supported_mask; |
931 | 931 | ||
932 | /* Just use the ospeed. ispeed should be the same. */ | 932 | /* Just use the ospeed. ispeed should be the same. */ |
933 | baud = tty->termios->c_ospeed; | 933 | baud = tty->termios.c_ospeed; |
934 | 934 | ||
935 | dbg("%s - enter c_ospeed or baud=%d", __func__, baud); | 935 | dbg("%s - enter c_ospeed or baud=%d", __func__, baud); |
936 | 936 | ||
@@ -961,13 +961,13 @@ static void iuu_set_termios(struct tty_struct *tty, | |||
961 | * settings back over and then adjust them | 961 | * settings back over and then adjust them |
962 | */ | 962 | */ |
963 | if (old_termios) | 963 | if (old_termios) |
964 | tty_termios_copy_hw(tty->termios, old_termios); | 964 | tty_termios_copy_hw(&tty->termios, old_termios); |
965 | if (status != 0) /* Set failed - return old bits */ | 965 | if (status != 0) /* Set failed - return old bits */ |
966 | return; | 966 | return; |
967 | /* Re-encode speed, parity and csize */ | 967 | /* Re-encode speed, parity and csize */ |
968 | tty_encode_baud_rate(tty, baud, baud); | 968 | tty_encode_baud_rate(tty, baud, baud); |
969 | tty->termios->c_cflag &= ~(supported_mask|CSIZE); | 969 | tty->termios.c_cflag &= ~(supported_mask|CSIZE); |
970 | tty->termios->c_cflag |= newval | csize; | 970 | tty->termios.c_cflag |= newval | csize; |
971 | } | 971 | } |
972 | 972 | ||
973 | static void iuu_close(struct usb_serial_port *port) | 973 | static void iuu_close(struct usb_serial_port *port) |
@@ -993,14 +993,14 @@ static void iuu_close(struct usb_serial_port *port) | |||
993 | 993 | ||
994 | static void iuu_init_termios(struct tty_struct *tty) | 994 | static void iuu_init_termios(struct tty_struct *tty) |
995 | { | 995 | { |
996 | *(tty->termios) = tty_std_termios; | 996 | tty->termios = tty_std_termios; |
997 | tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 | 997 | tty->termios.c_cflag = CLOCAL | CREAD | CS8 | B9600 |
998 | | TIOCM_CTS | CSTOPB | PARENB; | 998 | | TIOCM_CTS | CSTOPB | PARENB; |
999 | tty->termios->c_ispeed = 9600; | 999 | tty->termios.c_ispeed = 9600; |
1000 | tty->termios->c_ospeed = 9600; | 1000 | tty->termios.c_ospeed = 9600; |
1001 | tty->termios->c_lflag = 0; | 1001 | tty->termios.c_lflag = 0; |
1002 | tty->termios->c_oflag = 0; | 1002 | tty->termios.c_oflag = 0; |
1003 | tty->termios->c_iflag = 0; | 1003 | tty->termios.c_iflag = 0; |
1004 | } | 1004 | } |
1005 | 1005 | ||
1006 | static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port) | 1006 | static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port) |
@@ -1012,8 +1012,8 @@ static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1012 | u32 actual; | 1012 | u32 actual; |
1013 | struct iuu_private *priv = usb_get_serial_port_data(port); | 1013 | struct iuu_private *priv = usb_get_serial_port_data(port); |
1014 | 1014 | ||
1015 | baud = tty->termios->c_ospeed; | 1015 | baud = tty->termios.c_ospeed; |
1016 | tty->termios->c_ispeed = baud; | 1016 | tty->termios.c_ispeed = baud; |
1017 | /* Re-encode speed */ | 1017 | /* Re-encode speed */ |
1018 | tty_encode_baud_rate(tty, baud, baud); | 1018 | tty_encode_baud_rate(tty, baud, baud); |
1019 | 1019 | ||
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index af0b70eaf032..7bcbb47e1449 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -158,7 +158,7 @@ static void keyspan_set_termios(struct tty_struct *tty, | |||
158 | 158 | ||
159 | p_priv = usb_get_serial_port_data(port); | 159 | p_priv = usb_get_serial_port_data(port); |
160 | d_details = p_priv->device_details; | 160 | d_details = p_priv->device_details; |
161 | cflag = tty->termios->c_cflag; | 161 | cflag = tty->termios.c_cflag; |
162 | device_port = port->number - port->serial->minor; | 162 | device_port = port->number - port->serial->minor; |
163 | 163 | ||
164 | /* Baud rate calculation takes baud rate as an integer | 164 | /* Baud rate calculation takes baud rate as an integer |
@@ -179,7 +179,7 @@ static void keyspan_set_termios(struct tty_struct *tty, | |||
179 | p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none; | 179 | p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none; |
180 | 180 | ||
181 | /* Mark/Space not supported */ | 181 | /* Mark/Space not supported */ |
182 | tty->termios->c_cflag &= ~CMSPAR; | 182 | tty->termios.c_cflag &= ~CMSPAR; |
183 | 183 | ||
184 | keyspan_send_setup(port, 0); | 184 | keyspan_send_setup(port, 0); |
185 | } | 185 | } |
@@ -1086,7 +1086,7 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1086 | 1086 | ||
1087 | device_port = port->number - port->serial->minor; | 1087 | device_port = port->number - port->serial->minor; |
1088 | if (tty) { | 1088 | if (tty) { |
1089 | cflag = tty->termios->c_cflag; | 1089 | cflag = tty->termios.c_cflag; |
1090 | /* Baud rate calculation takes baud rate as an integer | 1090 | /* Baud rate calculation takes baud rate as an integer |
1091 | so other rates can be generated if desired. */ | 1091 | so other rates can be generated if desired. */ |
1092 | baud_rate = tty_get_baud_rate(tty); | 1092 | baud_rate = tty_get_baud_rate(tty); |
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index a4ac3cfeffc4..dcada8615fcf 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
@@ -338,7 +338,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty, | |||
338 | 7[EOMS]1: 10 bit, b0/b7 is parity | 338 | 7[EOMS]1: 10 bit, b0/b7 is parity |
339 | 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?) | 339 | 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?) |
340 | 340 | ||
341 | HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS | 341 | HW flow control is dictated by the tty->termios.c_cflags & CRTSCTS |
342 | bit. | 342 | bit. |
343 | 343 | ||
344 | For now, just do baud. */ | 344 | For now, just do baud. */ |
@@ -353,7 +353,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty, | |||
353 | } | 353 | } |
354 | /* Only speed can change so copy the old h/w parameters | 354 | /* Only speed can change so copy the old h/w parameters |
355 | then encode the new speed */ | 355 | then encode the new speed */ |
356 | tty_termios_copy_hw(tty->termios, old_termios); | 356 | tty_termios_copy_hw(&tty->termios, old_termios); |
357 | tty_encode_baud_rate(tty, speed, speed); | 357 | tty_encode_baud_rate(tty, speed, speed); |
358 | } | 358 | } |
359 | 359 | ||
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 5bed59cd5776..def9ad258715 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
@@ -311,12 +311,12 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
311 | 311 | ||
312 | /* set up termios structure */ | 312 | /* set up termios structure */ |
313 | spin_lock_irqsave(&priv->lock, flags); | 313 | spin_lock_irqsave(&priv->lock, flags); |
314 | priv->termios.c_iflag = tty->termios->c_iflag; | 314 | priv->termios.c_iflag = tty->termios.c_iflag; |
315 | priv->termios.c_oflag = tty->termios->c_oflag; | 315 | priv->termios.c_oflag = tty->termios.c_oflag; |
316 | priv->termios.c_cflag = tty->termios->c_cflag; | 316 | priv->termios.c_cflag = tty->termios.c_cflag; |
317 | priv->termios.c_lflag = tty->termios->c_lflag; | 317 | priv->termios.c_lflag = tty->termios.c_lflag; |
318 | for (i = 0; i < NCCS; i++) | 318 | for (i = 0; i < NCCS; i++) |
319 | priv->termios.c_cc[i] = tty->termios->c_cc[i]; | 319 | priv->termios.c_cc[i] = tty->termios.c_cc[i]; |
320 | priv->cfg.pktlen = cfg->pktlen; | 320 | priv->cfg.pktlen = cfg->pktlen; |
321 | priv->cfg.baudrate = cfg->baudrate; | 321 | priv->cfg.baudrate = cfg->baudrate; |
322 | priv->cfg.databits = cfg->databits; | 322 | priv->cfg.databits = cfg->databits; |
@@ -445,9 +445,9 @@ static void klsi_105_set_termios(struct tty_struct *tty, | |||
445 | struct ktermios *old_termios) | 445 | struct ktermios *old_termios) |
446 | { | 446 | { |
447 | struct klsi_105_private *priv = usb_get_serial_port_data(port); | 447 | struct klsi_105_private *priv = usb_get_serial_port_data(port); |
448 | unsigned int iflag = tty->termios->c_iflag; | 448 | unsigned int iflag = tty->termios.c_iflag; |
449 | unsigned int old_iflag = old_termios->c_iflag; | 449 | unsigned int old_iflag = old_termios->c_iflag; |
450 | unsigned int cflag = tty->termios->c_cflag; | 450 | unsigned int cflag = tty->termios.c_cflag; |
451 | unsigned int old_cflag = old_termios->c_cflag; | 451 | unsigned int old_cflag = old_termios->c_cflag; |
452 | struct klsi_105_port_settings *cfg; | 452 | struct klsi_105_port_settings *cfg; |
453 | unsigned long flags; | 453 | unsigned long flags; |
@@ -560,7 +560,7 @@ static void klsi_105_set_termios(struct tty_struct *tty, | |||
560 | if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD)) | 560 | if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD)) |
561 | || (cflag & CSTOPB) != (old_cflag & CSTOPB)) { | 561 | || (cflag & CSTOPB) != (old_cflag & CSTOPB)) { |
562 | /* Not currently supported */ | 562 | /* Not currently supported */ |
563 | tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB); | 563 | tty->termios.c_cflag &= ~(PARENB|PARODD|CSTOPB); |
564 | #if 0 | 564 | #if 0 |
565 | priv->last_lcr = 0; | 565 | priv->last_lcr = 0; |
566 | 566 | ||
@@ -587,7 +587,7 @@ static void klsi_105_set_termios(struct tty_struct *tty, | |||
587 | || (iflag & IXON) != (old_iflag & IXON) | 587 | || (iflag & IXON) != (old_iflag & IXON) |
588 | || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { | 588 | || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { |
589 | /* Not currently supported */ | 589 | /* Not currently supported */ |
590 | tty->termios->c_cflag &= ~CRTSCTS; | 590 | tty->termios.c_cflag &= ~CRTSCTS; |
591 | /* Drop DTR/RTS if no flow control otherwise assert */ | 591 | /* Drop DTR/RTS if no flow control otherwise assert */ |
592 | #if 0 | 592 | #if 0 |
593 | if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS)) | 593 | if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS)) |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index fafeabb64c55..bf5c74965d34 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -191,11 +191,11 @@ static void kobil_release(struct usb_serial *serial) | |||
191 | static void kobil_init_termios(struct tty_struct *tty) | 191 | static void kobil_init_termios(struct tty_struct *tty) |
192 | { | 192 | { |
193 | /* Default to echo off and other sane device settings */ | 193 | /* Default to echo off and other sane device settings */ |
194 | tty->termios->c_lflag = 0; | 194 | tty->termios.c_lflag = 0; |
195 | tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); | 195 | tty->termios.c_iflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); |
196 | tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; | 196 | tty->termios.c_iflag |= IGNBRK | IGNPAR | IXOFF; |
197 | /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ | 197 | /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ |
198 | tty->termios->c_oflag &= ~ONLCR; | 198 | tty->termios.c_oflag &= ~ONLCR; |
199 | } | 199 | } |
200 | 200 | ||
201 | static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port) | 201 | static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port) |
@@ -581,14 +581,14 @@ static void kobil_set_termios(struct tty_struct *tty, | |||
581 | struct kobil_private *priv; | 581 | struct kobil_private *priv; |
582 | int result; | 582 | int result; |
583 | unsigned short urb_val = 0; | 583 | unsigned short urb_val = 0; |
584 | int c_cflag = tty->termios->c_cflag; | 584 | int c_cflag = tty->termios.c_cflag; |
585 | speed_t speed; | 585 | speed_t speed; |
586 | 586 | ||
587 | priv = usb_get_serial_port_data(port); | 587 | priv = usb_get_serial_port_data(port); |
588 | if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || | 588 | if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || |
589 | priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) { | 589 | priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) { |
590 | /* This device doesn't support ioctl calls */ | 590 | /* This device doesn't support ioctl calls */ |
591 | *tty->termios = *old; | 591 | tty_termios_copy_hw(&tty->termios, old); |
592 | return; | 592 | return; |
593 | } | 593 | } |
594 | 594 | ||
@@ -612,7 +612,7 @@ static void kobil_set_termios(struct tty_struct *tty, | |||
612 | urb_val |= SUSBCR_SPASB_EvenParity; | 612 | urb_val |= SUSBCR_SPASB_EvenParity; |
613 | } else | 613 | } else |
614 | urb_val |= SUSBCR_SPASB_NoParity; | 614 | urb_val |= SUSBCR_SPASB_NoParity; |
615 | tty->termios->c_cflag &= ~CMSPAR; | 615 | tty->termios.c_cflag &= ~CMSPAR; |
616 | tty_encode_baud_rate(tty, speed, speed); | 616 | tty_encode_baud_rate(tty, speed, speed); |
617 | 617 | ||
618 | result = usb_control_msg(port->serial->dev, | 618 | result = usb_control_msg(port->serial->dev, |
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index a71fa0aa0406..df98cffdba65 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -454,7 +454,7 @@ static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
454 | * either. | 454 | * either. |
455 | */ | 455 | */ |
456 | spin_lock_irqsave(&priv->lock, flags); | 456 | spin_lock_irqsave(&priv->lock, flags); |
457 | if (tty && (tty->termios->c_cflag & CBAUD)) | 457 | if (tty && (tty->termios.c_cflag & CBAUD)) |
458 | priv->control_state = TIOCM_DTR | TIOCM_RTS; | 458 | priv->control_state = TIOCM_DTR | TIOCM_RTS; |
459 | else | 459 | else |
460 | priv->control_state = 0; | 460 | priv->control_state = 0; |
@@ -634,7 +634,7 @@ static void mct_u232_set_termios(struct tty_struct *tty, | |||
634 | { | 634 | { |
635 | struct usb_serial *serial = port->serial; | 635 | struct usb_serial *serial = port->serial; |
636 | struct mct_u232_private *priv = usb_get_serial_port_data(port); | 636 | struct mct_u232_private *priv = usb_get_serial_port_data(port); |
637 | struct ktermios *termios = tty->termios; | 637 | struct ktermios *termios = &tty->termios; |
638 | unsigned int cflag = termios->c_cflag; | 638 | unsigned int cflag = termios->c_cflag; |
639 | unsigned int old_cflag = old_termios->c_cflag; | 639 | unsigned int old_cflag = old_termios->c_cflag; |
640 | unsigned long flags; | 640 | unsigned long flags; |
diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c index d47eb06fe463..7ae9af6b2a54 100644 --- a/drivers/usb/serial/metro-usb.c +++ b/drivers/usb/serial/metro-usb.c | |||
@@ -130,20 +130,14 @@ static void metrousb_read_int_callback(struct urb *urb) | |||
130 | 130 | ||
131 | /* Set the data read from the usb port into the serial port buffer. */ | 131 | /* Set the data read from the usb port into the serial port buffer. */ |
132 | tty = tty_port_tty_get(&port->port); | 132 | tty = tty_port_tty_get(&port->port); |
133 | if (!tty) { | ||
134 | dev_err(&port->dev, "%s - bad tty pointer - exiting\n", | ||
135 | __func__); | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | if (tty && urb->actual_length) { | 133 | if (tty && urb->actual_length) { |
140 | /* Loop through the data copying each byte to the tty layer. */ | 134 | /* Loop through the data copying each byte to the tty layer. */ |
141 | tty_insert_flip_string(tty, data, urb->actual_length); | 135 | tty_insert_flip_string(tty, data, urb->actual_length); |
142 | 136 | ||
143 | /* Force the data to the tty layer. */ | 137 | /* Force the data to the tty layer. */ |
144 | tty_flip_buffer_push(tty); | 138 | tty_flip_buffer_push(tty); |
139 | tty_kref_put(tty); | ||
145 | } | 140 | } |
146 | tty_kref_put(tty); | ||
147 | 141 | ||
148 | /* Set any port variables. */ | 142 | /* Set any port variables. */ |
149 | spin_lock_irqsave(&metro_priv->lock, flags); | 143 | spin_lock_irqsave(&metro_priv->lock, flags); |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index a07dd3c8cfef..012f67b2e4cc 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -1349,7 +1349,7 @@ static void mos7720_throttle(struct tty_struct *tty) | |||
1349 | } | 1349 | } |
1350 | 1350 | ||
1351 | /* if we are implementing RTS/CTS, toggle that line */ | 1351 | /* if we are implementing RTS/CTS, toggle that line */ |
1352 | if (tty->termios->c_cflag & CRTSCTS) { | 1352 | if (tty->termios.c_cflag & CRTSCTS) { |
1353 | mos7720_port->shadowMCR &= ~UART_MCR_RTS; | 1353 | mos7720_port->shadowMCR &= ~UART_MCR_RTS; |
1354 | write_mos_reg(port->serial, port->number - port->serial->minor, | 1354 | write_mos_reg(port->serial, port->number - port->serial->minor, |
1355 | MCR, mos7720_port->shadowMCR); | 1355 | MCR, mos7720_port->shadowMCR); |
@@ -1383,7 +1383,7 @@ static void mos7720_unthrottle(struct tty_struct *tty) | |||
1383 | } | 1383 | } |
1384 | 1384 | ||
1385 | /* if we are implementing RTS/CTS, toggle that line */ | 1385 | /* if we are implementing RTS/CTS, toggle that line */ |
1386 | if (tty->termios->c_cflag & CRTSCTS) { | 1386 | if (tty->termios.c_cflag & CRTSCTS) { |
1387 | mos7720_port->shadowMCR |= UART_MCR_RTS; | 1387 | mos7720_port->shadowMCR |= UART_MCR_RTS; |
1388 | write_mos_reg(port->serial, port->number - port->serial->minor, | 1388 | write_mos_reg(port->serial, port->number - port->serial->minor, |
1389 | MCR, mos7720_port->shadowMCR); | 1389 | MCR, mos7720_port->shadowMCR); |
@@ -1604,8 +1604,8 @@ static void change_port_settings(struct tty_struct *tty, | |||
1604 | lStop = 0x00; /* 1 stop bit */ | 1604 | lStop = 0x00; /* 1 stop bit */ |
1605 | lParity = 0x00; /* No parity */ | 1605 | lParity = 0x00; /* No parity */ |
1606 | 1606 | ||
1607 | cflag = tty->termios->c_cflag; | 1607 | cflag = tty->termios.c_cflag; |
1608 | iflag = tty->termios->c_iflag; | 1608 | iflag = tty->termios.c_iflag; |
1609 | 1609 | ||
1610 | /* Change the number of bits */ | 1610 | /* Change the number of bits */ |
1611 | switch (cflag & CSIZE) { | 1611 | switch (cflag & CSIZE) { |
@@ -1753,11 +1753,11 @@ static void mos7720_set_termios(struct tty_struct *tty, | |||
1753 | 1753 | ||
1754 | dbg("%s\n", "setting termios - ASPIRE"); | 1754 | dbg("%s\n", "setting termios - ASPIRE"); |
1755 | 1755 | ||
1756 | cflag = tty->termios->c_cflag; | 1756 | cflag = tty->termios.c_cflag; |
1757 | 1757 | ||
1758 | dbg("%s - cflag %08x iflag %08x", __func__, | 1758 | dbg("%s - cflag %08x iflag %08x", __func__, |
1759 | tty->termios->c_cflag, | 1759 | tty->termios.c_cflag, |
1760 | RELEVANT_IFLAG(tty->termios->c_iflag)); | 1760 | RELEVANT_IFLAG(tty->termios.c_iflag)); |
1761 | 1761 | ||
1762 | dbg("%s - old cflag %08x old iflag %08x", __func__, | 1762 | dbg("%s - old cflag %08x old iflag %08x", __func__, |
1763 | old_termios->c_cflag, | 1763 | old_termios->c_cflag, |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 57eca2448424..d2f2b5d65732 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -1649,7 +1649,7 @@ static void mos7840_throttle(struct tty_struct *tty) | |||
1649 | return; | 1649 | return; |
1650 | } | 1650 | } |
1651 | /* if we are implementing RTS/CTS, toggle that line */ | 1651 | /* if we are implementing RTS/CTS, toggle that line */ |
1652 | if (tty->termios->c_cflag & CRTSCTS) { | 1652 | if (tty->termios.c_cflag & CRTSCTS) { |
1653 | mos7840_port->shadowMCR &= ~MCR_RTS; | 1653 | mos7840_port->shadowMCR &= ~MCR_RTS; |
1654 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, | 1654 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, |
1655 | mos7840_port->shadowMCR); | 1655 | mos7840_port->shadowMCR); |
@@ -1692,7 +1692,7 @@ static void mos7840_unthrottle(struct tty_struct *tty) | |||
1692 | } | 1692 | } |
1693 | 1693 | ||
1694 | /* if we are implementing RTS/CTS, toggle that line */ | 1694 | /* if we are implementing RTS/CTS, toggle that line */ |
1695 | if (tty->termios->c_cflag & CRTSCTS) { | 1695 | if (tty->termios.c_cflag & CRTSCTS) { |
1696 | mos7840_port->shadowMCR |= MCR_RTS; | 1696 | mos7840_port->shadowMCR |= MCR_RTS; |
1697 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, | 1697 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, |
1698 | mos7840_port->shadowMCR); | 1698 | mos7840_port->shadowMCR); |
@@ -1998,8 +1998,8 @@ static void mos7840_change_port_settings(struct tty_struct *tty, | |||
1998 | lStop = LCR_STOP_1; | 1998 | lStop = LCR_STOP_1; |
1999 | lParity = LCR_PAR_NONE; | 1999 | lParity = LCR_PAR_NONE; |
2000 | 2000 | ||
2001 | cflag = tty->termios->c_cflag; | 2001 | cflag = tty->termios.c_cflag; |
2002 | iflag = tty->termios->c_iflag; | 2002 | iflag = tty->termios.c_iflag; |
2003 | 2003 | ||
2004 | /* Change the number of bits */ | 2004 | /* Change the number of bits */ |
2005 | if (cflag & CSIZE) { | 2005 | if (cflag & CSIZE) { |
@@ -2159,10 +2159,10 @@ static void mos7840_set_termios(struct tty_struct *tty, | |||
2159 | 2159 | ||
2160 | dbg("%s", "setting termios - "); | 2160 | dbg("%s", "setting termios - "); |
2161 | 2161 | ||
2162 | cflag = tty->termios->c_cflag; | 2162 | cflag = tty->termios.c_cflag; |
2163 | 2163 | ||
2164 | dbg("%s - clfag %08x iflag %08x", __func__, | 2164 | dbg("%s - clfag %08x iflag %08x", __func__, |
2165 | tty->termios->c_cflag, RELEVANT_IFLAG(tty->termios->c_iflag)); | 2165 | tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag)); |
2166 | dbg("%s - old clfag %08x old iflag %08x", __func__, | 2166 | dbg("%s - old clfag %08x old iflag %08x", __func__, |
2167 | old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag)); | 2167 | old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag)); |
2168 | dbg("%s - port %d", __func__, port->number); | 2168 | dbg("%s - port %d", __func__, port->number); |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index 5976b65ab6ee..9f555560bfbf 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
@@ -404,10 +404,10 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty) | |||
404 | 404 | ||
405 | static void oti6858_init_termios(struct tty_struct *tty) | 405 | static void oti6858_init_termios(struct tty_struct *tty) |
406 | { | 406 | { |
407 | *(tty->termios) = tty_std_termios; | 407 | tty->termios = tty_std_termios; |
408 | tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; | 408 | tty->termios.c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; |
409 | tty->termios->c_ispeed = 38400; | 409 | tty->termios.c_ispeed = 38400; |
410 | tty->termios->c_ospeed = 38400; | 410 | tty->termios.c_ospeed = 38400; |
411 | } | 411 | } |
412 | 412 | ||
413 | static void oti6858_set_termios(struct tty_struct *tty, | 413 | static void oti6858_set_termios(struct tty_struct *tty, |
@@ -425,7 +425,7 @@ static void oti6858_set_termios(struct tty_struct *tty, | |||
425 | return; | 425 | return; |
426 | } | 426 | } |
427 | 427 | ||
428 | cflag = tty->termios->c_cflag; | 428 | cflag = tty->termios.c_cflag; |
429 | 429 | ||
430 | spin_lock_irqsave(&priv->lock, flags); | 430 | spin_lock_irqsave(&priv->lock, flags); |
431 | divisor = priv->pending_setup.divisor; | 431 | divisor = priv->pending_setup.divisor; |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 13b8dd6481f5..2b9108a8ea64 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -260,16 +260,16 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
260 | serial settings even to the same values as before. Thus | 260 | serial settings even to the same values as before. Thus |
261 | we actually need to filter in this specific case */ | 261 | we actually need to filter in this specific case */ |
262 | 262 | ||
263 | if (!tty_termios_hw_change(tty->termios, old_termios)) | 263 | if (!tty_termios_hw_change(&tty->termios, old_termios)) |
264 | return; | 264 | return; |
265 | 265 | ||
266 | cflag = tty->termios->c_cflag; | 266 | cflag = tty->termios.c_cflag; |
267 | 267 | ||
268 | buf = kzalloc(7, GFP_KERNEL); | 268 | buf = kzalloc(7, GFP_KERNEL); |
269 | if (!buf) { | 269 | if (!buf) { |
270 | dev_err(&port->dev, "%s - out of memory.\n", __func__); | 270 | dev_err(&port->dev, "%s - out of memory.\n", __func__); |
271 | /* Report back no change occurred */ | 271 | /* Report back no change occurred */ |
272 | *tty->termios = *old_termios; | 272 | tty->termios = *old_termios; |
273 | return; | 273 | return; |
274 | } | 274 | } |
275 | 275 | ||
diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c index 151670b6b72a..7df9cdb053ed 100644 --- a/drivers/usb/serial/quatech2.c +++ b/drivers/usb/serial/quatech2.c | |||
@@ -275,7 +275,7 @@ static void qt2_set_termios(struct tty_struct *tty, | |||
275 | { | 275 | { |
276 | struct usb_device *dev = port->serial->dev; | 276 | struct usb_device *dev = port->serial->dev; |
277 | struct qt2_port_private *port_priv; | 277 | struct qt2_port_private *port_priv; |
278 | struct ktermios *termios = tty->termios; | 278 | struct ktermios *termios = &tty->termios; |
279 | u16 baud; | 279 | u16 baud; |
280 | unsigned int cflag = termios->c_cflag; | 280 | unsigned int cflag = termios->c_cflag; |
281 | u16 new_lcr = 0; | 281 | u16 new_lcr = 0; |
@@ -406,7 +406,7 @@ static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
406 | port_priv->device_port = (u8) device_port; | 406 | port_priv->device_port = (u8) device_port; |
407 | 407 | ||
408 | if (tty) | 408 | if (tty) |
409 | qt2_set_termios(tty, port, tty->termios); | 409 | qt2_set_termios(tty, port, &tty->termios); |
410 | 410 | ||
411 | return 0; | 411 | return 0; |
412 | 412 | ||
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 0274710cced5..b14ebbd73567 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -382,7 +382,7 @@ static int sierra_send_setup(struct usb_serial_port *port) | |||
382 | static void sierra_set_termios(struct tty_struct *tty, | 382 | static void sierra_set_termios(struct tty_struct *tty, |
383 | struct usb_serial_port *port, struct ktermios *old_termios) | 383 | struct usb_serial_port *port, struct ktermios *old_termios) |
384 | { | 384 | { |
385 | tty_termios_copy_hw(tty->termios, old_termios); | 385 | tty_termios_copy_hw(&tty->termios, old_termios); |
386 | sierra_send_setup(port); | 386 | sierra_send_setup(port); |
387 | } | 387 | } |
388 | 388 | ||
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index cad608984710..ab68a4d74d61 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c | |||
@@ -316,10 +316,10 @@ static void spcp8x5_dtr_rts(struct usb_serial_port *port, int on) | |||
316 | static void spcp8x5_init_termios(struct tty_struct *tty) | 316 | static void spcp8x5_init_termios(struct tty_struct *tty) |
317 | { | 317 | { |
318 | /* for the 1st time call this function */ | 318 | /* for the 1st time call this function */ |
319 | *(tty->termios) = tty_std_termios; | 319 | tty->termios = tty_std_termios; |
320 | tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; | 320 | tty->termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; |
321 | tty->termios->c_ispeed = 115200; | 321 | tty->termios.c_ispeed = 115200; |
322 | tty->termios->c_ospeed = 115200; | 322 | tty->termios.c_ospeed = 115200; |
323 | } | 323 | } |
324 | 324 | ||
325 | /* set the serial param for transfer. we should check if we really need to | 325 | /* set the serial param for transfer. we should check if we really need to |
@@ -330,7 +330,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty, | |||
330 | struct usb_serial *serial = port->serial; | 330 | struct usb_serial *serial = port->serial; |
331 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); | 331 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); |
332 | unsigned long flags; | 332 | unsigned long flags; |
333 | unsigned int cflag = tty->termios->c_cflag; | 333 | unsigned int cflag = tty->termios.c_cflag; |
334 | unsigned int old_cflag = old_termios->c_cflag; | 334 | unsigned int old_cflag = old_termios->c_cflag; |
335 | unsigned short uartdata; | 335 | unsigned short uartdata; |
336 | unsigned char buf[2] = {0, 0}; | 336 | unsigned char buf[2] = {0, 0}; |
@@ -340,7 +340,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty, | |||
340 | 340 | ||
341 | 341 | ||
342 | /* check that they really want us to change something */ | 342 | /* check that they really want us to change something */ |
343 | if (!tty_termios_hw_change(tty->termios, old_termios)) | 343 | if (!tty_termios_hw_change(&tty->termios, old_termios)) |
344 | return; | 344 | return; |
345 | 345 | ||
346 | /* set DTR/RTS active */ | 346 | /* set DTR/RTS active */ |
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index 3fee23bf0c14..cf2d30cf7588 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c | |||
@@ -216,7 +216,7 @@ static void ssu100_set_termios(struct tty_struct *tty, | |||
216 | struct ktermios *old_termios) | 216 | struct ktermios *old_termios) |
217 | { | 217 | { |
218 | struct usb_device *dev = port->serial->dev; | 218 | struct usb_device *dev = port->serial->dev; |
219 | struct ktermios *termios = tty->termios; | 219 | struct ktermios *termios = &tty->termios; |
220 | u16 baud, divisor, remainder; | 220 | u16 baud, divisor, remainder; |
221 | unsigned int cflag = termios->c_cflag; | 221 | unsigned int cflag = termios->c_cflag; |
222 | u16 urb_value = 0; /* will hold the new flags */ | 222 | u16 urb_value = 0; /* will hold the new flags */ |
@@ -322,7 +322,7 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
322 | dbg("%s - set uart failed", __func__); | 322 | dbg("%s - set uart failed", __func__); |
323 | 323 | ||
324 | if (tty) | 324 | if (tty) |
325 | ssu100_set_termios(tty, port, tty->termios); | 325 | ssu100_set_termios(tty, port, &tty->termios); |
326 | 326 | ||
327 | return usb_serial_generic_open(tty, port); | 327 | return usb_serial_generic_open(tty, port); |
328 | } | 328 | } |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index a4404f5ad68e..f502a16aac21 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -520,7 +520,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
520 | } | 520 | } |
521 | 521 | ||
522 | if (tty) | 522 | if (tty) |
523 | ti_set_termios(tty, port, tty->termios); | 523 | ti_set_termios(tty, port, &tty->termios); |
524 | 524 | ||
525 | dbg("%s - sending TI_OPEN_PORT", __func__); | 525 | dbg("%s - sending TI_OPEN_PORT", __func__); |
526 | status = ti_command_out_sync(tdev, TI_OPEN_PORT, | 526 | status = ti_command_out_sync(tdev, TI_OPEN_PORT, |
@@ -562,7 +562,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
562 | usb_clear_halt(dev, port->read_urb->pipe); | 562 | usb_clear_halt(dev, port->read_urb->pipe); |
563 | 563 | ||
564 | if (tty) | 564 | if (tty) |
565 | ti_set_termios(tty, port, tty->termios); | 565 | ti_set_termios(tty, port, &tty->termios); |
566 | 566 | ||
567 | dbg("%s - sending TI_OPEN_PORT (2)", __func__); | 567 | dbg("%s - sending TI_OPEN_PORT (2)", __func__); |
568 | status = ti_command_out_sync(tdev, TI_OPEN_PORT, | 568 | status = ti_command_out_sync(tdev, TI_OPEN_PORT, |
@@ -831,8 +831,8 @@ static void ti_set_termios(struct tty_struct *tty, | |||
831 | int port_number = port->number - port->serial->minor; | 831 | int port_number = port->number - port->serial->minor; |
832 | unsigned int mcr; | 832 | unsigned int mcr; |
833 | 833 | ||
834 | cflag = tty->termios->c_cflag; | 834 | cflag = tty->termios.c_cflag; |
835 | iflag = tty->termios->c_iflag; | 835 | iflag = tty->termios.c_iflag; |
836 | 836 | ||
837 | dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag); | 837 | dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag); |
838 | dbg("%s - old clfag %08x, old iflag %08x", __func__, | 838 | dbg("%s - old clfag %08x, old iflag %08x", __func__, |
@@ -871,7 +871,7 @@ static void ti_set_termios(struct tty_struct *tty, | |||
871 | } | 871 | } |
872 | 872 | ||
873 | /* CMSPAR isn't supported by this driver */ | 873 | /* CMSPAR isn't supported by this driver */ |
874 | tty->termios->c_cflag &= ~CMSPAR; | 874 | tty->termios.c_cflag &= ~CMSPAR; |
875 | 875 | ||
876 | if (cflag & PARENB) { | 876 | if (cflag & PARENB) { |
877 | if (cflag & PARODD) { | 877 | if (cflag & PARODD) { |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 27483f91a4a3..aa4b0d775992 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -207,7 +207,7 @@ static int serial_install(struct tty_driver *driver, struct tty_struct *tty) | |||
207 | if (retval) | 207 | if (retval) |
208 | goto error_get_interface; | 208 | goto error_get_interface; |
209 | 209 | ||
210 | retval = tty_standard_install(driver, tty); | 210 | retval = tty_port_install(&port->port, driver, tty); |
211 | if (retval) | 211 | if (retval) |
212 | goto error_init_termios; | 212 | goto error_init_termios; |
213 | 213 | ||
@@ -305,8 +305,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp) | |||
305 | * Do the resource freeing and refcount dropping for the port. | 305 | * Do the resource freeing and refcount dropping for the port. |
306 | * Avoid freeing the console. | 306 | * Avoid freeing the console. |
307 | * | 307 | * |
308 | * Called asynchronously after the last tty kref is dropped, | 308 | * Called asynchronously after the last tty kref is dropped. |
309 | * and the tty layer has already done the tty_shutdown(tty); | ||
310 | */ | 309 | */ |
311 | static void serial_cleanup(struct tty_struct *tty) | 310 | static void serial_cleanup(struct tty_struct *tty) |
312 | { | 311 | { |
@@ -423,7 +422,7 @@ static void serial_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
423 | if (port->serial->type->set_termios) | 422 | if (port->serial->type->set_termios) |
424 | port->serial->type->set_termios(tty, port, old); | 423 | port->serial->type->set_termios(tty, port, old); |
425 | else | 424 | else |
426 | tty_termios_copy_hw(tty->termios, old); | 425 | tty_termios_copy_hw(&tty->termios, old); |
427 | } | 426 | } |
428 | 427 | ||
429 | static int serial_break(struct tty_struct *tty, int break_state) | 428 | static int serial_break(struct tty_struct *tty, int break_state) |
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index f35971dff4a5..7c3db9e6f324 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c | |||
@@ -67,7 +67,7 @@ void usb_wwan_set_termios(struct tty_struct *tty, | |||
67 | struct usb_wwan_intf_private *intfdata = port->serial->private; | 67 | struct usb_wwan_intf_private *intfdata = port->serial->private; |
68 | 68 | ||
69 | /* Doesn't support option setting */ | 69 | /* Doesn't support option setting */ |
70 | tty_termios_copy_hw(tty->termios, old_termios); | 70 | tty_termios_copy_hw(&tty->termios, old_termios); |
71 | 71 | ||
72 | if (intfdata->send_setup) | 72 | if (intfdata->send_setup) |
73 | intfdata->send_setup(port); | 73 | intfdata->send_setup(port); |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 473635e7f5db..b36077de72b9 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
@@ -724,7 +724,7 @@ static void firm_setup_port(struct tty_struct *tty) | |||
724 | { | 724 | { |
725 | struct usb_serial_port *port = tty->driver_data; | 725 | struct usb_serial_port *port = tty->driver_data; |
726 | struct whiteheat_port_settings port_settings; | 726 | struct whiteheat_port_settings port_settings; |
727 | unsigned int cflag = tty->termios->c_cflag; | 727 | unsigned int cflag = tty->termios.c_cflag; |
728 | 728 | ||
729 | port_settings.port = port->number + 1; | 729 | port_settings.port = port->number + 1; |
730 | 730 | ||
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index d9a754474878..28ea2b4d1b45 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -84,7 +84,6 @@ header-y += capability.h | |||
84 | header-y += capi.h | 84 | header-y += capi.h |
85 | header-y += cciss_defs.h | 85 | header-y += cciss_defs.h |
86 | header-y += cciss_ioctl.h | 86 | header-y += cciss_ioctl.h |
87 | header-y += cdk.h | ||
88 | header-y += cdrom.h | 87 | header-y += cdrom.h |
89 | header-y += cgroupstats.h | 88 | header-y += cgroupstats.h |
90 | header-y += chio.h | 89 | header-y += chio.h |
@@ -93,7 +92,6 @@ header-y += cn_proc.h | |||
93 | header-y += coda.h | 92 | header-y += coda.h |
94 | header-y += coda_psdev.h | 93 | header-y += coda_psdev.h |
95 | header-y += coff.h | 94 | header-y += coff.h |
96 | header-y += comstats.h | ||
97 | header-y += connector.h | 95 | header-y += connector.h |
98 | header-y += const.h | 96 | header-y += const.h |
99 | header-y += cramfs_fs.h | 97 | header-y += cramfs_fs.h |
@@ -140,7 +138,6 @@ header-y += fuse.h | |||
140 | header-y += futex.h | 138 | header-y += futex.h |
141 | header-y += gameport.h | 139 | header-y += gameport.h |
142 | header-y += gen_stats.h | 140 | header-y += gen_stats.h |
143 | header-y += generic_serial.h | ||
144 | header-y += genetlink.h | 141 | header-y += genetlink.h |
145 | header-y += gfs2_ondisk.h | 142 | header-y += gfs2_ondisk.h |
146 | header-y += gigaset_dev.h | 143 | header-y += gigaset_dev.h |
diff --git a/include/linux/cd1400.h b/include/linux/cd1400.h deleted file mode 100644 index 1dc3ab0523fd..000000000000 --- a/include/linux/cd1400.h +++ /dev/null | |||
@@ -1,292 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * cd1400.h -- cd1400 UART hardware info. | ||
5 | * | ||
6 | * Copyright (C) 1996-1998 Stallion Technologies | ||
7 | * Copyright (C) 1994-1996 Greg Ungerer. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | /*****************************************************************************/ | ||
25 | #ifndef _CD1400_H | ||
26 | #define _CD1400_H | ||
27 | /*****************************************************************************/ | ||
28 | |||
29 | /* | ||
30 | * Define the number of async ports per cd1400 uart chip. | ||
31 | */ | ||
32 | #define CD1400_PORTS 4 | ||
33 | |||
34 | /* | ||
35 | * Define the cd1400 uarts internal FIFO sizes. | ||
36 | */ | ||
37 | #define CD1400_TXFIFOSIZE 12 | ||
38 | #define CD1400_RXFIFOSIZE 12 | ||
39 | |||
40 | /* | ||
41 | * Local RX FIFO thresh hold level. Also define the RTS thresh hold | ||
42 | * based on the RX thresh hold. | ||
43 | */ | ||
44 | #define FIFO_RXTHRESHOLD 6 | ||
45 | #define FIFO_RTSTHRESHOLD 7 | ||
46 | |||
47 | /*****************************************************************************/ | ||
48 | |||
49 | /* | ||
50 | * Define the cd1400 register addresses. These are all the valid | ||
51 | * registers with the cd1400. Some are global, some virtual, some | ||
52 | * per port. | ||
53 | */ | ||
54 | #define GFRCR 0x40 | ||
55 | #define CAR 0x68 | ||
56 | #define GCR 0x4b | ||
57 | #define SVRR 0x67 | ||
58 | #define RICR 0x44 | ||
59 | #define TICR 0x45 | ||
60 | #define MICR 0x46 | ||
61 | #define RIR 0x6b | ||
62 | #define TIR 0x6a | ||
63 | #define MIR 0x69 | ||
64 | #define PPR 0x7e | ||
65 | |||
66 | #define RIVR 0x43 | ||
67 | #define TIVR 0x42 | ||
68 | #define MIVR 0x41 | ||
69 | #define TDR 0x63 | ||
70 | #define RDSR 0x62 | ||
71 | #define MISR 0x4c | ||
72 | #define EOSRR 0x60 | ||
73 | |||
74 | #define LIVR 0x18 | ||
75 | #define CCR 0x05 | ||
76 | #define SRER 0x06 | ||
77 | #define COR1 0x08 | ||
78 | #define COR2 0x09 | ||
79 | #define COR3 0x0a | ||
80 | #define COR4 0x1e | ||
81 | #define COR5 0x1f | ||
82 | #define CCSR 0x0b | ||
83 | #define RDCR 0x0e | ||
84 | #define SCHR1 0x1a | ||
85 | #define SCHR2 0x1b | ||
86 | #define SCHR3 0x1c | ||
87 | #define SCHR4 0x1d | ||
88 | #define SCRL 0x22 | ||
89 | #define SCRH 0x23 | ||
90 | #define LNC 0x24 | ||
91 | #define MCOR1 0x15 | ||
92 | #define MCOR2 0x16 | ||
93 | #define RTPR 0x21 | ||
94 | #define MSVR1 0x6c | ||
95 | #define MSVR2 0x6d | ||
96 | #define PSVR 0x6f | ||
97 | #define RBPR 0x78 | ||
98 | #define RCOR 0x7c | ||
99 | #define TBPR 0x72 | ||
100 | #define TCOR 0x76 | ||
101 | |||
102 | /*****************************************************************************/ | ||
103 | |||
104 | /* | ||
105 | * Define the set of baud rate clock divisors. | ||
106 | */ | ||
107 | #define CD1400_CLK0 8 | ||
108 | #define CD1400_CLK1 32 | ||
109 | #define CD1400_CLK2 128 | ||
110 | #define CD1400_CLK3 512 | ||
111 | #define CD1400_CLK4 2048 | ||
112 | |||
113 | #define CD1400_NUMCLKS 5 | ||
114 | |||
115 | /*****************************************************************************/ | ||
116 | |||
117 | /* | ||
118 | * Define the clock pre-scalar value to be a 5 ms clock. This should be | ||
119 | * OK for now. It would probably be better to make it 10 ms, but we | ||
120 | * can't fit that divisor into 8 bits! | ||
121 | */ | ||
122 | #define PPR_SCALAR 244 | ||
123 | |||
124 | /*****************************************************************************/ | ||
125 | |||
126 | /* | ||
127 | * Define values used to set character size options. | ||
128 | */ | ||
129 | #define COR1_CHL5 0x00 | ||
130 | #define COR1_CHL6 0x01 | ||
131 | #define COR1_CHL7 0x02 | ||
132 | #define COR1_CHL8 0x03 | ||
133 | |||
134 | /* | ||
135 | * Define values used to set the number of stop bits. | ||
136 | */ | ||
137 | #define COR1_STOP1 0x00 | ||
138 | #define COR1_STOP15 0x04 | ||
139 | #define COR1_STOP2 0x08 | ||
140 | |||
141 | /* | ||
142 | * Define values used to set the parity scheme in use. | ||
143 | */ | ||
144 | #define COR1_PARNONE 0x00 | ||
145 | #define COR1_PARFORCE 0x20 | ||
146 | #define COR1_PARENB 0x40 | ||
147 | #define COR1_PARIGNORE 0x10 | ||
148 | |||
149 | #define COR1_PARODD 0x80 | ||
150 | #define COR1_PAREVEN 0x00 | ||
151 | |||
152 | #define COR2_IXM 0x80 | ||
153 | #define COR2_TXIBE 0x40 | ||
154 | #define COR2_ETC 0x20 | ||
155 | #define COR2_LLM 0x10 | ||
156 | #define COR2_RLM 0x08 | ||
157 | #define COR2_RTSAO 0x04 | ||
158 | #define COR2_CTSAE 0x02 | ||
159 | |||
160 | #define COR3_SCDRNG 0x80 | ||
161 | #define COR3_SCD34 0x40 | ||
162 | #define COR3_FCT 0x20 | ||
163 | #define COR3_SCD12 0x10 | ||
164 | |||
165 | /* | ||
166 | * Define values used by COR4. | ||
167 | */ | ||
168 | #define COR4_BRKINT 0x08 | ||
169 | #define COR4_IGNBRK 0x18 | ||
170 | |||
171 | /*****************************************************************************/ | ||
172 | |||
173 | /* | ||
174 | * Define the modem control register values. | ||
175 | * Note that the actual hardware is a little different to the conventional | ||
176 | * pin names on the cd1400. | ||
177 | */ | ||
178 | #define MSVR1_DTR 0x01 | ||
179 | #define MSVR1_DSR 0x10 | ||
180 | #define MSVR1_RI 0x20 | ||
181 | #define MSVR1_CTS 0x40 | ||
182 | #define MSVR1_DCD 0x80 | ||
183 | |||
184 | #define MSVR2_RTS 0x02 | ||
185 | #define MSVR2_DSR 0x10 | ||
186 | #define MSVR2_RI 0x20 | ||
187 | #define MSVR2_CTS 0x40 | ||
188 | #define MSVR2_DCD 0x80 | ||
189 | |||
190 | #define MCOR1_DCD 0x80 | ||
191 | #define MCOR1_CTS 0x40 | ||
192 | #define MCOR1_RI 0x20 | ||
193 | #define MCOR1_DSR 0x10 | ||
194 | |||
195 | #define MCOR2_DCD 0x80 | ||
196 | #define MCOR2_CTS 0x40 | ||
197 | #define MCOR2_RI 0x20 | ||
198 | #define MCOR2_DSR 0x10 | ||
199 | |||
200 | /*****************************************************************************/ | ||
201 | |||
202 | /* | ||
203 | * Define the bits used with the service (interrupt) enable register. | ||
204 | */ | ||
205 | #define SRER_NNDT 0x01 | ||
206 | #define SRER_TXEMPTY 0x02 | ||
207 | #define SRER_TXDATA 0x04 | ||
208 | #define SRER_RXDATA 0x10 | ||
209 | #define SRER_MODEM 0x80 | ||
210 | |||
211 | /*****************************************************************************/ | ||
212 | |||
213 | /* | ||
214 | * Define operational commands for the command register. | ||
215 | */ | ||
216 | #define CCR_RESET 0x80 | ||
217 | #define CCR_CORCHANGE 0x4e | ||
218 | #define CCR_SENDCH 0x20 | ||
219 | #define CCR_CHANCTRL 0x10 | ||
220 | |||
221 | #define CCR_TXENABLE (CCR_CHANCTRL | 0x08) | ||
222 | #define CCR_TXDISABLE (CCR_CHANCTRL | 0x04) | ||
223 | #define CCR_RXENABLE (CCR_CHANCTRL | 0x02) | ||
224 | #define CCR_RXDISABLE (CCR_CHANCTRL | 0x01) | ||
225 | |||
226 | #define CCR_SENDSCHR1 (CCR_SENDCH | 0x01) | ||
227 | #define CCR_SENDSCHR2 (CCR_SENDCH | 0x02) | ||
228 | #define CCR_SENDSCHR3 (CCR_SENDCH | 0x03) | ||
229 | #define CCR_SENDSCHR4 (CCR_SENDCH | 0x04) | ||
230 | |||
231 | #define CCR_RESETCHAN (CCR_RESET | 0x00) | ||
232 | #define CCR_RESETFULL (CCR_RESET | 0x01) | ||
233 | #define CCR_TXFLUSHFIFO (CCR_RESET | 0x02) | ||
234 | |||
235 | #define CCR_MAXWAIT 10000 | ||
236 | |||
237 | /*****************************************************************************/ | ||
238 | |||
239 | /* | ||
240 | * Define the valid acknowledgement types (for hw ack cycle). | ||
241 | */ | ||
242 | #define ACK_TYPMASK 0x07 | ||
243 | #define ACK_TYPTX 0x02 | ||
244 | #define ACK_TYPMDM 0x01 | ||
245 | #define ACK_TYPRXGOOD 0x03 | ||
246 | #define ACK_TYPRXBAD 0x07 | ||
247 | |||
248 | #define SVRR_RX 0x01 | ||
249 | #define SVRR_TX 0x02 | ||
250 | #define SVRR_MDM 0x04 | ||
251 | |||
252 | #define ST_OVERRUN 0x01 | ||
253 | #define ST_FRAMING 0x02 | ||
254 | #define ST_PARITY 0x04 | ||
255 | #define ST_BREAK 0x08 | ||
256 | #define ST_SCHAR1 0x10 | ||
257 | #define ST_SCHAR2 0x20 | ||
258 | #define ST_SCHAR3 0x30 | ||
259 | #define ST_SCHAR4 0x40 | ||
260 | #define ST_RANGE 0x70 | ||
261 | #define ST_SCHARMASK 0x70 | ||
262 | #define ST_TIMEOUT 0x80 | ||
263 | |||
264 | #define MISR_DCD 0x80 | ||
265 | #define MISR_CTS 0x40 | ||
266 | #define MISR_RI 0x20 | ||
267 | #define MISR_DSR 0x10 | ||
268 | |||
269 | /*****************************************************************************/ | ||
270 | |||
271 | /* | ||
272 | * Defines for the CCSR status register. | ||
273 | */ | ||
274 | #define CCSR_RXENABLED 0x80 | ||
275 | #define CCSR_RXFLOWON 0x40 | ||
276 | #define CCSR_RXFLOWOFF 0x20 | ||
277 | #define CCSR_TXENABLED 0x08 | ||
278 | #define CCSR_TXFLOWON 0x04 | ||
279 | #define CCSR_TXFLOWOFF 0x02 | ||
280 | |||
281 | /*****************************************************************************/ | ||
282 | |||
283 | /* | ||
284 | * Define the embedded commands. | ||
285 | */ | ||
286 | #define ETC_CMD 0x00 | ||
287 | #define ETC_STARTBREAK 0x81 | ||
288 | #define ETC_DELAY 0x82 | ||
289 | #define ETC_STOPBREAK 0x83 | ||
290 | |||
291 | /*****************************************************************************/ | ||
292 | #endif | ||
diff --git a/include/linux/cdk.h b/include/linux/cdk.h deleted file mode 100644 index 80093a8d4f64..000000000000 --- a/include/linux/cdk.h +++ /dev/null | |||
@@ -1,486 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * cdk.h -- CDK interface definitions. | ||
5 | * | ||
6 | * Copyright (C) 1996-1998 Stallion Technologies | ||
7 | * Copyright (C) 1994-1996 Greg Ungerer. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | /*****************************************************************************/ | ||
25 | #ifndef _CDK_H | ||
26 | #define _CDK_H | ||
27 | /*****************************************************************************/ | ||
28 | |||
29 | #pragma pack(2) | ||
30 | |||
31 | /* | ||
32 | * The following set of definitions is used to communicate with the | ||
33 | * shared memory interface of the Stallion intelligent multiport serial | ||
34 | * boards. The definitions in this file are taken directly from the | ||
35 | * document titled "Generic Stackable Interface, Downloader and | ||
36 | * Communications Development Kit". | ||
37 | */ | ||
38 | |||
39 | /* | ||
40 | * Define the set of important shared memory addresses. These are | ||
41 | * required to initialize the board and get things started. All of these | ||
42 | * addresses are relative to the start of the shared memory. | ||
43 | */ | ||
44 | #define CDK_SIGADDR 0x200 | ||
45 | #define CDK_FEATADDR 0x280 | ||
46 | #define CDK_CDKADDR 0x300 | ||
47 | #define CDK_RDYADDR 0x262 | ||
48 | |||
49 | #define CDK_ALIVEMARKER 13 | ||
50 | |||
51 | /* | ||
52 | * On hardware power up the ROMs located on the EasyConnection 8/64 will | ||
53 | * fill out the following signature information into shared memory. This | ||
54 | * way the host system can quickly determine that the board is present | ||
55 | * and is operational. | ||
56 | */ | ||
57 | typedef struct cdkecpsig { | ||
58 | unsigned long magic; | ||
59 | unsigned short romver; | ||
60 | unsigned short cputype; | ||
61 | unsigned char panelid[8]; | ||
62 | } cdkecpsig_t; | ||
63 | |||
64 | #define ECP_MAGIC 0x21504345 | ||
65 | |||
66 | /* | ||
67 | * On hardware power up the ROMs located on the ONboard, Stallion and | ||
68 | * Brumbys will fill out the following signature information into shared | ||
69 | * memory. This way the host system can quickly determine that the board | ||
70 | * is present and is operational. | ||
71 | */ | ||
72 | typedef struct cdkonbsig { | ||
73 | unsigned short magic0; | ||
74 | unsigned short magic1; | ||
75 | unsigned short magic2; | ||
76 | unsigned short magic3; | ||
77 | unsigned short romver; | ||
78 | unsigned short memoff; | ||
79 | unsigned short memseg; | ||
80 | unsigned short amask0; | ||
81 | unsigned short pic; | ||
82 | unsigned short status; | ||
83 | unsigned short btype; | ||
84 | unsigned short clkticks; | ||
85 | unsigned short clkspeed; | ||
86 | unsigned short amask1; | ||
87 | unsigned short amask2; | ||
88 | } cdkonbsig_t; | ||
89 | |||
90 | #define ONB_MAGIC0 0xf2a7 | ||
91 | #define ONB_MAGIC1 0xa149 | ||
92 | #define ONB_MAGIC2 0x6352 | ||
93 | #define ONB_MAGIC3 0xf121 | ||
94 | |||
95 | /* | ||
96 | * Define the feature area structure. The feature area is the set of | ||
97 | * startup parameters used by the slave image when it starts executing. | ||
98 | * They allow for the specification of buffer sizes, debug trace, etc. | ||
99 | */ | ||
100 | typedef struct cdkfeature { | ||
101 | unsigned long debug; | ||
102 | unsigned long banner; | ||
103 | unsigned long etype; | ||
104 | unsigned long nrdevs; | ||
105 | unsigned long brdspec; | ||
106 | unsigned long txrqsize; | ||
107 | unsigned long rxrqsize; | ||
108 | unsigned long flags; | ||
109 | } cdkfeature_t; | ||
110 | |||
111 | #define ETYP_DDK 0 | ||
112 | #define ETYP_CDK 1 | ||
113 | |||
114 | /* | ||
115 | * Define the CDK header structure. This is the info that the slave | ||
116 | * environment sets up after it has been downloaded and started. It | ||
117 | * essentially provides a memory map for the shared memory interface. | ||
118 | */ | ||
119 | typedef struct cdkhdr { | ||
120 | unsigned short command; | ||
121 | unsigned short status; | ||
122 | unsigned short port; | ||
123 | unsigned short mode; | ||
124 | unsigned long cmd_buf[14]; | ||
125 | unsigned short alive_cnt; | ||
126 | unsigned short intrpt_mode; | ||
127 | unsigned char intrpt_id[8]; | ||
128 | unsigned char ver_release; | ||
129 | unsigned char ver_modification; | ||
130 | unsigned char ver_fix; | ||
131 | unsigned char deadman_restart; | ||
132 | unsigned short deadman; | ||
133 | unsigned short nrdevs; | ||
134 | unsigned long memp; | ||
135 | unsigned long hostp; | ||
136 | unsigned long slavep; | ||
137 | unsigned char hostreq; | ||
138 | unsigned char slavereq; | ||
139 | unsigned char cmd_reserved[30]; | ||
140 | } cdkhdr_t; | ||
141 | |||
142 | #define MODE_DDK 0 | ||
143 | #define MODE_CDK 1 | ||
144 | |||
145 | #define IMD_INTR 0x0 | ||
146 | #define IMD_PPINTR 0x1 | ||
147 | #define IMD_POLL 0xff | ||
148 | |||
149 | /* | ||
150 | * Define the memory mapping structure. This structure is pointed to by | ||
151 | * the memp field in the stlcdkhdr struct. As many as these structures | ||
152 | * as required are laid out in shared memory to define how the rest of | ||
153 | * shared memory is divided up. There will be one for each port. | ||
154 | */ | ||
155 | typedef struct cdkmem { | ||
156 | unsigned short dtype; | ||
157 | unsigned long offset; | ||
158 | } cdkmem_t; | ||
159 | |||
160 | #define TYP_UNDEFINED 0x0 | ||
161 | #define TYP_ASYNCTRL 0x1 | ||
162 | #define TYP_ASYNC 0x20 | ||
163 | #define TYP_PARALLEL 0x40 | ||
164 | #define TYP_SYNCX21 0x60 | ||
165 | |||
166 | /*****************************************************************************/ | ||
167 | |||
168 | /* | ||
169 | * Following is a set of defines and structures used to actually deal | ||
170 | * with the serial ports on the board. Firstly is the set of commands | ||
171 | * that can be applied to ports. | ||
172 | */ | ||
173 | #define ASYCMD (((unsigned long) 'a') << 8) | ||
174 | |||
175 | #define A_NULL (ASYCMD | 0) | ||
176 | #define A_FLUSH (ASYCMD | 1) | ||
177 | #define A_BREAK (ASYCMD | 2) | ||
178 | #define A_GETPORT (ASYCMD | 3) | ||
179 | #define A_SETPORT (ASYCMD | 4) | ||
180 | #define A_SETPORTF (ASYCMD | 5) | ||
181 | #define A_SETPORTFTX (ASYCMD | 6) | ||
182 | #define A_SETPORTFRX (ASYCMD | 7) | ||
183 | #define A_GETSIGNALS (ASYCMD | 8) | ||
184 | #define A_SETSIGNALS (ASYCMD | 9) | ||
185 | #define A_SETSIGNALSF (ASYCMD | 10) | ||
186 | #define A_SETSIGNALSFTX (ASYCMD | 11) | ||
187 | #define A_SETSIGNALSFRX (ASYCMD | 12) | ||
188 | #define A_GETNOTIFY (ASYCMD | 13) | ||
189 | #define A_SETNOTIFY (ASYCMD | 14) | ||
190 | #define A_NOTIFY (ASYCMD | 15) | ||
191 | #define A_PORTCTRL (ASYCMD | 16) | ||
192 | #define A_GETSTATS (ASYCMD | 17) | ||
193 | #define A_RQSTATE (ASYCMD | 18) | ||
194 | #define A_FLOWSTATE (ASYCMD | 19) | ||
195 | #define A_CLEARSTATS (ASYCMD | 20) | ||
196 | |||
197 | /* | ||
198 | * Define those arguments used for simple commands. | ||
199 | */ | ||
200 | #define FLUSHRX 0x1 | ||
201 | #define FLUSHTX 0x2 | ||
202 | |||
203 | #define BREAKON -1 | ||
204 | #define BREAKOFF -2 | ||
205 | |||
206 | /* | ||
207 | * Define the port setting structure, and all those defines that go along | ||
208 | * with it. Basically this structure defines the characteristics of this | ||
209 | * port: baud rate, chars, parity, input/output char cooking etc. | ||
210 | */ | ||
211 | typedef struct asyport { | ||
212 | unsigned long baudout; | ||
213 | unsigned long baudin; | ||
214 | unsigned long iflag; | ||
215 | unsigned long oflag; | ||
216 | unsigned long lflag; | ||
217 | unsigned long pflag; | ||
218 | unsigned long flow; | ||
219 | unsigned long spare1; | ||
220 | unsigned short vtime; | ||
221 | unsigned short vmin; | ||
222 | unsigned short txlo; | ||
223 | unsigned short txhi; | ||
224 | unsigned short rxlo; | ||
225 | unsigned short rxhi; | ||
226 | unsigned short rxhog; | ||
227 | unsigned short spare2; | ||
228 | unsigned char csize; | ||
229 | unsigned char stopbs; | ||
230 | unsigned char parity; | ||
231 | unsigned char stopin; | ||
232 | unsigned char startin; | ||
233 | unsigned char stopout; | ||
234 | unsigned char startout; | ||
235 | unsigned char parmark; | ||
236 | unsigned char brkmark; | ||
237 | unsigned char cc[11]; | ||
238 | } asyport_t; | ||
239 | |||
240 | #define PT_STOP1 0x0 | ||
241 | #define PT_STOP15 0x1 | ||
242 | #define PT_STOP2 0x2 | ||
243 | |||
244 | #define PT_NOPARITY 0x0 | ||
245 | #define PT_ODDPARITY 0x1 | ||
246 | #define PT_EVENPARITY 0x2 | ||
247 | #define PT_MARKPARITY 0x3 | ||
248 | #define PT_SPACEPARITY 0x4 | ||
249 | |||
250 | #define F_NONE 0x0 | ||
251 | #define F_IXON 0x1 | ||
252 | #define F_IXOFF 0x2 | ||
253 | #define F_IXANY 0x4 | ||
254 | #define F_IOXANY 0x8 | ||
255 | #define F_RTSFLOW 0x10 | ||
256 | #define F_CTSFLOW 0x20 | ||
257 | #define F_DTRFLOW 0x40 | ||
258 | #define F_DCDFLOW 0x80 | ||
259 | #define F_DSROFLOW 0x100 | ||
260 | #define F_DSRIFLOW 0x200 | ||
261 | |||
262 | #define FI_NORX 0x1 | ||
263 | #define FI_RAW 0x2 | ||
264 | #define FI_ISTRIP 0x4 | ||
265 | #define FI_UCLC 0x8 | ||
266 | #define FI_INLCR 0x10 | ||
267 | #define FI_ICRNL 0x20 | ||
268 | #define FI_IGNCR 0x40 | ||
269 | #define FI_IGNBREAK 0x80 | ||
270 | #define FI_DSCRDBREAK 0x100 | ||
271 | #define FI_1MARKBREAK 0x200 | ||
272 | #define FI_2MARKBREAK 0x400 | ||
273 | #define FI_XCHNGBREAK 0x800 | ||
274 | #define FI_IGNRXERRS 0x1000 | ||
275 | #define FI_DSCDRXERRS 0x2000 | ||
276 | #define FI_1MARKRXERRS 0x4000 | ||
277 | #define FI_2MARKRXERRS 0x8000 | ||
278 | #define FI_XCHNGRXERRS 0x10000 | ||
279 | #define FI_DSCRDNULL 0x20000 | ||
280 | |||
281 | #define FO_OLCUC 0x1 | ||
282 | #define FO_ONLCR 0x2 | ||
283 | #define FO_OOCRNL 0x4 | ||
284 | #define FO_ONOCR 0x8 | ||
285 | #define FO_ONLRET 0x10 | ||
286 | #define FO_ONL 0x20 | ||
287 | #define FO_OBS 0x40 | ||
288 | #define FO_OVT 0x80 | ||
289 | #define FO_OFF 0x100 | ||
290 | #define FO_OTAB1 0x200 | ||
291 | #define FO_OTAB2 0x400 | ||
292 | #define FO_OTAB3 0x800 | ||
293 | #define FO_OCR1 0x1000 | ||
294 | #define FO_OCR2 0x2000 | ||
295 | #define FO_OCR3 0x4000 | ||
296 | #define FO_OFILL 0x8000 | ||
297 | #define FO_ODELL 0x10000 | ||
298 | |||
299 | #define P_RTSLOCK 0x1 | ||
300 | #define P_CTSLOCK 0x2 | ||
301 | #define P_MAPRTS 0x4 | ||
302 | #define P_MAPCTS 0x8 | ||
303 | #define P_LOOPBACK 0x10 | ||
304 | #define P_DTRFOLLOW 0x20 | ||
305 | #define P_FAKEDCD 0x40 | ||
306 | |||
307 | #define P_RXIMIN 0x10000 | ||
308 | #define P_RXITIME 0x20000 | ||
309 | #define P_RXTHOLD 0x40000 | ||
310 | |||
311 | /* | ||
312 | * Define a structure to communicate serial port signal and data state | ||
313 | * information. | ||
314 | */ | ||
315 | typedef struct asysigs { | ||
316 | unsigned long data; | ||
317 | unsigned long signal; | ||
318 | unsigned long sigvalue; | ||
319 | } asysigs_t; | ||
320 | |||
321 | #define DT_TXBUSY 0x1 | ||
322 | #define DT_TXEMPTY 0x2 | ||
323 | #define DT_TXLOW 0x4 | ||
324 | #define DT_TXHIGH 0x8 | ||
325 | #define DT_TXFULL 0x10 | ||
326 | #define DT_TXHOG 0x20 | ||
327 | #define DT_TXFLOWED 0x40 | ||
328 | #define DT_TXBREAK 0x80 | ||
329 | |||
330 | #define DT_RXBUSY 0x100 | ||
331 | #define DT_RXEMPTY 0x200 | ||
332 | #define DT_RXLOW 0x400 | ||
333 | #define DT_RXHIGH 0x800 | ||
334 | #define DT_RXFULL 0x1000 | ||
335 | #define DT_RXHOG 0x2000 | ||
336 | #define DT_RXFLOWED 0x4000 | ||
337 | #define DT_RXBREAK 0x8000 | ||
338 | |||
339 | #define SG_DTR 0x1 | ||
340 | #define SG_DCD 0x2 | ||
341 | #define SG_RTS 0x4 | ||
342 | #define SG_CTS 0x8 | ||
343 | #define SG_DSR 0x10 | ||
344 | #define SG_RI 0x20 | ||
345 | |||
346 | /* | ||
347 | * Define the notification setting structure. This is used to tell the | ||
348 | * port what events we want to be informed about. Fields here use the | ||
349 | * same defines as for the asysigs structure above. | ||
350 | */ | ||
351 | typedef struct asynotify { | ||
352 | unsigned long ctrl; | ||
353 | unsigned long data; | ||
354 | unsigned long signal; | ||
355 | unsigned long sigvalue; | ||
356 | } asynotify_t; | ||
357 | |||
358 | /* | ||
359 | * Define the port control structure. It is used to do fine grain | ||
360 | * control operations on the port. | ||
361 | */ | ||
362 | typedef struct { | ||
363 | unsigned long rxctrl; | ||
364 | unsigned long txctrl; | ||
365 | char rximdch; | ||
366 | char tximdch; | ||
367 | char spare1; | ||
368 | char spare2; | ||
369 | } asyctrl_t; | ||
370 | |||
371 | #define CT_ENABLE 0x1 | ||
372 | #define CT_DISABLE 0x2 | ||
373 | #define CT_STOP 0x4 | ||
374 | #define CT_START 0x8 | ||
375 | #define CT_STARTFLOW 0x10 | ||
376 | #define CT_STOPFLOW 0x20 | ||
377 | #define CT_SENDCHR 0x40 | ||
378 | |||
379 | /* | ||
380 | * Define the stats structure kept for each port. This is a useful set | ||
381 | * of data collected for each port on the slave. The A_GETSTATS command | ||
382 | * is used to retrieve this data from the slave. | ||
383 | */ | ||
384 | typedef struct asystats { | ||
385 | unsigned long opens; | ||
386 | unsigned long txchars; | ||
387 | unsigned long rxchars; | ||
388 | unsigned long txringq; | ||
389 | unsigned long rxringq; | ||
390 | unsigned long txmsgs; | ||
391 | unsigned long rxmsgs; | ||
392 | unsigned long txflushes; | ||
393 | unsigned long rxflushes; | ||
394 | unsigned long overruns; | ||
395 | unsigned long framing; | ||
396 | unsigned long parity; | ||
397 | unsigned long ringover; | ||
398 | unsigned long lost; | ||
399 | unsigned long rxstart; | ||
400 | unsigned long rxstop; | ||
401 | unsigned long txstart; | ||
402 | unsigned long txstop; | ||
403 | unsigned long dcdcnt; | ||
404 | unsigned long dtrcnt; | ||
405 | unsigned long ctscnt; | ||
406 | unsigned long rtscnt; | ||
407 | unsigned long dsrcnt; | ||
408 | unsigned long ricnt; | ||
409 | unsigned long txbreaks; | ||
410 | unsigned long rxbreaks; | ||
411 | unsigned long signals; | ||
412 | unsigned long state; | ||
413 | unsigned long hwid; | ||
414 | } asystats_t; | ||
415 | |||
416 | /*****************************************************************************/ | ||
417 | |||
418 | /* | ||
419 | * All command and control communication with a device on the slave is | ||
420 | * via a control block in shared memory. Each device has its own control | ||
421 | * block, defined by the following structure. The control block allows | ||
422 | * the host to open, close and control the device on the slave. | ||
423 | */ | ||
424 | typedef struct cdkctrl { | ||
425 | unsigned char open; | ||
426 | unsigned char close; | ||
427 | unsigned long openarg; | ||
428 | unsigned long closearg; | ||
429 | unsigned long cmd; | ||
430 | unsigned long status; | ||
431 | unsigned long args[32]; | ||
432 | } cdkctrl_t; | ||
433 | |||
434 | /* | ||
435 | * Each device on the slave passes data to and from the host via a ring | ||
436 | * queue in shared memory. Define a ring queue structure to hold the | ||
437 | * vital information about each ring queue. Two ring queues will be | ||
438 | * allocated for each port, one for receive data and one for transmit | ||
439 | * data. | ||
440 | */ | ||
441 | typedef struct cdkasyrq { | ||
442 | unsigned long offset; | ||
443 | unsigned short size; | ||
444 | unsigned short head; | ||
445 | unsigned short tail; | ||
446 | } cdkasyrq_t; | ||
447 | |||
448 | /* | ||
449 | * Each asynchronous port is defined in shared memory by the following | ||
450 | * structure. It contains a control block to command a device, and also | ||
451 | * the necessary data channel information as well. | ||
452 | */ | ||
453 | typedef struct cdkasy { | ||
454 | cdkctrl_t ctrl; | ||
455 | unsigned short notify; | ||
456 | asynotify_t changed; | ||
457 | unsigned short receive; | ||
458 | cdkasyrq_t rxq; | ||
459 | unsigned short transmit; | ||
460 | cdkasyrq_t txq; | ||
461 | } cdkasy_t; | ||
462 | |||
463 | #pragma pack() | ||
464 | |||
465 | /*****************************************************************************/ | ||
466 | |||
467 | /* | ||
468 | * Define the set of ioctls used by the driver to do special things | ||
469 | * to the board. These include interrupting it, and initializing | ||
470 | * the driver after board startup and shutdown. | ||
471 | */ | ||
472 | #include <linux/ioctl.h> | ||
473 | |||
474 | #define STL_BINTR _IO('s',20) | ||
475 | #define STL_BSTART _IO('s',21) | ||
476 | #define STL_BSTOP _IO('s',22) | ||
477 | #define STL_BRESET _IO('s',23) | ||
478 | |||
479 | /* | ||
480 | * Define a set of ioctl extensions, used to get at special stuff. | ||
481 | */ | ||
482 | #define STL_GETPFLAG _IO('s',80) | ||
483 | #define STL_SETPFLAG _IO('s',81) | ||
484 | |||
485 | /*****************************************************************************/ | ||
486 | #endif | ||
diff --git a/include/linux/comstats.h b/include/linux/comstats.h deleted file mode 100644 index 3f5ea8e8026d..000000000000 --- a/include/linux/comstats.h +++ /dev/null | |||
@@ -1,119 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * comstats.h -- Serial Port Stats. | ||
5 | * | ||
6 | * Copyright (C) 1996-1998 Stallion Technologies | ||
7 | * Copyright (C) 1994-1996 Greg Ungerer. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | /*****************************************************************************/ | ||
25 | #ifndef _COMSTATS_H | ||
26 | #define _COMSTATS_H | ||
27 | /*****************************************************************************/ | ||
28 | |||
29 | /* | ||
30 | * Serial port stats structure. The structure itself is UART | ||
31 | * independent, but some fields may be UART/driver specific (for | ||
32 | * example state). | ||
33 | */ | ||
34 | |||
35 | typedef struct { | ||
36 | unsigned long brd; | ||
37 | unsigned long panel; | ||
38 | unsigned long port; | ||
39 | unsigned long hwid; | ||
40 | unsigned long type; | ||
41 | unsigned long txtotal; | ||
42 | unsigned long rxtotal; | ||
43 | unsigned long txbuffered; | ||
44 | unsigned long rxbuffered; | ||
45 | unsigned long rxoverrun; | ||
46 | unsigned long rxparity; | ||
47 | unsigned long rxframing; | ||
48 | unsigned long rxlost; | ||
49 | unsigned long txbreaks; | ||
50 | unsigned long rxbreaks; | ||
51 | unsigned long txxon; | ||
52 | unsigned long txxoff; | ||
53 | unsigned long rxxon; | ||
54 | unsigned long rxxoff; | ||
55 | unsigned long txctson; | ||
56 | unsigned long txctsoff; | ||
57 | unsigned long rxrtson; | ||
58 | unsigned long rxrtsoff; | ||
59 | unsigned long modem; | ||
60 | unsigned long state; | ||
61 | unsigned long flags; | ||
62 | unsigned long ttystate; | ||
63 | unsigned long cflags; | ||
64 | unsigned long iflags; | ||
65 | unsigned long oflags; | ||
66 | unsigned long lflags; | ||
67 | unsigned long signals; | ||
68 | } comstats_t; | ||
69 | |||
70 | |||
71 | /* | ||
72 | * Board stats structure. Returns useful info about the board. | ||
73 | */ | ||
74 | |||
75 | #define COM_MAXPANELS 8 | ||
76 | |||
77 | typedef struct { | ||
78 | unsigned long panel; | ||
79 | unsigned long type; | ||
80 | unsigned long hwid; | ||
81 | unsigned long nrports; | ||
82 | } companel_t; | ||
83 | |||
84 | typedef struct { | ||
85 | unsigned long brd; | ||
86 | unsigned long type; | ||
87 | unsigned long hwid; | ||
88 | unsigned long state; | ||
89 | unsigned long ioaddr; | ||
90 | unsigned long ioaddr2; | ||
91 | unsigned long memaddr; | ||
92 | unsigned long irq; | ||
93 | unsigned long nrpanels; | ||
94 | unsigned long nrports; | ||
95 | companel_t panels[COM_MAXPANELS]; | ||
96 | } combrd_t; | ||
97 | |||
98 | |||
99 | /* | ||
100 | * Define the ioctl operations for stats stuff. | ||
101 | */ | ||
102 | #include <linux/ioctl.h> | ||
103 | |||
104 | #define COM_GETPORTSTATS _IO('c',30) | ||
105 | #define COM_CLRPORTSTATS _IO('c',31) | ||
106 | #define COM_GETBRDSTATS _IO('c',32) | ||
107 | |||
108 | |||
109 | /* | ||
110 | * Define the set of ioctls that give user level access to the | ||
111 | * private port, panel and board structures. The argument required | ||
112 | * will be driver dependent! | ||
113 | */ | ||
114 | #define COM_READPORT _IO('c',40) | ||
115 | #define COM_READBOARD _IO('c',41) | ||
116 | #define COM_READPANEL _IO('c',42) | ||
117 | |||
118 | /*****************************************************************************/ | ||
119 | #endif | ||
diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h deleted file mode 100644 index 79b3eb37243a..000000000000 --- a/include/linux/generic_serial.h +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | /* | ||
2 | * generic_serial.h | ||
3 | * | ||
4 | * Copyright (C) 1998 R.E.Wolff@BitWizard.nl | ||
5 | * | ||
6 | * written for the SX serial driver. | ||
7 | * | ||
8 | * Version 0.1 -- December, 1998. | ||
9 | */ | ||
10 | |||
11 | #ifndef GENERIC_SERIAL_H | ||
12 | #define GENERIC_SERIAL_H | ||
13 | |||
14 | #warning Use of this header is deprecated. | ||
15 | #warning Since nobody sets the constants defined here for you, you should not, in any case, use them. Including the header is thus pointless. | ||
16 | |||
17 | /* Flags */ | ||
18 | /* Warning: serial.h defines some ASYNC_ flags, they say they are "only" | ||
19 | used in serial.c, but they are also used in all other serial drivers. | ||
20 | Make sure they don't clash with these here... */ | ||
21 | #define GS_TX_INTEN 0x00800000 | ||
22 | #define GS_RX_INTEN 0x00400000 | ||
23 | #define GS_ACTIVE 0x00200000 | ||
24 | |||
25 | #define GS_TYPE_NORMAL 1 | ||
26 | |||
27 | #define GS_DEBUG_FLUSH 0x00000001 | ||
28 | #define GS_DEBUG_BTR 0x00000002 | ||
29 | #define GS_DEBUG_TERMIOS 0x00000004 | ||
30 | #define GS_DEBUG_STUFF 0x00000008 | ||
31 | #define GS_DEBUG_CLOSE 0x00000010 | ||
32 | #define GS_DEBUG_FLOW 0x00000020 | ||
33 | #define GS_DEBUG_WRITE 0x00000040 | ||
34 | |||
35 | #endif | ||
diff --git a/include/linux/istallion.h b/include/linux/istallion.h deleted file mode 100644 index ad700a60c158..000000000000 --- a/include/linux/istallion.h +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * istallion.h -- stallion intelligent multiport serial driver. | ||
5 | * | ||
6 | * Copyright (C) 1996-1998 Stallion Technologies | ||
7 | * Copyright (C) 1994-1996 Greg Ungerer. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | /*****************************************************************************/ | ||
25 | #ifndef _ISTALLION_H | ||
26 | #define _ISTALLION_H | ||
27 | /*****************************************************************************/ | ||
28 | |||
29 | /* | ||
30 | * Define important driver constants here. | ||
31 | */ | ||
32 | #define STL_MAXBRDS 4 | ||
33 | #define STL_MAXPANELS 4 | ||
34 | #define STL_MAXPORTS 64 | ||
35 | #define STL_MAXCHANS (STL_MAXPORTS + 1) | ||
36 | #define STL_MAXDEVS (STL_MAXBRDS * STL_MAXPORTS) | ||
37 | |||
38 | |||
39 | /* | ||
40 | * Define a set of structures to hold all the board/panel/port info | ||
41 | * for our ports. These will be dynamically allocated as required at | ||
42 | * driver initialization time. | ||
43 | */ | ||
44 | |||
45 | /* | ||
46 | * Port and board structures to hold status info about each object. | ||
47 | * The board structure contains pointers to structures for each port | ||
48 | * connected to it. Panels are not distinguished here, since | ||
49 | * communication with the slave board will always be on a per port | ||
50 | * basis. | ||
51 | */ | ||
52 | struct stliport { | ||
53 | unsigned long magic; | ||
54 | struct tty_port port; | ||
55 | unsigned int portnr; | ||
56 | unsigned int panelnr; | ||
57 | unsigned int brdnr; | ||
58 | unsigned long state; | ||
59 | unsigned int devnr; | ||
60 | int baud_base; | ||
61 | int custom_divisor; | ||
62 | int closing_wait; | ||
63 | int rc; | ||
64 | int argsize; | ||
65 | void *argp; | ||
66 | unsigned int rxmarkmsk; | ||
67 | wait_queue_head_t raw_wait; | ||
68 | struct asysigs asig; | ||
69 | unsigned long addr; | ||
70 | unsigned long rxoffset; | ||
71 | unsigned long txoffset; | ||
72 | unsigned long sigs; | ||
73 | unsigned long pflag; | ||
74 | unsigned int rxsize; | ||
75 | unsigned int txsize; | ||
76 | unsigned char reqbit; | ||
77 | unsigned char portidx; | ||
78 | unsigned char portbit; | ||
79 | }; | ||
80 | |||
81 | /* | ||
82 | * Use a structure of function pointers to do board level operations. | ||
83 | * These include, enable/disable, paging shared memory, interrupting, etc. | ||
84 | */ | ||
85 | struct stlibrd { | ||
86 | unsigned long magic; | ||
87 | unsigned int brdnr; | ||
88 | unsigned int brdtype; | ||
89 | unsigned long state; | ||
90 | unsigned int nrpanels; | ||
91 | unsigned int nrports; | ||
92 | unsigned int nrdevs; | ||
93 | unsigned int iobase; | ||
94 | int iosize; | ||
95 | unsigned long memaddr; | ||
96 | void __iomem *membase; | ||
97 | unsigned long memsize; | ||
98 | int pagesize; | ||
99 | int hostoffset; | ||
100 | int slaveoffset; | ||
101 | int bitsize; | ||
102 | int enabval; | ||
103 | unsigned int panels[STL_MAXPANELS]; | ||
104 | int panelids[STL_MAXPANELS]; | ||
105 | void (*init)(struct stlibrd *brdp); | ||
106 | void (*enable)(struct stlibrd *brdp); | ||
107 | void (*reenable)(struct stlibrd *brdp); | ||
108 | void (*disable)(struct stlibrd *brdp); | ||
109 | void __iomem *(*getmemptr)(struct stlibrd *brdp, unsigned long offset, int line); | ||
110 | void (*intr)(struct stlibrd *brdp); | ||
111 | void (*reset)(struct stlibrd *brdp); | ||
112 | struct stliport *ports[STL_MAXPORTS]; | ||
113 | }; | ||
114 | |||
115 | |||
116 | /* | ||
117 | * Define MAGIC numbers used for above structures. | ||
118 | */ | ||
119 | #define STLI_PORTMAGIC 0xe671c7a1 | ||
120 | #define STLI_BOARDMAGIC 0x4bc6c825 | ||
121 | |||
122 | /*****************************************************************************/ | ||
123 | #endif | ||
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index daf4a3a40ee0..b7c8cdc1d422 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h | |||
@@ -65,7 +65,6 @@ struct kbd_struct { | |||
65 | 65 | ||
66 | extern int kbd_init(void); | 66 | extern int kbd_init(void); |
67 | 67 | ||
68 | extern unsigned char getledstate(void); | ||
69 | extern void setledstate(struct kbd_struct *kbd, unsigned int led); | 68 | extern void setledstate(struct kbd_struct *kbd, unsigned int led); |
70 | 69 | ||
71 | extern int do_poke_blanked_console; | 70 | extern int do_poke_blanked_console; |
@@ -145,16 +144,4 @@ void compute_shiftstate(void); | |||
145 | 144 | ||
146 | extern unsigned int keymap_count; | 145 | extern unsigned int keymap_count; |
147 | 146 | ||
148 | /* console.c */ | ||
149 | |||
150 | static inline void con_schedule_flip(struct tty_struct *t) | ||
151 | { | ||
152 | unsigned long flags; | ||
153 | spin_lock_irqsave(&t->buf.lock, flags); | ||
154 | if (t->buf.tail != NULL) | ||
155 | t->buf.tail->commit = t->buf.tail->used; | ||
156 | spin_unlock_irqrestore(&t->buf.lock, flags); | ||
157 | schedule_work(&t->buf.work); | ||
158 | } | ||
159 | |||
160 | #endif | 147 | #endif |
diff --git a/include/linux/sc26198.h b/include/linux/sc26198.h deleted file mode 100644 index 7ca35abad387..000000000000 --- a/include/linux/sc26198.h +++ /dev/null | |||
@@ -1,533 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * sc26198.h -- SC26198 UART hardware info. | ||
5 | * | ||
6 | * Copyright (C) 1995-1998 Stallion Technologies | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | /*****************************************************************************/ | ||
24 | #ifndef _SC26198_H | ||
25 | #define _SC26198_H | ||
26 | /*****************************************************************************/ | ||
27 | |||
28 | /* | ||
29 | * Define the number of async ports per sc26198 uart device. | ||
30 | */ | ||
31 | #define SC26198_PORTS 8 | ||
32 | |||
33 | /* | ||
34 | * Baud rate timing clocks. All derived from a master 14.7456 MHz clock. | ||
35 | */ | ||
36 | #define SC26198_MASTERCLOCK 14745600L | ||
37 | #define SC26198_DCLK (SC26198_MASTERCLOCK) | ||
38 | #define SC26198_CCLK (SC26198_MASTERCLOCK / 2) | ||
39 | #define SC26198_BCLK (SC26198_MASTERCLOCK / 4) | ||
40 | |||
41 | /* | ||
42 | * Define internal FIFO sizes for the 26198 ports. | ||
43 | */ | ||
44 | #define SC26198_TXFIFOSIZE 16 | ||
45 | #define SC26198_RXFIFOSIZE 16 | ||
46 | |||
47 | /*****************************************************************************/ | ||
48 | |||
49 | /* | ||
50 | * Global register definitions. These registers are global to each 26198 | ||
51 | * device, not specific ports on it. | ||
52 | */ | ||
53 | #define TSTR 0x0d | ||
54 | #define GCCR 0x0f | ||
55 | #define ICR 0x1b | ||
56 | #define WDTRCR 0x1d | ||
57 | #define IVR 0x1f | ||
58 | #define BRGTRUA 0x84 | ||
59 | #define GPOSR 0x87 | ||
60 | #define GPOC 0x8b | ||
61 | #define UCIR 0x8c | ||
62 | #define CIR 0x8c | ||
63 | #define BRGTRUB 0x8d | ||
64 | #define GRXFIFO 0x8e | ||
65 | #define GTXFIFO 0x8e | ||
66 | #define GCCR2 0x8f | ||
67 | #define BRGTRLA 0x94 | ||
68 | #define GPOR 0x97 | ||
69 | #define GPOD 0x9b | ||
70 | #define BRGTCR 0x9c | ||
71 | #define GICR 0x9c | ||
72 | #define BRGTRLB 0x9d | ||
73 | #define GIBCR 0x9d | ||
74 | #define GITR 0x9f | ||
75 | |||
76 | /* | ||
77 | * Per port channel registers. These are the register offsets within | ||
78 | * the port address space, so need to have the port address (0 to 7) | ||
79 | * inserted in bit positions 4:6. | ||
80 | */ | ||
81 | #define MR0 0x00 | ||
82 | #define MR1 0x01 | ||
83 | #define IOPCR 0x02 | ||
84 | #define BCRBRK 0x03 | ||
85 | #define BCRCOS 0x04 | ||
86 | #define BCRX 0x06 | ||
87 | #define BCRA 0x07 | ||
88 | #define XONCR 0x08 | ||
89 | #define XOFFCR 0x09 | ||
90 | #define ARCR 0x0a | ||
91 | #define RXCSR 0x0c | ||
92 | #define TXCSR 0x0e | ||
93 | #define MR2 0x80 | ||
94 | #define SR 0x81 | ||
95 | #define SCCR 0x81 | ||
96 | #define ISR 0x82 | ||
97 | #define IMR 0x82 | ||
98 | #define TXFIFO 0x83 | ||
99 | #define RXFIFO 0x83 | ||
100 | #define IPR 0x84 | ||
101 | #define IOPIOR 0x85 | ||
102 | #define XISR 0x86 | ||
103 | |||
104 | /* | ||
105 | * For any given port calculate the address to use to access a specified | ||
106 | * register. This is only used for unusual access, mostly this is done | ||
107 | * through the assembler access routines. | ||
108 | */ | ||
109 | #define SC26198_PORTREG(port,reg) ((((port) & 0x07) << 4) | (reg)) | ||
110 | |||
111 | /*****************************************************************************/ | ||
112 | |||
113 | /* | ||
114 | * Global configuration control register bit definitions. | ||
115 | */ | ||
116 | #define GCCR_NOACK 0x00 | ||
117 | #define GCCR_IVRACK 0x02 | ||
118 | #define GCCR_IVRCHANACK 0x04 | ||
119 | #define GCCR_IVRTYPCHANACK 0x06 | ||
120 | #define GCCR_ASYNCCYCLE 0x00 | ||
121 | #define GCCR_SYNCCYCLE 0x40 | ||
122 | |||
123 | /*****************************************************************************/ | ||
124 | |||
125 | /* | ||
126 | * Mode register 0 bit definitions. | ||
127 | */ | ||
128 | #define MR0_ADDRNONE 0x00 | ||
129 | #define MR0_AUTOWAKE 0x01 | ||
130 | #define MR0_AUTODOZE 0x02 | ||
131 | #define MR0_AUTOWAKEDOZE 0x03 | ||
132 | #define MR0_SWFNONE 0x00 | ||
133 | #define MR0_SWFTX 0x04 | ||
134 | #define MR0_SWFRX 0x08 | ||
135 | #define MR0_SWFRXTX 0x0c | ||
136 | #define MR0_TXMASK 0x30 | ||
137 | #define MR0_TXEMPTY 0x00 | ||
138 | #define MR0_TXHIGH 0x10 | ||
139 | #define MR0_TXHALF 0x20 | ||
140 | #define MR0_TXRDY 0x00 | ||
141 | #define MR0_ADDRNT 0x00 | ||
142 | #define MR0_ADDRT 0x40 | ||
143 | #define MR0_SWFNT 0x00 | ||
144 | #define MR0_SWFT 0x80 | ||
145 | |||
146 | /* | ||
147 | * Mode register 1 bit definitions. | ||
148 | */ | ||
149 | #define MR1_CS5 0x00 | ||
150 | #define MR1_CS6 0x01 | ||
151 | #define MR1_CS7 0x02 | ||
152 | #define MR1_CS8 0x03 | ||
153 | #define MR1_PAREVEN 0x00 | ||
154 | #define MR1_PARODD 0x04 | ||
155 | #define MR1_PARENB 0x00 | ||
156 | #define MR1_PARFORCE 0x08 | ||
157 | #define MR1_PARNONE 0x10 | ||
158 | #define MR1_PARSPECIAL 0x18 | ||
159 | #define MR1_ERRCHAR 0x00 | ||
160 | #define MR1_ERRBLOCK 0x20 | ||
161 | #define MR1_ISRUNMASKED 0x00 | ||
162 | #define MR1_ISRMASKED 0x40 | ||
163 | #define MR1_AUTORTS 0x80 | ||
164 | |||
165 | /* | ||
166 | * Mode register 2 bit definitions. | ||
167 | */ | ||
168 | #define MR2_STOP1 0x00 | ||
169 | #define MR2_STOP15 0x01 | ||
170 | #define MR2_STOP2 0x02 | ||
171 | #define MR2_STOP916 0x03 | ||
172 | #define MR2_RXFIFORDY 0x00 | ||
173 | #define MR2_RXFIFOHALF 0x04 | ||
174 | #define MR2_RXFIFOHIGH 0x08 | ||
175 | #define MR2_RXFIFOFULL 0x0c | ||
176 | #define MR2_AUTOCTS 0x10 | ||
177 | #define MR2_TXRTS 0x20 | ||
178 | #define MR2_MODENORM 0x00 | ||
179 | #define MR2_MODEAUTOECHO 0x40 | ||
180 | #define MR2_MODELOOP 0x80 | ||
181 | #define MR2_MODEREMECHO 0xc0 | ||
182 | |||
183 | /*****************************************************************************/ | ||
184 | |||
185 | /* | ||
186 | * Baud Rate Generator (BRG) selector values. | ||
187 | */ | ||
188 | #define BRG_50 0x00 | ||
189 | #define BRG_75 0x01 | ||
190 | #define BRG_150 0x02 | ||
191 | #define BRG_200 0x03 | ||
192 | #define BRG_300 0x04 | ||
193 | #define BRG_450 0x05 | ||
194 | #define BRG_600 0x06 | ||
195 | #define BRG_900 0x07 | ||
196 | #define BRG_1200 0x08 | ||
197 | #define BRG_1800 0x09 | ||
198 | #define BRG_2400 0x0a | ||
199 | #define BRG_3600 0x0b | ||
200 | #define BRG_4800 0x0c | ||
201 | #define BRG_7200 0x0d | ||
202 | #define BRG_9600 0x0e | ||
203 | #define BRG_14400 0x0f | ||
204 | #define BRG_19200 0x10 | ||
205 | #define BRG_28200 0x11 | ||
206 | #define BRG_38400 0x12 | ||
207 | #define BRG_57600 0x13 | ||
208 | #define BRG_115200 0x14 | ||
209 | #define BRG_230400 0x15 | ||
210 | #define BRG_GIN0 0x16 | ||
211 | #define BRG_GIN1 0x17 | ||
212 | #define BRG_CT0 0x18 | ||
213 | #define BRG_CT1 0x19 | ||
214 | #define BRG_RX2TX316 0x1b | ||
215 | #define BRG_RX2TX31 0x1c | ||
216 | |||
217 | #define SC26198_MAXBAUD 921600 | ||
218 | |||
219 | /*****************************************************************************/ | ||
220 | |||
221 | /* | ||
222 | * Command register command definitions. | ||
223 | */ | ||
224 | #define CR_NULL 0x04 | ||
225 | #define CR_ADDRNORMAL 0x0c | ||
226 | #define CR_RXRESET 0x14 | ||
227 | #define CR_TXRESET 0x1c | ||
228 | #define CR_CLEARRXERR 0x24 | ||
229 | #define CR_BREAKRESET 0x2c | ||
230 | #define CR_TXSTARTBREAK 0x34 | ||
231 | #define CR_TXSTOPBREAK 0x3c | ||
232 | #define CR_RTSON 0x44 | ||
233 | #define CR_RTSOFF 0x4c | ||
234 | #define CR_ADDRINIT 0x5c | ||
235 | #define CR_RXERRBLOCK 0x6c | ||
236 | #define CR_TXSENDXON 0x84 | ||
237 | #define CR_TXSENDXOFF 0x8c | ||
238 | #define CR_GANGXONSET 0x94 | ||
239 | #define CR_GANGXOFFSET 0x9c | ||
240 | #define CR_GANGXONINIT 0xa4 | ||
241 | #define CR_GANGXOFFINIT 0xac | ||
242 | #define CR_HOSTXON 0xb4 | ||
243 | #define CR_HOSTXOFF 0xbc | ||
244 | #define CR_CANCELXOFF 0xc4 | ||
245 | #define CR_ADDRRESET 0xdc | ||
246 | #define CR_RESETALLPORTS 0xf4 | ||
247 | #define CR_RESETALL 0xfc | ||
248 | |||
249 | #define CR_RXENABLE 0x01 | ||
250 | #define CR_TXENABLE 0x02 | ||
251 | |||
252 | /*****************************************************************************/ | ||
253 | |||
254 | /* | ||
255 | * Channel status register. | ||
256 | */ | ||
257 | #define SR_RXRDY 0x01 | ||
258 | #define SR_RXFULL 0x02 | ||
259 | #define SR_TXRDY 0x04 | ||
260 | #define SR_TXEMPTY 0x08 | ||
261 | #define SR_RXOVERRUN 0x10 | ||
262 | #define SR_RXPARITY 0x20 | ||
263 | #define SR_RXFRAMING 0x40 | ||
264 | #define SR_RXBREAK 0x80 | ||
265 | |||
266 | #define SR_RXERRS (SR_RXPARITY | SR_RXFRAMING | SR_RXOVERRUN) | ||
267 | |||
268 | /*****************************************************************************/ | ||
269 | |||
270 | /* | ||
271 | * Interrupt status register and interrupt mask register bit definitions. | ||
272 | */ | ||
273 | #define IR_TXRDY 0x01 | ||
274 | #define IR_RXRDY 0x02 | ||
275 | #define IR_RXBREAK 0x04 | ||
276 | #define IR_XONXOFF 0x10 | ||
277 | #define IR_ADDRRECOG 0x20 | ||
278 | #define IR_RXWATCHDOG 0x40 | ||
279 | #define IR_IOPORT 0x80 | ||
280 | |||
281 | /*****************************************************************************/ | ||
282 | |||
283 | /* | ||
284 | * Interrupt vector register field definitions. | ||
285 | */ | ||
286 | #define IVR_CHANMASK 0x07 | ||
287 | #define IVR_TYPEMASK 0x18 | ||
288 | #define IVR_CONSTMASK 0xc0 | ||
289 | |||
290 | #define IVR_RXDATA 0x10 | ||
291 | #define IVR_RXBADDATA 0x18 | ||
292 | #define IVR_TXDATA 0x08 | ||
293 | #define IVR_OTHER 0x00 | ||
294 | |||
295 | /*****************************************************************************/ | ||
296 | |||
297 | /* | ||
298 | * BRG timer control register bit definitions. | ||
299 | */ | ||
300 | #define BRGCTCR_DISABCLK0 0x00 | ||
301 | #define BRGCTCR_ENABCLK0 0x08 | ||
302 | #define BRGCTCR_DISABCLK1 0x00 | ||
303 | #define BRGCTCR_ENABCLK1 0x80 | ||
304 | |||
305 | #define BRGCTCR_0SCLK16 0x00 | ||
306 | #define BRGCTCR_0SCLK32 0x01 | ||
307 | #define BRGCTCR_0SCLK64 0x02 | ||
308 | #define BRGCTCR_0SCLK128 0x03 | ||
309 | #define BRGCTCR_0X1 0x04 | ||
310 | #define BRGCTCR_0X12 0x05 | ||
311 | #define BRGCTCR_0IO1A 0x06 | ||
312 | #define BRGCTCR_0GIN0 0x07 | ||
313 | |||
314 | #define BRGCTCR_1SCLK16 0x00 | ||
315 | #define BRGCTCR_1SCLK32 0x10 | ||
316 | #define BRGCTCR_1SCLK64 0x20 | ||
317 | #define BRGCTCR_1SCLK128 0x30 | ||
318 | #define BRGCTCR_1X1 0x40 | ||
319 | #define BRGCTCR_1X12 0x50 | ||
320 | #define BRGCTCR_1IO1B 0x60 | ||
321 | #define BRGCTCR_1GIN1 0x70 | ||
322 | |||
323 | /*****************************************************************************/ | ||
324 | |||
325 | /* | ||
326 | * Watch dog timer enable register. | ||
327 | */ | ||
328 | #define WDTRCR_ENABALL 0xff | ||
329 | |||
330 | /*****************************************************************************/ | ||
331 | |||
332 | /* | ||
333 | * XON/XOFF interrupt status register. | ||
334 | */ | ||
335 | #define XISR_TXCHARMASK 0x03 | ||
336 | #define XISR_TXCHARNORMAL 0x00 | ||
337 | #define XISR_TXWAIT 0x01 | ||
338 | #define XISR_TXXOFFPEND 0x02 | ||
339 | #define XISR_TXXONPEND 0x03 | ||
340 | |||
341 | #define XISR_TXFLOWMASK 0x0c | ||
342 | #define XISR_TXNORMAL 0x00 | ||
343 | #define XISR_TXSTOPPEND 0x04 | ||
344 | #define XISR_TXSTARTED 0x08 | ||
345 | #define XISR_TXSTOPPED 0x0c | ||
346 | |||
347 | #define XISR_RXFLOWMASK 0x30 | ||
348 | #define XISR_RXFLOWNONE 0x00 | ||
349 | #define XISR_RXXONSENT 0x10 | ||
350 | #define XISR_RXXOFFSENT 0x20 | ||
351 | |||
352 | #define XISR_RXXONGOT 0x40 | ||
353 | #define XISR_RXXOFFGOT 0x80 | ||
354 | |||
355 | /*****************************************************************************/ | ||
356 | |||
357 | /* | ||
358 | * Current interrupt register. | ||
359 | */ | ||
360 | #define CIR_TYPEMASK 0xc0 | ||
361 | #define CIR_TYPEOTHER 0x00 | ||
362 | #define CIR_TYPETX 0x40 | ||
363 | #define CIR_TYPERXGOOD 0x80 | ||
364 | #define CIR_TYPERXBAD 0xc0 | ||
365 | |||
366 | #define CIR_RXDATA 0x80 | ||
367 | #define CIR_RXBADDATA 0x40 | ||
368 | #define CIR_TXDATA 0x40 | ||
369 | |||
370 | #define CIR_CHANMASK 0x07 | ||
371 | #define CIR_CNTMASK 0x38 | ||
372 | |||
373 | #define CIR_SUBTYPEMASK 0x38 | ||
374 | #define CIR_SUBNONE 0x00 | ||
375 | #define CIR_SUBCOS 0x08 | ||
376 | #define CIR_SUBADDR 0x10 | ||
377 | #define CIR_SUBXONXOFF 0x18 | ||
378 | #define CIR_SUBBREAK 0x28 | ||
379 | |||
380 | /*****************************************************************************/ | ||
381 | |||
382 | /* | ||
383 | * Global interrupting channel register. | ||
384 | */ | ||
385 | #define GICR_CHANMASK 0x07 | ||
386 | |||
387 | /*****************************************************************************/ | ||
388 | |||
389 | /* | ||
390 | * Global interrupting byte count register. | ||
391 | */ | ||
392 | #define GICR_COUNTMASK 0x0f | ||
393 | |||
394 | /*****************************************************************************/ | ||
395 | |||
396 | /* | ||
397 | * Global interrupting type register. | ||
398 | */ | ||
399 | #define GITR_RXMASK 0xc0 | ||
400 | #define GITR_RXNONE 0x00 | ||
401 | #define GITR_RXBADDATA 0x80 | ||
402 | #define GITR_RXGOODDATA 0xc0 | ||
403 | #define GITR_TXDATA 0x20 | ||
404 | |||
405 | #define GITR_SUBTYPEMASK 0x07 | ||
406 | #define GITR_SUBNONE 0x00 | ||
407 | #define GITR_SUBCOS 0x01 | ||
408 | #define GITR_SUBADDR 0x02 | ||
409 | #define GITR_SUBXONXOFF 0x03 | ||
410 | #define GITR_SUBBREAK 0x05 | ||
411 | |||
412 | /*****************************************************************************/ | ||
413 | |||
414 | /* | ||
415 | * Input port change register. | ||
416 | */ | ||
417 | #define IPR_CTS 0x01 | ||
418 | #define IPR_DTR 0x02 | ||
419 | #define IPR_RTS 0x04 | ||
420 | #define IPR_DCD 0x08 | ||
421 | #define IPR_CTSCHANGE 0x10 | ||
422 | #define IPR_DTRCHANGE 0x20 | ||
423 | #define IPR_RTSCHANGE 0x40 | ||
424 | #define IPR_DCDCHANGE 0x80 | ||
425 | |||
426 | #define IPR_CHANGEMASK 0xf0 | ||
427 | |||
428 | /*****************************************************************************/ | ||
429 | |||
430 | /* | ||
431 | * IO port interrupt and output register. | ||
432 | */ | ||
433 | #define IOPR_CTS 0x01 | ||
434 | #define IOPR_DTR 0x02 | ||
435 | #define IOPR_RTS 0x04 | ||
436 | #define IOPR_DCD 0x08 | ||
437 | #define IOPR_CTSCOS 0x10 | ||
438 | #define IOPR_DTRCOS 0x20 | ||
439 | #define IOPR_RTSCOS 0x40 | ||
440 | #define IOPR_DCDCOS 0x80 | ||
441 | |||
442 | /*****************************************************************************/ | ||
443 | |||
444 | /* | ||
445 | * IO port configuration register. | ||
446 | */ | ||
447 | #define IOPCR_SETCTS 0x00 | ||
448 | #define IOPCR_SETDTR 0x04 | ||
449 | #define IOPCR_SETRTS 0x10 | ||
450 | #define IOPCR_SETDCD 0x00 | ||
451 | |||
452 | #define IOPCR_SETSIGS (IOPCR_SETRTS | IOPCR_SETRTS | IOPCR_SETDTR | IOPCR_SETDCD) | ||
453 | |||
454 | /*****************************************************************************/ | ||
455 | |||
456 | /* | ||
457 | * General purpose output select register. | ||
458 | */ | ||
459 | #define GPORS_TXC1XA 0x08 | ||
460 | #define GPORS_TXC16XA 0x09 | ||
461 | #define GPORS_RXC16XA 0x0a | ||
462 | #define GPORS_TXC16XB 0x0b | ||
463 | #define GPORS_GPOR3 0x0c | ||
464 | #define GPORS_GPOR2 0x0d | ||
465 | #define GPORS_GPOR1 0x0e | ||
466 | #define GPORS_GPOR0 0x0f | ||
467 | |||
468 | /*****************************************************************************/ | ||
469 | |||
470 | /* | ||
471 | * General purpose output register. | ||
472 | */ | ||
473 | #define GPOR_0 0x01 | ||
474 | #define GPOR_1 0x02 | ||
475 | #define GPOR_2 0x04 | ||
476 | #define GPOR_3 0x08 | ||
477 | |||
478 | /*****************************************************************************/ | ||
479 | |||
480 | /* | ||
481 | * General purpose output clock register. | ||
482 | */ | ||
483 | #define GPORC_0NONE 0x00 | ||
484 | #define GPORC_0GIN0 0x01 | ||
485 | #define GPORC_0GIN1 0x02 | ||
486 | #define GPORC_0IO3A 0x02 | ||
487 | |||
488 | #define GPORC_1NONE 0x00 | ||
489 | #define GPORC_1GIN0 0x04 | ||
490 | #define GPORC_1GIN1 0x08 | ||
491 | #define GPORC_1IO3C 0x0c | ||
492 | |||
493 | #define GPORC_2NONE 0x00 | ||
494 | #define GPORC_2GIN0 0x10 | ||
495 | #define GPORC_2GIN1 0x20 | ||
496 | #define GPORC_2IO3E 0x20 | ||
497 | |||
498 | #define GPORC_3NONE 0x00 | ||
499 | #define GPORC_3GIN0 0x40 | ||
500 | #define GPORC_3GIN1 0x80 | ||
501 | #define GPORC_3IO3G 0xc0 | ||
502 | |||
503 | /*****************************************************************************/ | ||
504 | |||
505 | /* | ||
506 | * General purpose output data register. | ||
507 | */ | ||
508 | #define GPOD_0MASK 0x03 | ||
509 | #define GPOD_0SET1 0x00 | ||
510 | #define GPOD_0SET0 0x01 | ||
511 | #define GPOD_0SETR0 0x02 | ||
512 | #define GPOD_0SETIO3B 0x03 | ||
513 | |||
514 | #define GPOD_1MASK 0x0c | ||
515 | #define GPOD_1SET1 0x00 | ||
516 | #define GPOD_1SET0 0x04 | ||
517 | #define GPOD_1SETR0 0x08 | ||
518 | #define GPOD_1SETIO3D 0x0c | ||
519 | |||
520 | #define GPOD_2MASK 0x30 | ||
521 | #define GPOD_2SET1 0x00 | ||
522 | #define GPOD_2SET0 0x10 | ||
523 | #define GPOD_2SETR0 0x20 | ||
524 | #define GPOD_2SETIO3F 0x30 | ||
525 | |||
526 | #define GPOD_3MASK 0xc0 | ||
527 | #define GPOD_3SET1 0x00 | ||
528 | #define GPOD_3SET0 0x40 | ||
529 | #define GPOD_3SETR0 0x80 | ||
530 | #define GPOD_3SETIO3H 0xc0 | ||
531 | |||
532 | /*****************************************************************************/ | ||
533 | #endif | ||
diff --git a/include/linux/serial167.h b/include/linux/serial167.h deleted file mode 100644 index 59c81b708562..000000000000 --- a/include/linux/serial167.h +++ /dev/null | |||
@@ -1,157 +0,0 @@ | |||
1 | /* | ||
2 | * serial167.h | ||
3 | * | ||
4 | * Richard Hirst [richard@sleepie.demon.co.uk] | ||
5 | * | ||
6 | * Based on cyclades.h | ||
7 | */ | ||
8 | |||
9 | struct cyclades_monitor { | ||
10 | unsigned long int_count; | ||
11 | unsigned long char_count; | ||
12 | unsigned long char_max; | ||
13 | unsigned long char_last; | ||
14 | }; | ||
15 | |||
16 | /* | ||
17 | * This is our internal structure for each serial port's state. | ||
18 | * | ||
19 | * Many fields are paralleled by the structure used by the serial_struct | ||
20 | * structure. | ||
21 | * | ||
22 | * For definitions of the flags field, see tty.h | ||
23 | */ | ||
24 | |||
25 | struct cyclades_port { | ||
26 | int magic; | ||
27 | int type; | ||
28 | int card; | ||
29 | int line; | ||
30 | int flags; /* defined in tty.h */ | ||
31 | struct tty_struct *tty; | ||
32 | int read_status_mask; | ||
33 | int timeout; | ||
34 | int xmit_fifo_size; | ||
35 | int cor1,cor2,cor3,cor4,cor5,cor6,cor7; | ||
36 | int tbpr,tco,rbpr,rco; | ||
37 | int ignore_status_mask; | ||
38 | int close_delay; | ||
39 | int IER; /* Interrupt Enable Register */ | ||
40 | unsigned long last_active; | ||
41 | int count; /* # of fd on device */ | ||
42 | int x_char; /* to be pushed out ASAP */ | ||
43 | int x_break; | ||
44 | int blocked_open; /* # of blocked opens */ | ||
45 | unsigned char *xmit_buf; | ||
46 | int xmit_head; | ||
47 | int xmit_tail; | ||
48 | int xmit_cnt; | ||
49 | int default_threshold; | ||
50 | int default_timeout; | ||
51 | wait_queue_head_t open_wait; | ||
52 | wait_queue_head_t close_wait; | ||
53 | struct cyclades_monitor mon; | ||
54 | }; | ||
55 | |||
56 | #define CYCLADES_MAGIC 0x4359 | ||
57 | |||
58 | #define CYGETMON 0x435901 | ||
59 | #define CYGETTHRESH 0x435902 | ||
60 | #define CYSETTHRESH 0x435903 | ||
61 | #define CYGETDEFTHRESH 0x435904 | ||
62 | #define CYSETDEFTHRESH 0x435905 | ||
63 | #define CYGETTIMEOUT 0x435906 | ||
64 | #define CYSETTIMEOUT 0x435907 | ||
65 | #define CYGETDEFTIMEOUT 0x435908 | ||
66 | #define CYSETDEFTIMEOUT 0x435909 | ||
67 | |||
68 | #define CyMaxChipsPerCard 1 | ||
69 | |||
70 | /**** cd2401 registers ****/ | ||
71 | |||
72 | #define CyGFRCR (0x81) | ||
73 | #define CyCCR (0x13) | ||
74 | #define CyCLR_CHAN (0x40) | ||
75 | #define CyINIT_CHAN (0x20) | ||
76 | #define CyCHIP_RESET (0x10) | ||
77 | #define CyENB_XMTR (0x08) | ||
78 | #define CyDIS_XMTR (0x04) | ||
79 | #define CyENB_RCVR (0x02) | ||
80 | #define CyDIS_RCVR (0x01) | ||
81 | #define CyCAR (0xee) | ||
82 | #define CyIER (0x11) | ||
83 | #define CyMdmCh (0x80) | ||
84 | #define CyRxExc (0x20) | ||
85 | #define CyRxData (0x08) | ||
86 | #define CyTxMpty (0x02) | ||
87 | #define CyTxRdy (0x01) | ||
88 | #define CyLICR (0x26) | ||
89 | #define CyRISR (0x89) | ||
90 | #define CyTIMEOUT (0x80) | ||
91 | #define CySPECHAR (0x70) | ||
92 | #define CyOVERRUN (0x08) | ||
93 | #define CyPARITY (0x04) | ||
94 | #define CyFRAME (0x02) | ||
95 | #define CyBREAK (0x01) | ||
96 | #define CyREOIR (0x84) | ||
97 | #define CyTEOIR (0x85) | ||
98 | #define CyMEOIR (0x86) | ||
99 | #define CyNOTRANS (0x08) | ||
100 | #define CyRFOC (0x30) | ||
101 | #define CyRDR (0xf8) | ||
102 | #define CyTDR (0xf8) | ||
103 | #define CyMISR (0x8b) | ||
104 | #define CyRISR (0x89) | ||
105 | #define CyTISR (0x8a) | ||
106 | #define CyMSVR1 (0xde) | ||
107 | #define CyMSVR2 (0xdf) | ||
108 | #define CyDSR (0x80) | ||
109 | #define CyDCD (0x40) | ||
110 | #define CyCTS (0x20) | ||
111 | #define CyDTR (0x02) | ||
112 | #define CyRTS (0x01) | ||
113 | #define CyRTPRL (0x25) | ||
114 | #define CyRTPRH (0x24) | ||
115 | #define CyCOR1 (0x10) | ||
116 | #define CyPARITY_NONE (0x00) | ||
117 | #define CyPARITY_E (0x40) | ||
118 | #define CyPARITY_O (0xC0) | ||
119 | #define Cy_5_BITS (0x04) | ||
120 | #define Cy_6_BITS (0x05) | ||
121 | #define Cy_7_BITS (0x06) | ||
122 | #define Cy_8_BITS (0x07) | ||
123 | #define CyCOR2 (0x17) | ||
124 | #define CyETC (0x20) | ||
125 | #define CyCtsAE (0x02) | ||
126 | #define CyCOR3 (0x16) | ||
127 | #define Cy_1_STOP (0x02) | ||
128 | #define Cy_2_STOP (0x04) | ||
129 | #define CyCOR4 (0x15) | ||
130 | #define CyREC_FIFO (0x0F) /* Receive FIFO threshold */ | ||
131 | #define CyCOR5 (0x14) | ||
132 | #define CyCOR6 (0x18) | ||
133 | #define CyCOR7 (0x07) | ||
134 | #define CyRBPR (0xcb) | ||
135 | #define CyRCOR (0xc8) | ||
136 | #define CyTBPR (0xc3) | ||
137 | #define CyTCOR (0xc0) | ||
138 | #define CySCHR1 (0x1f) | ||
139 | #define CySCHR2 (0x1e) | ||
140 | #define CyTPR (0xda) | ||
141 | #define CyPILR1 (0xe3) | ||
142 | #define CyPILR2 (0xe0) | ||
143 | #define CyPILR3 (0xe1) | ||
144 | #define CyCMR (0x1b) | ||
145 | #define CyASYNC (0x02) | ||
146 | #define CyLICR (0x26) | ||
147 | #define CyLIVR (0x09) | ||
148 | #define CySCRL (0x23) | ||
149 | #define CySCRH (0x22) | ||
150 | #define CyTFTC (0x80) | ||
151 | |||
152 | |||
153 | /* max number of chars in the FIFO */ | ||
154 | |||
155 | #define CyMAX_CHAR_FIFO 12 | ||
156 | |||
157 | /***************************************************************************/ | ||
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index a416e92012ef..c174c90fb3fb 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
@@ -65,11 +65,38 @@ enum { | |||
65 | * platform device. Using these will make your driver | 65 | * platform device. Using these will make your driver |
66 | * dependent on the 8250 driver. | 66 | * dependent on the 8250 driver. |
67 | */ | 67 | */ |
68 | struct uart_port; | 68 | |
69 | struct uart_8250_port; | 69 | struct uart_8250_port { |
70 | struct uart_port port; | ||
71 | struct timer_list timer; /* "no irq" timer */ | ||
72 | struct list_head list; /* ports on this IRQ */ | ||
73 | unsigned short capabilities; /* port capabilities */ | ||
74 | unsigned short bugs; /* port bugs */ | ||
75 | unsigned int tx_loadsz; /* transmit fifo load size */ | ||
76 | unsigned char acr; | ||
77 | unsigned char ier; | ||
78 | unsigned char lcr; | ||
79 | unsigned char mcr; | ||
80 | unsigned char mcr_mask; /* mask of user bits */ | ||
81 | unsigned char mcr_force; /* mask of forced bits */ | ||
82 | unsigned char cur_iotype; /* Running I/O type */ | ||
83 | |||
84 | /* | ||
85 | * Some bits in registers are cleared on a read, so they must | ||
86 | * be saved whenever the register is read but the bits will not | ||
87 | * be immediately processed. | ||
88 | */ | ||
89 | #define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS | ||
90 | unsigned char lsr_saved_flags; | ||
91 | #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA | ||
92 | unsigned char msr_saved_flags; | ||
93 | |||
94 | /* 8250 specific callbacks */ | ||
95 | int (*dl_read)(struct uart_8250_port *); | ||
96 | void (*dl_write)(struct uart_8250_port *, int); | ||
97 | }; | ||
70 | 98 | ||
71 | int serial8250_register_8250_port(struct uart_8250_port *); | 99 | int serial8250_register_8250_port(struct uart_8250_port *); |
72 | int serial8250_register_port(struct uart_port *); | ||
73 | void serial8250_unregister_port(int line); | 100 | void serial8250_unregister_port(int line); |
74 | void serial8250_suspend_port(int line); | 101 | void serial8250_suspend_port(int line); |
75 | void serial8250_resume_port(int line); | 102 | void serial8250_resume_port(int line); |
diff --git a/include/linux/stallion.h b/include/linux/stallion.h deleted file mode 100644 index 336af33c6ea4..000000000000 --- a/include/linux/stallion.h +++ /dev/null | |||
@@ -1,147 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * stallion.h -- stallion multiport serial driver. | ||
5 | * | ||
6 | * Copyright (C) 1996-1998 Stallion Technologies | ||
7 | * Copyright (C) 1994-1996 Greg Ungerer. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | /*****************************************************************************/ | ||
25 | #ifndef _STALLION_H | ||
26 | #define _STALLION_H | ||
27 | /*****************************************************************************/ | ||
28 | |||
29 | /* | ||
30 | * Define important driver constants here. | ||
31 | */ | ||
32 | #define STL_MAXBRDS 4 | ||
33 | #define STL_MAXPANELS 4 | ||
34 | #define STL_MAXBANKS 8 | ||
35 | #define STL_PORTSPERPANEL 16 | ||
36 | #define STL_MAXPORTS 64 | ||
37 | #define STL_MAXDEVS (STL_MAXBRDS * STL_MAXPORTS) | ||
38 | |||
39 | |||
40 | /* | ||
41 | * Define a set of structures to hold all the board/panel/port info | ||
42 | * for our ports. These will be dynamically allocated as required. | ||
43 | */ | ||
44 | |||
45 | /* | ||
46 | * Define a ring queue structure for each port. This will hold the | ||
47 | * TX data waiting to be output. Characters are fed into this buffer | ||
48 | * from the line discipline (or even direct from user space!) and | ||
49 | * then fed into the UARTs during interrupts. Will use a classic ring | ||
50 | * queue here for this. The good thing about this type of ring queue | ||
51 | * is that the head and tail pointers can be updated without interrupt | ||
52 | * protection - since "write" code only needs to change the head, and | ||
53 | * interrupt code only needs to change the tail. | ||
54 | */ | ||
55 | struct stlrq { | ||
56 | char *buf; | ||
57 | char *head; | ||
58 | char *tail; | ||
59 | }; | ||
60 | |||
61 | /* | ||
62 | * Port, panel and board structures to hold status info about each. | ||
63 | * The board structure contains pointers to structures for each panel | ||
64 | * connected to it, and in turn each panel structure contains pointers | ||
65 | * for each port structure for each port on that panel. Note that | ||
66 | * the port structure also contains the board and panel number that it | ||
67 | * is associated with, this makes it (fairly) easy to get back to the | ||
68 | * board/panel info for a port. | ||
69 | */ | ||
70 | struct stlport { | ||
71 | unsigned long magic; | ||
72 | struct tty_port port; | ||
73 | unsigned int portnr; | ||
74 | unsigned int panelnr; | ||
75 | unsigned int brdnr; | ||
76 | int ioaddr; | ||
77 | int uartaddr; | ||
78 | unsigned int pagenr; | ||
79 | unsigned long istate; | ||
80 | int baud_base; | ||
81 | int custom_divisor; | ||
82 | int close_delay; | ||
83 | int closing_wait; | ||
84 | int openwaitcnt; | ||
85 | int brklen; | ||
86 | unsigned int sigs; | ||
87 | unsigned int rxignoremsk; | ||
88 | unsigned int rxmarkmsk; | ||
89 | unsigned int imr; | ||
90 | unsigned int crenable; | ||
91 | unsigned long clk; | ||
92 | unsigned long hwid; | ||
93 | void *uartp; | ||
94 | comstats_t stats; | ||
95 | struct stlrq tx; | ||
96 | }; | ||
97 | |||
98 | struct stlpanel { | ||
99 | unsigned long magic; | ||
100 | unsigned int panelnr; | ||
101 | unsigned int brdnr; | ||
102 | unsigned int pagenr; | ||
103 | unsigned int nrports; | ||
104 | int iobase; | ||
105 | void *uartp; | ||
106 | void (*isr)(struct stlpanel *panelp, unsigned int iobase); | ||
107 | unsigned int hwid; | ||
108 | unsigned int ackmask; | ||
109 | struct stlport *ports[STL_PORTSPERPANEL]; | ||
110 | }; | ||
111 | |||
112 | struct stlbrd { | ||
113 | unsigned long magic; | ||
114 | unsigned int brdnr; | ||
115 | unsigned int brdtype; | ||
116 | unsigned int state; | ||
117 | unsigned int nrpanels; | ||
118 | unsigned int nrports; | ||
119 | unsigned int nrbnks; | ||
120 | int irq; | ||
121 | int irqtype; | ||
122 | int (*isr)(struct stlbrd *brdp); | ||
123 | unsigned int ioaddr1; | ||
124 | unsigned int ioaddr2; | ||
125 | unsigned int iosize1; | ||
126 | unsigned int iosize2; | ||
127 | unsigned int iostatus; | ||
128 | unsigned int ioctrl; | ||
129 | unsigned int ioctrlval; | ||
130 | unsigned int hwid; | ||
131 | unsigned long clk; | ||
132 | unsigned int bnkpageaddr[STL_MAXBANKS]; | ||
133 | unsigned int bnkstataddr[STL_MAXBANKS]; | ||
134 | struct stlpanel *bnk2panel[STL_MAXBANKS]; | ||
135 | struct stlpanel *panels[STL_MAXPANELS]; | ||
136 | }; | ||
137 | |||
138 | |||
139 | /* | ||
140 | * Define MAGIC numbers used for above structures. | ||
141 | */ | ||
142 | #define STL_PORTMAGIC 0x5a7182c9 | ||
143 | #define STL_PANELMAGIC 0x7ef621a1 | ||
144 | #define STL_BOARDMAGIC 0xa2267f52 | ||
145 | |||
146 | /*****************************************************************************/ | ||
147 | #endif | ||
diff --git a/include/linux/tty.h b/include/linux/tty.h index 9f47ab540f65..a39e72325e78 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -103,28 +103,28 @@ struct tty_bufhead { | |||
103 | #define TTY_PARITY 3 | 103 | #define TTY_PARITY 3 |
104 | #define TTY_OVERRUN 4 | 104 | #define TTY_OVERRUN 4 |
105 | 105 | ||
106 | #define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR]) | 106 | #define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR]) |
107 | #define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT]) | 107 | #define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT]) |
108 | #define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE]) | 108 | #define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE]) |
109 | #define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL]) | 109 | #define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL]) |
110 | #define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF]) | 110 | #define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF]) |
111 | #define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME]) | 111 | #define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME]) |
112 | #define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN]) | 112 | #define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN]) |
113 | #define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC]) | 113 | #define SWTC_CHAR(tty) ((tty)->termios.c_cc[VSWTC]) |
114 | #define START_CHAR(tty) ((tty)->termios->c_cc[VSTART]) | 114 | #define START_CHAR(tty) ((tty)->termios.c_cc[VSTART]) |
115 | #define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP]) | 115 | #define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP]) |
116 | #define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP]) | 116 | #define SUSP_CHAR(tty) ((tty)->termios.c_cc[VSUSP]) |
117 | #define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL]) | 117 | #define EOL_CHAR(tty) ((tty)->termios.c_cc[VEOL]) |
118 | #define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT]) | 118 | #define REPRINT_CHAR(tty) ((tty)->termios.c_cc[VREPRINT]) |
119 | #define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD]) | 119 | #define DISCARD_CHAR(tty) ((tty)->termios.c_cc[VDISCARD]) |
120 | #define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE]) | 120 | #define WERASE_CHAR(tty) ((tty)->termios.c_cc[VWERASE]) |
121 | #define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT]) | 121 | #define LNEXT_CHAR(tty) ((tty)->termios.c_cc[VLNEXT]) |
122 | #define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2]) | 122 | #define EOL2_CHAR(tty) ((tty)->termios.c_cc[VEOL2]) |
123 | 123 | ||
124 | #define _I_FLAG(tty, f) ((tty)->termios->c_iflag & (f)) | 124 | #define _I_FLAG(tty, f) ((tty)->termios.c_iflag & (f)) |
125 | #define _O_FLAG(tty, f) ((tty)->termios->c_oflag & (f)) | 125 | #define _O_FLAG(tty, f) ((tty)->termios.c_oflag & (f)) |
126 | #define _C_FLAG(tty, f) ((tty)->termios->c_cflag & (f)) | 126 | #define _C_FLAG(tty, f) ((tty)->termios.c_cflag & (f)) |
127 | #define _L_FLAG(tty, f) ((tty)->termios->c_lflag & (f)) | 127 | #define _L_FLAG(tty, f) ((tty)->termios.c_lflag & (f)) |
128 | 128 | ||
129 | #define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK) | 129 | #define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK) |
130 | #define I_BRKINT(tty) _I_FLAG((tty), BRKINT) | 130 | #define I_BRKINT(tty) _I_FLAG((tty), BRKINT) |
@@ -271,7 +271,7 @@ struct tty_struct { | |||
271 | struct mutex termios_mutex; | 271 | struct mutex termios_mutex; |
272 | spinlock_t ctrl_lock; | 272 | spinlock_t ctrl_lock; |
273 | /* Termios values are protected by the termios mutex */ | 273 | /* Termios values are protected by the termios mutex */ |
274 | struct ktermios *termios, *termios_locked; | 274 | struct ktermios termios, termios_locked; |
275 | struct termiox *termiox; /* May be NULL for unsupported */ | 275 | struct termiox *termiox; /* May be NULL for unsupported */ |
276 | char name[64]; | 276 | char name[64]; |
277 | struct pid *pgrp; /* Protected by ctrl lock */ | 277 | struct pid *pgrp; /* Protected by ctrl lock */ |
@@ -423,7 +423,6 @@ extern void tty_unthrottle(struct tty_struct *tty); | |||
423 | extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws); | 423 | extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws); |
424 | extern void tty_driver_remove_tty(struct tty_driver *driver, | 424 | extern void tty_driver_remove_tty(struct tty_driver *driver, |
425 | struct tty_struct *tty); | 425 | struct tty_struct *tty); |
426 | extern void tty_shutdown(struct tty_struct *tty); | ||
427 | extern void tty_free_termios(struct tty_struct *tty); | 426 | extern void tty_free_termios(struct tty_struct *tty); |
428 | extern int is_current_pgrp_orphaned(void); | 427 | extern int is_current_pgrp_orphaned(void); |
429 | extern struct pid *tty_get_pgrp(struct tty_struct *tty); | 428 | extern struct pid *tty_get_pgrp(struct tty_struct *tty); |
@@ -497,6 +496,9 @@ extern int tty_write_lock(struct tty_struct *tty, int ndelay); | |||
497 | #define tty_is_writelocked(tty) (mutex_is_locked(&tty->atomic_write_lock)) | 496 | #define tty_is_writelocked(tty) (mutex_is_locked(&tty->atomic_write_lock)) |
498 | 497 | ||
499 | extern void tty_port_init(struct tty_port *port); | 498 | extern void tty_port_init(struct tty_port *port); |
499 | extern struct device *tty_port_register_device(struct tty_port *port, | ||
500 | struct tty_driver *driver, unsigned index, | ||
501 | struct device *device); | ||
500 | extern int tty_port_alloc_xmit_buf(struct tty_port *port); | 502 | extern int tty_port_alloc_xmit_buf(struct tty_port *port); |
501 | extern void tty_port_free_xmit_buf(struct tty_port *port); | 503 | extern void tty_port_free_xmit_buf(struct tty_port *port); |
502 | extern void tty_port_put(struct tty_port *port); | 504 | extern void tty_port_put(struct tty_port *port); |
@@ -521,6 +523,8 @@ extern int tty_port_close_start(struct tty_port *port, | |||
521 | extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty); | 523 | extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty); |
522 | extern void tty_port_close(struct tty_port *port, | 524 | extern void tty_port_close(struct tty_port *port, |
523 | struct tty_struct *tty, struct file *filp); | 525 | struct tty_struct *tty, struct file *filp); |
526 | extern int tty_port_install(struct tty_port *port, struct tty_driver *driver, | ||
527 | struct tty_struct *tty); | ||
524 | extern int tty_port_open(struct tty_port *port, | 528 | extern int tty_port_open(struct tty_port *port, |
525 | struct tty_struct *tty, struct file *filp); | 529 | struct tty_struct *tty, struct file *filp); |
526 | static inline int tty_port_users(struct tty_port *port) | 530 | static inline int tty_port_users(struct tty_port *port) |
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index 6e6dbb7447b6..80e72dc564a5 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
@@ -45,14 +45,9 @@ | |||
45 | * | 45 | * |
46 | * void (*shutdown)(struct tty_struct * tty); | 46 | * void (*shutdown)(struct tty_struct * tty); |
47 | * | 47 | * |
48 | * This routine is called synchronously when a particular tty device | 48 | * This routine is called under the tty lock when a particular tty device |
49 | * is closed for the last time freeing up the resources. | 49 | * is closed for the last time. It executes before the tty resources |
50 | * Note that tty_shutdown() is not called if ops->shutdown is defined. | 50 | * are freed so may execute while another function holds a tty kref. |
51 | * This means one is responsible to take care of calling ops->remove (e.g. | ||
52 | * via tty_driver_remove_tty) and releasing tty->termios. | ||
53 | * Note that this hook may be called from *all* the contexts where one | ||
54 | * uses tty refcounting (e.g. tty_port_tty_get). | ||
55 | * | ||
56 | * | 51 | * |
57 | * void (*cleanup)(struct tty_struct * tty); | 52 | * void (*cleanup)(struct tty_struct * tty); |
58 | * | 53 | * |
@@ -313,6 +308,7 @@ struct tty_driver { | |||
313 | * Pointer to the tty data structures | 308 | * Pointer to the tty data structures |
314 | */ | 309 | */ |
315 | struct tty_struct **ttys; | 310 | struct tty_struct **ttys; |
311 | struct tty_port **ports; | ||
316 | struct ktermios **termios; | 312 | struct ktermios **termios; |
317 | void *driver_state; | 313 | void *driver_state; |
318 | 314 | ||
diff --git a/include/net/irda/ircomm_tty.h b/include/net/irda/ircomm_tty.h index 59ba38bc400f..80ffde3bb164 100644 --- a/include/net/irda/ircomm_tty.h +++ b/include/net/irda/ircomm_tty.h | |||
@@ -52,21 +52,16 @@ | |||
52 | /* Same for payload size. See qos.c for the smallest max data size */ | 52 | /* Same for payload size. See qos.c for the smallest max data size */ |
53 | #define IRCOMM_TTY_DATA_UNINITIALISED (64 - IRCOMM_TTY_HDR_UNINITIALISED) | 53 | #define IRCOMM_TTY_DATA_UNINITIALISED (64 - IRCOMM_TTY_HDR_UNINITIALISED) |
54 | 54 | ||
55 | /* Those are really defined in include/linux/serial.h - Jean II */ | ||
56 | #define ASYNC_B_INITIALIZED 31 /* Serial port was initialized */ | ||
57 | #define ASYNC_B_NORMAL_ACTIVE 29 /* Normal device is active */ | ||
58 | #define ASYNC_B_CLOSING 27 /* Serial port is closing */ | ||
59 | |||
60 | /* | 55 | /* |
61 | * IrCOMM TTY driver state | 56 | * IrCOMM TTY driver state |
62 | */ | 57 | */ |
63 | struct ircomm_tty_cb { | 58 | struct ircomm_tty_cb { |
64 | irda_queue_t queue; /* Must be first */ | 59 | irda_queue_t queue; /* Must be first */ |
60 | struct tty_port port; | ||
65 | magic_t magic; | 61 | magic_t magic; |
66 | 62 | ||
67 | int state; /* Connect state */ | 63 | int state; /* Connect state */ |
68 | 64 | ||
69 | struct tty_struct *tty; | ||
70 | struct ircomm_cb *ircomm; /* IrCOMM layer instance */ | 65 | struct ircomm_cb *ircomm; /* IrCOMM layer instance */ |
71 | 66 | ||
72 | struct sk_buff *tx_skb; /* Transmit buffer */ | 67 | struct sk_buff *tx_skb; /* Transmit buffer */ |
@@ -80,7 +75,6 @@ struct ircomm_tty_cb { | |||
80 | LOCAL_FLOW flow; /* IrTTP flow status */ | 75 | LOCAL_FLOW flow; /* IrTTP flow status */ |
81 | 76 | ||
82 | int line; | 77 | int line; |
83 | unsigned long flags; | ||
84 | 78 | ||
85 | __u8 dlsap_sel; | 79 | __u8 dlsap_sel; |
86 | __u8 slsap_sel; | 80 | __u8 slsap_sel; |
@@ -97,19 +91,10 @@ struct ircomm_tty_cb { | |||
97 | void *skey; | 91 | void *skey; |
98 | void *ckey; | 92 | void *ckey; |
99 | 93 | ||
100 | wait_queue_head_t open_wait; | ||
101 | wait_queue_head_t close_wait; | ||
102 | struct timer_list watchdog_timer; | 94 | struct timer_list watchdog_timer; |
103 | struct work_struct tqueue; | 95 | struct work_struct tqueue; |
104 | 96 | ||
105 | unsigned short close_delay; | ||
106 | unsigned short closing_wait; /* time to wait before closing */ | ||
107 | |||
108 | int open_count; | ||
109 | int blocked_open; /* # of blocked opens */ | ||
110 | |||
111 | /* Protect concurent access to : | 97 | /* Protect concurent access to : |
112 | * o self->open_count | ||
113 | * o self->ctrl_skb | 98 | * o self->ctrl_skb |
114 | * o self->tx_skb | 99 | * o self->tx_skb |
115 | * Maybe other things may gain to be protected as well... | 100 | * Maybe other things may gain to be protected as well... |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index cb960773c002..87ddd051881b 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -861,7 +861,7 @@ static int rfcomm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned l | |||
861 | 861 | ||
862 | static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old) | 862 | static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old) |
863 | { | 863 | { |
864 | struct ktermios *new = tty->termios; | 864 | struct ktermios *new = &tty->termios; |
865 | int old_baud_rate = tty_termios_baud_rate(old); | 865 | int old_baud_rate = tty_termios_baud_rate(old); |
866 | int new_baud_rate = tty_termios_baud_rate(new); | 866 | int new_baud_rate = tty_termios_baud_rate(new); |
867 | 867 | ||
diff --git a/net/irda/ircomm/ircomm_param.c b/net/irda/ircomm/ircomm_param.c index 8b915f3ac3b9..308939128359 100644 --- a/net/irda/ircomm/ircomm_param.c +++ b/net/irda/ircomm/ircomm_param.c | |||
@@ -99,7 +99,6 @@ pi_param_info_t ircomm_param_info = { pi_major_call_table, 3, 0x0f, 4 }; | |||
99 | */ | 99 | */ |
100 | int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush) | 100 | int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush) |
101 | { | 101 | { |
102 | struct tty_struct *tty; | ||
103 | unsigned long flags; | 102 | unsigned long flags; |
104 | struct sk_buff *skb; | 103 | struct sk_buff *skb; |
105 | int count; | 104 | int count; |
@@ -109,10 +108,6 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush) | |||
109 | IRDA_ASSERT(self != NULL, return -1;); | 108 | IRDA_ASSERT(self != NULL, return -1;); |
110 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); | 109 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); |
111 | 110 | ||
112 | tty = self->tty; | ||
113 | if (!tty) | ||
114 | return 0; | ||
115 | |||
116 | /* Make sure we don't send parameters for raw mode */ | 111 | /* Make sure we don't send parameters for raw mode */ |
117 | if (self->service_type == IRCOMM_3_WIRE_RAW) | 112 | if (self->service_type == IRCOMM_3_WIRE_RAW) |
118 | return 0; | 113 | return 0; |
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c index 6b9d5a0e42f9..7a0d6115d06f 100644 --- a/net/irda/ircomm/ircomm_tty.c +++ b/net/irda/ircomm/ircomm_tty.c | |||
@@ -104,6 +104,35 @@ static const struct tty_operations ops = { | |||
104 | #endif /* CONFIG_PROC_FS */ | 104 | #endif /* CONFIG_PROC_FS */ |
105 | }; | 105 | }; |
106 | 106 | ||
107 | static void ircomm_port_raise_dtr_rts(struct tty_port *port, int raise) | ||
108 | { | ||
109 | struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb, | ||
110 | port); | ||
111 | /* | ||
112 | * Here, we use to lock those two guys, but as ircomm_param_request() | ||
113 | * does it itself, I don't see the point (and I see the deadlock). | ||
114 | * Jean II | ||
115 | */ | ||
116 | if (raise) | ||
117 | self->settings.dte |= IRCOMM_RTS | IRCOMM_DTR; | ||
118 | else | ||
119 | self->settings.dte &= ~(IRCOMM_RTS | IRCOMM_DTR); | ||
120 | |||
121 | ircomm_param_request(self, IRCOMM_DTE, TRUE); | ||
122 | } | ||
123 | |||
124 | static int ircomm_port_carrier_raised(struct tty_port *port) | ||
125 | { | ||
126 | struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb, | ||
127 | port); | ||
128 | return self->settings.dce & IRCOMM_CD; | ||
129 | } | ||
130 | |||
131 | static const struct tty_port_operations ircomm_port_ops = { | ||
132 | .dtr_rts = ircomm_port_raise_dtr_rts, | ||
133 | .carrier_raised = ircomm_port_carrier_raised, | ||
134 | }; | ||
135 | |||
107 | /* | 136 | /* |
108 | * Function ircomm_tty_init() | 137 | * Function ircomm_tty_init() |
109 | * | 138 | * |
@@ -194,7 +223,7 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self) | |||
194 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); | 223 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); |
195 | 224 | ||
196 | /* Check if already open */ | 225 | /* Check if already open */ |
197 | if (test_and_set_bit(ASYNC_B_INITIALIZED, &self->flags)) { | 226 | if (test_and_set_bit(ASYNCB_INITIALIZED, &self->port.flags)) { |
198 | IRDA_DEBUG(2, "%s(), already open so break out!\n", __func__ ); | 227 | IRDA_DEBUG(2, "%s(), already open so break out!\n", __func__ ); |
199 | return 0; | 228 | return 0; |
200 | } | 229 | } |
@@ -231,7 +260,7 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self) | |||
231 | 260 | ||
232 | return 0; | 261 | return 0; |
233 | err: | 262 | err: |
234 | clear_bit(ASYNC_B_INITIALIZED, &self->flags); | 263 | clear_bit(ASYNCB_INITIALIZED, &self->port.flags); |
235 | return ret; | 264 | return ret; |
236 | } | 265 | } |
237 | 266 | ||
@@ -242,72 +271,62 @@ err: | |||
242 | * | 271 | * |
243 | */ | 272 | */ |
244 | static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | 273 | static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, |
245 | struct file *filp) | 274 | struct tty_struct *tty, struct file *filp) |
246 | { | 275 | { |
276 | struct tty_port *port = &self->port; | ||
247 | DECLARE_WAITQUEUE(wait, current); | 277 | DECLARE_WAITQUEUE(wait, current); |
248 | int retval; | 278 | int retval; |
249 | int do_clocal = 0, extra_count = 0; | 279 | int do_clocal = 0, extra_count = 0; |
250 | unsigned long flags; | 280 | unsigned long flags; |
251 | struct tty_struct *tty; | ||
252 | 281 | ||
253 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 282 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
254 | 283 | ||
255 | tty = self->tty; | ||
256 | |||
257 | /* | 284 | /* |
258 | * If non-blocking mode is set, or the port is not enabled, | 285 | * If non-blocking mode is set, or the port is not enabled, |
259 | * then make the check up front and then exit. | 286 | * then make the check up front and then exit. |
260 | */ | 287 | */ |
261 | if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){ | 288 | if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){ |
262 | /* nonblock mode is set or port is not enabled */ | 289 | /* nonblock mode is set or port is not enabled */ |
263 | self->flags |= ASYNC_NORMAL_ACTIVE; | 290 | port->flags |= ASYNC_NORMAL_ACTIVE; |
264 | IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ ); | 291 | IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ ); |
265 | return 0; | 292 | return 0; |
266 | } | 293 | } |
267 | 294 | ||
268 | if (tty->termios->c_cflag & CLOCAL) { | 295 | if (tty->termios.c_cflag & CLOCAL) { |
269 | IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ ); | 296 | IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ ); |
270 | do_clocal = 1; | 297 | do_clocal = 1; |
271 | } | 298 | } |
272 | 299 | ||
273 | /* Wait for carrier detect and the line to become | 300 | /* Wait for carrier detect and the line to become |
274 | * free (i.e., not in use by the callout). While we are in | 301 | * free (i.e., not in use by the callout). While we are in |
275 | * this loop, self->open_count is dropped by one, so that | 302 | * this loop, port->count is dropped by one, so that |
276 | * mgsl_close() knows when to free things. We restore it upon | 303 | * mgsl_close() knows when to free things. We restore it upon |
277 | * exit, either normal or abnormal. | 304 | * exit, either normal or abnormal. |
278 | */ | 305 | */ |
279 | 306 | ||
280 | retval = 0; | 307 | retval = 0; |
281 | add_wait_queue(&self->open_wait, &wait); | 308 | add_wait_queue(&port->open_wait, &wait); |
282 | 309 | ||
283 | IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n", | 310 | IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n", |
284 | __FILE__,__LINE__, tty->driver->name, self->open_count ); | 311 | __FILE__, __LINE__, tty->driver->name, port->count); |
285 | 312 | ||
286 | /* As far as I can see, we protect open_count - Jean II */ | 313 | spin_lock_irqsave(&port->lock, flags); |
287 | spin_lock_irqsave(&self->spinlock, flags); | ||
288 | if (!tty_hung_up_p(filp)) { | 314 | if (!tty_hung_up_p(filp)) { |
289 | extra_count = 1; | 315 | extra_count = 1; |
290 | self->open_count--; | 316 | port->count--; |
291 | } | 317 | } |
292 | spin_unlock_irqrestore(&self->spinlock, flags); | 318 | spin_unlock_irqrestore(&port->lock, flags); |
293 | self->blocked_open++; | 319 | port->blocked_open++; |
294 | 320 | ||
295 | while (1) { | 321 | while (1) { |
296 | if (tty->termios->c_cflag & CBAUD) { | 322 | if (tty->termios.c_cflag & CBAUD) |
297 | /* Here, we use to lock those two guys, but | 323 | tty_port_raise_dtr_rts(port); |
298 | * as ircomm_param_request() does it itself, | ||
299 | * I don't see the point (and I see the deadlock). | ||
300 | * Jean II */ | ||
301 | self->settings.dte |= IRCOMM_RTS + IRCOMM_DTR; | ||
302 | |||
303 | ircomm_param_request(self, IRCOMM_DTE, TRUE); | ||
304 | } | ||
305 | 324 | ||
306 | current->state = TASK_INTERRUPTIBLE; | 325 | current->state = TASK_INTERRUPTIBLE; |
307 | 326 | ||
308 | if (tty_hung_up_p(filp) || | 327 | if (tty_hung_up_p(filp) || |
309 | !test_bit(ASYNC_B_INITIALIZED, &self->flags)) { | 328 | !test_bit(ASYNCB_INITIALIZED, &port->flags)) { |
310 | retval = (self->flags & ASYNC_HUP_NOTIFY) ? | 329 | retval = (port->flags & ASYNC_HUP_NOTIFY) ? |
311 | -EAGAIN : -ERESTARTSYS; | 330 | -EAGAIN : -ERESTARTSYS; |
312 | break; | 331 | break; |
313 | } | 332 | } |
@@ -317,8 +336,8 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | |||
317 | * specified, we cannot return before the IrCOMM link is | 336 | * specified, we cannot return before the IrCOMM link is |
318 | * ready | 337 | * ready |
319 | */ | 338 | */ |
320 | if (!test_bit(ASYNC_B_CLOSING, &self->flags) && | 339 | if (!test_bit(ASYNCB_CLOSING, &port->flags) && |
321 | (do_clocal || (self->settings.dce & IRCOMM_CD)) && | 340 | (do_clocal || tty_port_carrier_raised(port)) && |
322 | self->state == IRCOMM_TTY_READY) | 341 | self->state == IRCOMM_TTY_READY) |
323 | { | 342 | { |
324 | break; | 343 | break; |
@@ -330,27 +349,27 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | |||
330 | } | 349 | } |
331 | 350 | ||
332 | IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n", | 351 | IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n", |
333 | __FILE__,__LINE__, tty->driver->name, self->open_count ); | 352 | __FILE__, __LINE__, tty->driver->name, port->count); |
334 | 353 | ||
335 | schedule(); | 354 | schedule(); |
336 | } | 355 | } |
337 | 356 | ||
338 | __set_current_state(TASK_RUNNING); | 357 | __set_current_state(TASK_RUNNING); |
339 | remove_wait_queue(&self->open_wait, &wait); | 358 | remove_wait_queue(&port->open_wait, &wait); |
340 | 359 | ||
341 | if (extra_count) { | 360 | if (extra_count) { |
342 | /* ++ is not atomic, so this should be protected - Jean II */ | 361 | /* ++ is not atomic, so this should be protected - Jean II */ |
343 | spin_lock_irqsave(&self->spinlock, flags); | 362 | spin_lock_irqsave(&port->lock, flags); |
344 | self->open_count++; | 363 | port->count++; |
345 | spin_unlock_irqrestore(&self->spinlock, flags); | 364 | spin_unlock_irqrestore(&port->lock, flags); |
346 | } | 365 | } |
347 | self->blocked_open--; | 366 | port->blocked_open--; |
348 | 367 | ||
349 | IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n", | 368 | IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n", |
350 | __FILE__,__LINE__, tty->driver->name, self->open_count); | 369 | __FILE__, __LINE__, tty->driver->name, port->count); |
351 | 370 | ||
352 | if (!retval) | 371 | if (!retval) |
353 | self->flags |= ASYNC_NORMAL_ACTIVE; | 372 | port->flags |= ASYNC_NORMAL_ACTIVE; |
354 | 373 | ||
355 | return retval; | 374 | return retval; |
356 | } | 375 | } |
@@ -381,6 +400,8 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) | |||
381 | return -ENOMEM; | 400 | return -ENOMEM; |
382 | } | 401 | } |
383 | 402 | ||
403 | tty_port_init(&self->port); | ||
404 | self->port.ops = &ircomm_port_ops; | ||
384 | self->magic = IRCOMM_TTY_MAGIC; | 405 | self->magic = IRCOMM_TTY_MAGIC; |
385 | self->flow = FLOW_STOP; | 406 | self->flow = FLOW_STOP; |
386 | 407 | ||
@@ -388,13 +409,9 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) | |||
388 | INIT_WORK(&self->tqueue, ircomm_tty_do_softint); | 409 | INIT_WORK(&self->tqueue, ircomm_tty_do_softint); |
389 | self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED; | 410 | self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED; |
390 | self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED; | 411 | self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED; |
391 | self->close_delay = 5*HZ/10; | ||
392 | self->closing_wait = 30*HZ; | ||
393 | 412 | ||
394 | /* Init some important stuff */ | 413 | /* Init some important stuff */ |
395 | init_timer(&self->watchdog_timer); | 414 | init_timer(&self->watchdog_timer); |
396 | init_waitqueue_head(&self->open_wait); | ||
397 | init_waitqueue_head(&self->close_wait); | ||
398 | spin_lock_init(&self->spinlock); | 415 | spin_lock_init(&self->spinlock); |
399 | 416 | ||
400 | /* | 417 | /* |
@@ -404,31 +421,32 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) | |||
404 | * | 421 | * |
405 | * Note this is completely usafe and doesn't work properly | 422 | * Note this is completely usafe and doesn't work properly |
406 | */ | 423 | */ |
407 | tty->termios->c_iflag = 0; | 424 | tty->termios.c_iflag = 0; |
408 | tty->termios->c_oflag = 0; | 425 | tty->termios.c_oflag = 0; |
409 | 426 | ||
410 | /* Insert into hash */ | 427 | /* Insert into hash */ |
428 | /* FIXME there is a window from find to here */ | ||
411 | hashbin_insert(ircomm_tty, (irda_queue_t *) self, line, NULL); | 429 | hashbin_insert(ircomm_tty, (irda_queue_t *) self, line, NULL); |
412 | } | 430 | } |
413 | /* ++ is not atomic, so this should be protected - Jean II */ | 431 | /* ++ is not atomic, so this should be protected - Jean II */ |
414 | spin_lock_irqsave(&self->spinlock, flags); | 432 | spin_lock_irqsave(&self->port.lock, flags); |
415 | self->open_count++; | 433 | self->port.count++; |
416 | 434 | ||
417 | tty->driver_data = self; | 435 | tty->driver_data = self; |
418 | self->tty = tty; | 436 | spin_unlock_irqrestore(&self->port.lock, flags); |
419 | spin_unlock_irqrestore(&self->spinlock, flags); | 437 | tty_port_tty_set(&self->port, tty); |
420 | 438 | ||
421 | IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name, | 439 | IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name, |
422 | self->line, self->open_count); | 440 | self->line, self->port.count); |
423 | 441 | ||
424 | /* Not really used by us, but lets do it anyway */ | 442 | /* Not really used by us, but lets do it anyway */ |
425 | self->tty->low_latency = (self->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | 443 | tty->low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; |
426 | 444 | ||
427 | /* | 445 | /* |
428 | * If the port is the middle of closing, bail out now | 446 | * If the port is the middle of closing, bail out now |
429 | */ | 447 | */ |
430 | if (tty_hung_up_p(filp) || | 448 | if (tty_hung_up_p(filp) || |
431 | test_bit(ASYNC_B_CLOSING, &self->flags)) { | 449 | test_bit(ASYNCB_CLOSING, &self->port.flags)) { |
432 | 450 | ||
433 | /* Hm, why are we blocking on ASYNC_CLOSING if we | 451 | /* Hm, why are we blocking on ASYNC_CLOSING if we |
434 | * do return -EAGAIN/-ERESTARTSYS below anyway? | 452 | * do return -EAGAIN/-ERESTARTSYS below anyway? |
@@ -438,14 +456,15 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) | |||
438 | * probably better sleep uninterruptible? | 456 | * probably better sleep uninterruptible? |
439 | */ | 457 | */ |
440 | 458 | ||
441 | if (wait_event_interruptible(self->close_wait, !test_bit(ASYNC_B_CLOSING, &self->flags))) { | 459 | if (wait_event_interruptible(self->port.close_wait, |
460 | !test_bit(ASYNCB_CLOSING, &self->port.flags))) { | ||
442 | IRDA_WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n", | 461 | IRDA_WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n", |
443 | __func__); | 462 | __func__); |
444 | return -ERESTARTSYS; | 463 | return -ERESTARTSYS; |
445 | } | 464 | } |
446 | 465 | ||
447 | #ifdef SERIAL_DO_RESTART | 466 | #ifdef SERIAL_DO_RESTART |
448 | return (self->flags & ASYNC_HUP_NOTIFY) ? | 467 | return (self->port.flags & ASYNC_HUP_NOTIFY) ? |
449 | -EAGAIN : -ERESTARTSYS; | 468 | -EAGAIN : -ERESTARTSYS; |
450 | #else | 469 | #else |
451 | return -EAGAIN; | 470 | return -EAGAIN; |
@@ -469,7 +488,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) | |||
469 | if (ret) | 488 | if (ret) |
470 | return ret; | 489 | return ret; |
471 | 490 | ||
472 | ret = ircomm_tty_block_til_ready(self, filp); | 491 | ret = ircomm_tty_block_til_ready(self, tty, filp); |
473 | if (ret) { | 492 | if (ret) { |
474 | IRDA_DEBUG(2, | 493 | IRDA_DEBUG(2, |
475 | "%s(), returning after block_til_ready with %d\n", __func__ , | 494 | "%s(), returning after block_til_ready with %d\n", __func__ , |
@@ -489,81 +508,22 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) | |||
489 | static void ircomm_tty_close(struct tty_struct *tty, struct file *filp) | 508 | static void ircomm_tty_close(struct tty_struct *tty, struct file *filp) |
490 | { | 509 | { |
491 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; | 510 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; |
492 | unsigned long flags; | 511 | struct tty_port *port = &self->port; |
493 | 512 | ||
494 | IRDA_DEBUG(0, "%s()\n", __func__ ); | 513 | IRDA_DEBUG(0, "%s()\n", __func__ ); |
495 | 514 | ||
496 | IRDA_ASSERT(self != NULL, return;); | 515 | IRDA_ASSERT(self != NULL, return;); |
497 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); | 516 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); |
498 | 517 | ||
499 | spin_lock_irqsave(&self->spinlock, flags); | 518 | if (tty_port_close_start(port, tty, filp) == 0) |
500 | |||
501 | if (tty_hung_up_p(filp)) { | ||
502 | spin_unlock_irqrestore(&self->spinlock, flags); | ||
503 | |||
504 | IRDA_DEBUG(0, "%s(), returning 1\n", __func__ ); | ||
505 | return; | ||
506 | } | ||
507 | |||
508 | if ((tty->count == 1) && (self->open_count != 1)) { | ||
509 | /* | ||
510 | * Uh, oh. tty->count is 1, which means that the tty | ||
511 | * structure will be freed. state->count should always | ||
512 | * be one in these conditions. If it's greater than | ||
513 | * one, we've got real problems, since it means the | ||
514 | * serial port won't be shutdown. | ||
515 | */ | ||
516 | IRDA_DEBUG(0, "%s(), bad serial port count; " | ||
517 | "tty->count is 1, state->count is %d\n", __func__ , | ||
518 | self->open_count); | ||
519 | self->open_count = 1; | ||
520 | } | ||
521 | |||
522 | if (--self->open_count < 0) { | ||
523 | IRDA_ERROR("%s(), bad serial port count for ttys%d: %d\n", | ||
524 | __func__, self->line, self->open_count); | ||
525 | self->open_count = 0; | ||
526 | } | ||
527 | if (self->open_count) { | ||
528 | spin_unlock_irqrestore(&self->spinlock, flags); | ||
529 | |||
530 | IRDA_DEBUG(0, "%s(), open count > 0\n", __func__ ); | ||
531 | return; | 519 | return; |
532 | } | ||
533 | |||
534 | /* Hum... Should be test_and_set_bit ??? - Jean II */ | ||
535 | set_bit(ASYNC_B_CLOSING, &self->flags); | ||
536 | |||
537 | /* We need to unlock here (we were unlocking at the end of this | ||
538 | * function), because tty_wait_until_sent() may schedule. | ||
539 | * I don't know if the rest should be protected somehow, | ||
540 | * so someone should check. - Jean II */ | ||
541 | spin_unlock_irqrestore(&self->spinlock, flags); | ||
542 | |||
543 | /* | ||
544 | * Now we wait for the transmit buffer to clear; and we notify | ||
545 | * the line discipline to only process XON/XOFF characters. | ||
546 | */ | ||
547 | tty->closing = 1; | ||
548 | if (self->closing_wait != ASYNC_CLOSING_WAIT_NONE) | ||
549 | tty_wait_until_sent_from_close(tty, self->closing_wait); | ||
550 | 520 | ||
551 | ircomm_tty_shutdown(self); | 521 | ircomm_tty_shutdown(self); |
552 | 522 | ||
553 | tty_driver_flush_buffer(tty); | 523 | tty_driver_flush_buffer(tty); |
554 | tty_ldisc_flush(tty); | ||
555 | 524 | ||
556 | tty->closing = 0; | 525 | tty_port_close_end(port, tty); |
557 | self->tty = NULL; | 526 | tty_port_tty_set(port, NULL); |
558 | |||
559 | if (self->blocked_open) { | ||
560 | if (self->close_delay) | ||
561 | schedule_timeout_interruptible(self->close_delay); | ||
562 | wake_up_interruptible(&self->open_wait); | ||
563 | } | ||
564 | |||
565 | self->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); | ||
566 | wake_up_interruptible(&self->close_wait); | ||
567 | } | 527 | } |
568 | 528 | ||
569 | /* | 529 | /* |
@@ -606,7 +566,7 @@ static void ircomm_tty_do_softint(struct work_struct *work) | |||
606 | if (!self || self->magic != IRCOMM_TTY_MAGIC) | 566 | if (!self || self->magic != IRCOMM_TTY_MAGIC) |
607 | return; | 567 | return; |
608 | 568 | ||
609 | tty = self->tty; | 569 | tty = tty_port_tty_get(&self->port); |
610 | if (!tty) | 570 | if (!tty) |
611 | return; | 571 | return; |
612 | 572 | ||
@@ -627,7 +587,7 @@ static void ircomm_tty_do_softint(struct work_struct *work) | |||
627 | } | 587 | } |
628 | 588 | ||
629 | if (tty->hw_stopped) | 589 | if (tty->hw_stopped) |
630 | return; | 590 | goto put; |
631 | 591 | ||
632 | /* Unlink transmit buffer */ | 592 | /* Unlink transmit buffer */ |
633 | spin_lock_irqsave(&self->spinlock, flags); | 593 | spin_lock_irqsave(&self->spinlock, flags); |
@@ -646,6 +606,8 @@ static void ircomm_tty_do_softint(struct work_struct *work) | |||
646 | 606 | ||
647 | /* Check if user (still) wants to be waken up */ | 607 | /* Check if user (still) wants to be waken up */ |
648 | tty_wakeup(tty); | 608 | tty_wakeup(tty); |
609 | put: | ||
610 | tty_kref_put(tty); | ||
649 | } | 611 | } |
650 | 612 | ||
651 | /* | 613 | /* |
@@ -880,7 +842,7 @@ static void ircomm_tty_throttle(struct tty_struct *tty) | |||
880 | ircomm_tty_send_xchar(tty, STOP_CHAR(tty)); | 842 | ircomm_tty_send_xchar(tty, STOP_CHAR(tty)); |
881 | 843 | ||
882 | /* Hardware flow control? */ | 844 | /* Hardware flow control? */ |
883 | if (tty->termios->c_cflag & CRTSCTS) { | 845 | if (tty->termios.c_cflag & CRTSCTS) { |
884 | self->settings.dte &= ~IRCOMM_RTS; | 846 | self->settings.dte &= ~IRCOMM_RTS; |
885 | self->settings.dte |= IRCOMM_DELTA_RTS; | 847 | self->settings.dte |= IRCOMM_DELTA_RTS; |
886 | 848 | ||
@@ -912,7 +874,7 @@ static void ircomm_tty_unthrottle(struct tty_struct *tty) | |||
912 | } | 874 | } |
913 | 875 | ||
914 | /* Using hardware flow control? */ | 876 | /* Using hardware flow control? */ |
915 | if (tty->termios->c_cflag & CRTSCTS) { | 877 | if (tty->termios.c_cflag & CRTSCTS) { |
916 | self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS); | 878 | self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS); |
917 | 879 | ||
918 | ircomm_param_request(self, IRCOMM_DTE, TRUE); | 880 | ircomm_param_request(self, IRCOMM_DTE, TRUE); |
@@ -955,7 +917,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self) | |||
955 | 917 | ||
956 | IRDA_DEBUG(0, "%s()\n", __func__ ); | 918 | IRDA_DEBUG(0, "%s()\n", __func__ ); |
957 | 919 | ||
958 | if (!test_and_clear_bit(ASYNC_B_INITIALIZED, &self->flags)) | 920 | if (!test_and_clear_bit(ASYNCB_INITIALIZED, &self->port.flags)) |
959 | return; | 921 | return; |
960 | 922 | ||
961 | ircomm_tty_detach_cable(self); | 923 | ircomm_tty_detach_cable(self); |
@@ -994,6 +956,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self) | |||
994 | static void ircomm_tty_hangup(struct tty_struct *tty) | 956 | static void ircomm_tty_hangup(struct tty_struct *tty) |
995 | { | 957 | { |
996 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; | 958 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; |
959 | struct tty_port *port = &self->port; | ||
997 | unsigned long flags; | 960 | unsigned long flags; |
998 | 961 | ||
999 | IRDA_DEBUG(0, "%s()\n", __func__ ); | 962 | IRDA_DEBUG(0, "%s()\n", __func__ ); |
@@ -1004,14 +967,17 @@ static void ircomm_tty_hangup(struct tty_struct *tty) | |||
1004 | /* ircomm_tty_flush_buffer(tty); */ | 967 | /* ircomm_tty_flush_buffer(tty); */ |
1005 | ircomm_tty_shutdown(self); | 968 | ircomm_tty_shutdown(self); |
1006 | 969 | ||
1007 | /* I guess we need to lock here - Jean II */ | 970 | spin_lock_irqsave(&port->lock, flags); |
1008 | spin_lock_irqsave(&self->spinlock, flags); | 971 | port->flags &= ~ASYNC_NORMAL_ACTIVE; |
1009 | self->flags &= ~ASYNC_NORMAL_ACTIVE; | 972 | if (port->tty) { |
1010 | self->tty = NULL; | 973 | set_bit(TTY_IO_ERROR, &port->tty->flags); |
1011 | self->open_count = 0; | 974 | tty_kref_put(port->tty); |
1012 | spin_unlock_irqrestore(&self->spinlock, flags); | 975 | } |
976 | port->tty = NULL; | ||
977 | port->count = 0; | ||
978 | spin_unlock_irqrestore(&port->lock, flags); | ||
1013 | 979 | ||
1014 | wake_up_interruptible(&self->open_wait); | 980 | wake_up_interruptible(&port->open_wait); |
1015 | } | 981 | } |
1016 | 982 | ||
1017 | /* | 983 | /* |
@@ -1071,20 +1037,20 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self) | |||
1071 | IRDA_ASSERT(self != NULL, return;); | 1037 | IRDA_ASSERT(self != NULL, return;); |
1072 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); | 1038 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); |
1073 | 1039 | ||
1074 | tty = self->tty; | 1040 | tty = tty_port_tty_get(&self->port); |
1075 | 1041 | ||
1076 | status = self->settings.dce; | 1042 | status = self->settings.dce; |
1077 | 1043 | ||
1078 | if (status & IRCOMM_DCE_DELTA_ANY) { | 1044 | if (status & IRCOMM_DCE_DELTA_ANY) { |
1079 | /*wake_up_interruptible(&self->delta_msr_wait);*/ | 1045 | /*wake_up_interruptible(&self->delta_msr_wait);*/ |
1080 | } | 1046 | } |
1081 | if ((self->flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) { | 1047 | if ((self->port.flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) { |
1082 | IRDA_DEBUG(2, | 1048 | IRDA_DEBUG(2, |
1083 | "%s(), ircomm%d CD now %s...\n", __func__ , self->line, | 1049 | "%s(), ircomm%d CD now %s...\n", __func__ , self->line, |
1084 | (status & IRCOMM_CD) ? "on" : "off"); | 1050 | (status & IRCOMM_CD) ? "on" : "off"); |
1085 | 1051 | ||
1086 | if (status & IRCOMM_CD) { | 1052 | if (status & IRCOMM_CD) { |
1087 | wake_up_interruptible(&self->open_wait); | 1053 | wake_up_interruptible(&self->port.open_wait); |
1088 | } else { | 1054 | } else { |
1089 | IRDA_DEBUG(2, | 1055 | IRDA_DEBUG(2, |
1090 | "%s(), Doing serial hangup..\n", __func__ ); | 1056 | "%s(), Doing serial hangup..\n", __func__ ); |
@@ -1092,10 +1058,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self) | |||
1092 | tty_hangup(tty); | 1058 | tty_hangup(tty); |
1093 | 1059 | ||
1094 | /* Hangup will remote the tty, so better break out */ | 1060 | /* Hangup will remote the tty, so better break out */ |
1095 | return; | 1061 | goto put; |
1096 | } | 1062 | } |
1097 | } | 1063 | } |
1098 | if (self->flags & ASYNC_CTS_FLOW) { | 1064 | if (tty && self->port.flags & ASYNC_CTS_FLOW) { |
1099 | if (tty->hw_stopped) { | 1065 | if (tty->hw_stopped) { |
1100 | if (status & IRCOMM_CTS) { | 1066 | if (status & IRCOMM_CTS) { |
1101 | IRDA_DEBUG(2, | 1067 | IRDA_DEBUG(2, |
@@ -1103,10 +1069,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self) | |||
1103 | tty->hw_stopped = 0; | 1069 | tty->hw_stopped = 0; |
1104 | 1070 | ||
1105 | /* Wake up processes blocked on open */ | 1071 | /* Wake up processes blocked on open */ |
1106 | wake_up_interruptible(&self->open_wait); | 1072 | wake_up_interruptible(&self->port.open_wait); |
1107 | 1073 | ||
1108 | schedule_work(&self->tqueue); | 1074 | schedule_work(&self->tqueue); |
1109 | return; | 1075 | goto put; |
1110 | } | 1076 | } |
1111 | } else { | 1077 | } else { |
1112 | if (!(status & IRCOMM_CTS)) { | 1078 | if (!(status & IRCOMM_CTS)) { |
@@ -1116,6 +1082,8 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self) | |||
1116 | } | 1082 | } |
1117 | } | 1083 | } |
1118 | } | 1084 | } |
1085 | put: | ||
1086 | tty_kref_put(tty); | ||
1119 | } | 1087 | } |
1120 | 1088 | ||
1121 | /* | 1089 | /* |
@@ -1128,6 +1096,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap, | |||
1128 | struct sk_buff *skb) | 1096 | struct sk_buff *skb) |
1129 | { | 1097 | { |
1130 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; | 1098 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; |
1099 | struct tty_struct *tty; | ||
1131 | 1100 | ||
1132 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 1101 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
1133 | 1102 | ||
@@ -1135,7 +1104,8 @@ static int ircomm_tty_data_indication(void *instance, void *sap, | |||
1135 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); | 1104 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); |
1136 | IRDA_ASSERT(skb != NULL, return -1;); | 1105 | IRDA_ASSERT(skb != NULL, return -1;); |
1137 | 1106 | ||
1138 | if (!self->tty) { | 1107 | tty = tty_port_tty_get(&self->port); |
1108 | if (!tty) { | ||
1139 | IRDA_DEBUG(0, "%s(), no tty!\n", __func__ ); | 1109 | IRDA_DEBUG(0, "%s(), no tty!\n", __func__ ); |
1140 | return 0; | 1110 | return 0; |
1141 | } | 1111 | } |
@@ -1146,7 +1116,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap, | |||
1146 | * Devices like WinCE can do this, and since they don't send any | 1116 | * Devices like WinCE can do this, and since they don't send any |
1147 | * params, we can just as well declare the hardware for running. | 1117 | * params, we can just as well declare the hardware for running. |
1148 | */ | 1118 | */ |
1149 | if (self->tty->hw_stopped && (self->flow == FLOW_START)) { | 1119 | if (tty->hw_stopped && (self->flow == FLOW_START)) { |
1150 | IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ ); | 1120 | IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ ); |
1151 | ircomm_param_request(self, IRCOMM_POLL, TRUE); | 1121 | ircomm_param_request(self, IRCOMM_POLL, TRUE); |
1152 | 1122 | ||
@@ -1159,8 +1129,9 @@ static int ircomm_tty_data_indication(void *instance, void *sap, | |||
1159 | * Use flip buffer functions since the code may be called from interrupt | 1129 | * Use flip buffer functions since the code may be called from interrupt |
1160 | * context | 1130 | * context |
1161 | */ | 1131 | */ |
1162 | tty_insert_flip_string(self->tty, skb->data, skb->len); | 1132 | tty_insert_flip_string(tty, skb->data, skb->len); |
1163 | tty_flip_buffer_push(self->tty); | 1133 | tty_flip_buffer_push(tty); |
1134 | tty_kref_put(tty); | ||
1164 | 1135 | ||
1165 | /* No need to kfree_skb - see ircomm_ttp_data_indication() */ | 1136 | /* No need to kfree_skb - see ircomm_ttp_data_indication() */ |
1166 | 1137 | ||
@@ -1211,12 +1182,13 @@ static void ircomm_tty_flow_indication(void *instance, void *sap, | |||
1211 | IRDA_ASSERT(self != NULL, return;); | 1182 | IRDA_ASSERT(self != NULL, return;); |
1212 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); | 1183 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); |
1213 | 1184 | ||
1214 | tty = self->tty; | 1185 | tty = tty_port_tty_get(&self->port); |
1215 | 1186 | ||
1216 | switch (cmd) { | 1187 | switch (cmd) { |
1217 | case FLOW_START: | 1188 | case FLOW_START: |
1218 | IRDA_DEBUG(2, "%s(), hw start!\n", __func__ ); | 1189 | IRDA_DEBUG(2, "%s(), hw start!\n", __func__ ); |
1219 | tty->hw_stopped = 0; | 1190 | if (tty) |
1191 | tty->hw_stopped = 0; | ||
1220 | 1192 | ||
1221 | /* ircomm_tty_do_softint will take care of the rest */ | 1193 | /* ircomm_tty_do_softint will take care of the rest */ |
1222 | schedule_work(&self->tqueue); | 1194 | schedule_work(&self->tqueue); |
@@ -1224,15 +1196,19 @@ static void ircomm_tty_flow_indication(void *instance, void *sap, | |||
1224 | default: /* If we get here, something is very wrong, better stop */ | 1196 | default: /* If we get here, something is very wrong, better stop */ |
1225 | case FLOW_STOP: | 1197 | case FLOW_STOP: |
1226 | IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ ); | 1198 | IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ ); |
1227 | tty->hw_stopped = 1; | 1199 | if (tty) |
1200 | tty->hw_stopped = 1; | ||
1228 | break; | 1201 | break; |
1229 | } | 1202 | } |
1203 | |||
1204 | tty_kref_put(tty); | ||
1230 | self->flow = cmd; | 1205 | self->flow = cmd; |
1231 | } | 1206 | } |
1232 | 1207 | ||
1233 | #ifdef CONFIG_PROC_FS | 1208 | #ifdef CONFIG_PROC_FS |
1234 | static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m) | 1209 | static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m) |
1235 | { | 1210 | { |
1211 | struct tty_struct *tty; | ||
1236 | char sep; | 1212 | char sep; |
1237 | 1213 | ||
1238 | seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]); | 1214 | seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]); |
@@ -1328,40 +1304,43 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m) | |||
1328 | 1304 | ||
1329 | seq_puts(m, "Flags:"); | 1305 | seq_puts(m, "Flags:"); |
1330 | sep = ' '; | 1306 | sep = ' '; |
1331 | if (self->flags & ASYNC_CTS_FLOW) { | 1307 | if (self->port.flags & ASYNC_CTS_FLOW) { |
1332 | seq_printf(m, "%cASYNC_CTS_FLOW", sep); | 1308 | seq_printf(m, "%cASYNC_CTS_FLOW", sep); |
1333 | sep = '|'; | 1309 | sep = '|'; |
1334 | } | 1310 | } |
1335 | if (self->flags & ASYNC_CHECK_CD) { | 1311 | if (self->port.flags & ASYNC_CHECK_CD) { |
1336 | seq_printf(m, "%cASYNC_CHECK_CD", sep); | 1312 | seq_printf(m, "%cASYNC_CHECK_CD", sep); |
1337 | sep = '|'; | 1313 | sep = '|'; |
1338 | } | 1314 | } |
1339 | if (self->flags & ASYNC_INITIALIZED) { | 1315 | if (self->port.flags & ASYNC_INITIALIZED) { |
1340 | seq_printf(m, "%cASYNC_INITIALIZED", sep); | 1316 | seq_printf(m, "%cASYNC_INITIALIZED", sep); |
1341 | sep = '|'; | 1317 | sep = '|'; |
1342 | } | 1318 | } |
1343 | if (self->flags & ASYNC_LOW_LATENCY) { | 1319 | if (self->port.flags & ASYNC_LOW_LATENCY) { |
1344 | seq_printf(m, "%cASYNC_LOW_LATENCY", sep); | 1320 | seq_printf(m, "%cASYNC_LOW_LATENCY", sep); |
1345 | sep = '|'; | 1321 | sep = '|'; |
1346 | } | 1322 | } |
1347 | if (self->flags & ASYNC_CLOSING) { | 1323 | if (self->port.flags & ASYNC_CLOSING) { |
1348 | seq_printf(m, "%cASYNC_CLOSING", sep); | 1324 | seq_printf(m, "%cASYNC_CLOSING", sep); |
1349 | sep = '|'; | 1325 | sep = '|'; |
1350 | } | 1326 | } |
1351 | if (self->flags & ASYNC_NORMAL_ACTIVE) { | 1327 | if (self->port.flags & ASYNC_NORMAL_ACTIVE) { |
1352 | seq_printf(m, "%cASYNC_NORMAL_ACTIVE", sep); | 1328 | seq_printf(m, "%cASYNC_NORMAL_ACTIVE", sep); |
1353 | sep = '|'; | 1329 | sep = '|'; |
1354 | } | 1330 | } |
1355 | seq_putc(m, '\n'); | 1331 | seq_putc(m, '\n'); |
1356 | 1332 | ||
1357 | seq_printf(m, "Role: %s\n", self->client ? "client" : "server"); | 1333 | seq_printf(m, "Role: %s\n", self->client ? "client" : "server"); |
1358 | seq_printf(m, "Open count: %d\n", self->open_count); | 1334 | seq_printf(m, "Open count: %d\n", self->port.count); |
1359 | seq_printf(m, "Max data size: %d\n", self->max_data_size); | 1335 | seq_printf(m, "Max data size: %d\n", self->max_data_size); |
1360 | seq_printf(m, "Max header size: %d\n", self->max_header_size); | 1336 | seq_printf(m, "Max header size: %d\n", self->max_header_size); |
1361 | 1337 | ||
1362 | if (self->tty) | 1338 | tty = tty_port_tty_get(&self->port); |
1339 | if (tty) { | ||
1363 | seq_printf(m, "Hardware: %s\n", | 1340 | seq_printf(m, "Hardware: %s\n", |
1364 | self->tty->hw_stopped ? "Stopped" : "Running"); | 1341 | tty->hw_stopped ? "Stopped" : "Running"); |
1342 | tty_kref_put(tty); | ||
1343 | } | ||
1365 | } | 1344 | } |
1366 | 1345 | ||
1367 | static int ircomm_tty_proc_show(struct seq_file *m, void *v) | 1346 | static int ircomm_tty_proc_show(struct seq_file *m, void *v) |
diff --git a/net/irda/ircomm/ircomm_tty_attach.c b/net/irda/ircomm/ircomm_tty_attach.c index b65d66e0d817..3ab70e7a0715 100644 --- a/net/irda/ircomm/ircomm_tty_attach.c +++ b/net/irda/ircomm/ircomm_tty_attach.c | |||
@@ -130,6 +130,8 @@ static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, | |||
130 | */ | 130 | */ |
131 | int ircomm_tty_attach_cable(struct ircomm_tty_cb *self) | 131 | int ircomm_tty_attach_cable(struct ircomm_tty_cb *self) |
132 | { | 132 | { |
133 | struct tty_struct *tty; | ||
134 | |||
133 | IRDA_DEBUG(0, "%s()\n", __func__ ); | 135 | IRDA_DEBUG(0, "%s()\n", __func__ ); |
134 | 136 | ||
135 | IRDA_ASSERT(self != NULL, return -1;); | 137 | IRDA_ASSERT(self != NULL, return -1;); |
@@ -142,7 +144,11 @@ int ircomm_tty_attach_cable(struct ircomm_tty_cb *self) | |||
142 | } | 144 | } |
143 | 145 | ||
144 | /* Make sure nobody tries to write before the link is up */ | 146 | /* Make sure nobody tries to write before the link is up */ |
145 | self->tty->hw_stopped = 1; | 147 | tty = tty_port_tty_get(&self->port); |
148 | if (tty) { | ||
149 | tty->hw_stopped = 1; | ||
150 | tty_kref_put(tty); | ||
151 | } | ||
146 | 152 | ||
147 | ircomm_tty_ias_register(self); | 153 | ircomm_tty_ias_register(self); |
148 | 154 | ||
@@ -398,23 +404,26 @@ void ircomm_tty_disconnect_indication(void *instance, void *sap, | |||
398 | struct sk_buff *skb) | 404 | struct sk_buff *skb) |
399 | { | 405 | { |
400 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; | 406 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; |
407 | struct tty_struct *tty; | ||
401 | 408 | ||
402 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 409 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
403 | 410 | ||
404 | IRDA_ASSERT(self != NULL, return;); | 411 | IRDA_ASSERT(self != NULL, return;); |
405 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); | 412 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); |
406 | 413 | ||
407 | if (!self->tty) | 414 | tty = tty_port_tty_get(&self->port); |
415 | if (!tty) | ||
408 | return; | 416 | return; |
409 | 417 | ||
410 | /* This will stop control data transfers */ | 418 | /* This will stop control data transfers */ |
411 | self->flow = FLOW_STOP; | 419 | self->flow = FLOW_STOP; |
412 | 420 | ||
413 | /* Stop data transfers */ | 421 | /* Stop data transfers */ |
414 | self->tty->hw_stopped = 1; | 422 | tty->hw_stopped = 1; |
415 | 423 | ||
416 | ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL, | 424 | ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL, |
417 | NULL); | 425 | NULL); |
426 | tty_kref_put(tty); | ||
418 | } | 427 | } |
419 | 428 | ||
420 | /* | 429 | /* |
@@ -550,12 +559,15 @@ void ircomm_tty_connect_indication(void *instance, void *sap, | |||
550 | */ | 559 | */ |
551 | void ircomm_tty_link_established(struct ircomm_tty_cb *self) | 560 | void ircomm_tty_link_established(struct ircomm_tty_cb *self) |
552 | { | 561 | { |
562 | struct tty_struct *tty; | ||
563 | |||
553 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 564 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
554 | 565 | ||
555 | IRDA_ASSERT(self != NULL, return;); | 566 | IRDA_ASSERT(self != NULL, return;); |
556 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); | 567 | IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); |
557 | 568 | ||
558 | if (!self->tty) | 569 | tty = tty_port_tty_get(&self->port); |
570 | if (!tty) | ||
559 | return; | 571 | return; |
560 | 572 | ||
561 | del_timer(&self->watchdog_timer); | 573 | del_timer(&self->watchdog_timer); |
@@ -566,19 +578,22 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self) | |||
566 | * will have to wait for the peer device (DCE) to raise the CTS | 578 | * will have to wait for the peer device (DCE) to raise the CTS |
567 | * line. | 579 | * line. |
568 | */ | 580 | */ |
569 | if ((self->flags & ASYNC_CTS_FLOW) && ((self->settings.dce & IRCOMM_CTS) == 0)) { | 581 | if ((self->port.flags & ASYNC_CTS_FLOW) && |
582 | ((self->settings.dce & IRCOMM_CTS) == 0)) { | ||
570 | IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ ); | 583 | IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ ); |
571 | return; | 584 | goto put; |
572 | } else { | 585 | } else { |
573 | IRDA_DEBUG(1, "%s(), starting hardware!\n", __func__ ); | 586 | IRDA_DEBUG(1, "%s(), starting hardware!\n", __func__ ); |
574 | 587 | ||
575 | self->tty->hw_stopped = 0; | 588 | tty->hw_stopped = 0; |
576 | 589 | ||
577 | /* Wake up processes blocked on open */ | 590 | /* Wake up processes blocked on open */ |
578 | wake_up_interruptible(&self->open_wait); | 591 | wake_up_interruptible(&self->port.open_wait); |
579 | } | 592 | } |
580 | 593 | ||
581 | schedule_work(&self->tqueue); | 594 | schedule_work(&self->tqueue); |
595 | put: | ||
596 | tty_kref_put(tty); | ||
582 | } | 597 | } |
583 | 598 | ||
584 | /* | 599 | /* |
@@ -977,14 +992,17 @@ static int ircomm_tty_state_ready(struct ircomm_tty_cb *self, | |||
977 | ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); | 992 | ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); |
978 | ircomm_tty_start_watchdog_timer(self, 3*HZ); | 993 | ircomm_tty_start_watchdog_timer(self, 3*HZ); |
979 | 994 | ||
980 | if (self->flags & ASYNC_CHECK_CD) { | 995 | if (self->port.flags & ASYNC_CHECK_CD) { |
981 | /* Drop carrier */ | 996 | /* Drop carrier */ |
982 | self->settings.dce = IRCOMM_DELTA_CD; | 997 | self->settings.dce = IRCOMM_DELTA_CD; |
983 | ircomm_tty_check_modem_status(self); | 998 | ircomm_tty_check_modem_status(self); |
984 | } else { | 999 | } else { |
1000 | struct tty_struct *tty = tty_port_tty_get(&self->port); | ||
985 | IRDA_DEBUG(0, "%s(), hanging up!\n", __func__ ); | 1001 | IRDA_DEBUG(0, "%s(), hanging up!\n", __func__ ); |
986 | if (self->tty) | 1002 | if (tty) { |
987 | tty_hangup(self->tty); | 1003 | tty_hangup(tty); |
1004 | tty_kref_put(tty); | ||
1005 | } | ||
988 | } | 1006 | } |
989 | break; | 1007 | break; |
990 | default: | 1008 | default: |
diff --git a/net/irda/ircomm/ircomm_tty_ioctl.c b/net/irda/ircomm/ircomm_tty_ioctl.c index d0667d68351d..b343f50dc8d7 100644 --- a/net/irda/ircomm/ircomm_tty_ioctl.c +++ b/net/irda/ircomm/ircomm_tty_ioctl.c | |||
@@ -52,17 +52,18 @@ | |||
52 | * Change speed of the driver. If the remote device is a DCE, then this | 52 | * Change speed of the driver. If the remote device is a DCE, then this |
53 | * should make it change the speed of its serial port | 53 | * should make it change the speed of its serial port |
54 | */ | 54 | */ |
55 | static void ircomm_tty_change_speed(struct ircomm_tty_cb *self) | 55 | static void ircomm_tty_change_speed(struct ircomm_tty_cb *self, |
56 | struct tty_struct *tty) | ||
56 | { | 57 | { |
57 | unsigned int cflag, cval; | 58 | unsigned int cflag, cval; |
58 | int baud; | 59 | int baud; |
59 | 60 | ||
60 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 61 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
61 | 62 | ||
62 | if (!self->tty || !self->tty->termios || !self->ircomm) | 63 | if (!self->ircomm) |
63 | return; | 64 | return; |
64 | 65 | ||
65 | cflag = self->tty->termios->c_cflag; | 66 | cflag = tty->termios.c_cflag; |
66 | 67 | ||
67 | /* byte size and parity */ | 68 | /* byte size and parity */ |
68 | switch (cflag & CSIZE) { | 69 | switch (cflag & CSIZE) { |
@@ -81,7 +82,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self) | |||
81 | cval |= IRCOMM_PARITY_EVEN; | 82 | cval |= IRCOMM_PARITY_EVEN; |
82 | 83 | ||
83 | /* Determine divisor based on baud rate */ | 84 | /* Determine divisor based on baud rate */ |
84 | baud = tty_get_baud_rate(self->tty); | 85 | baud = tty_get_baud_rate(tty); |
85 | if (!baud) | 86 | if (!baud) |
86 | baud = 9600; /* B0 transition handled in rs_set_termios */ | 87 | baud = 9600; /* B0 transition handled in rs_set_termios */ |
87 | 88 | ||
@@ -90,19 +91,19 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self) | |||
90 | 91 | ||
91 | /* CTS flow control flag and modem status interrupts */ | 92 | /* CTS flow control flag and modem status interrupts */ |
92 | if (cflag & CRTSCTS) { | 93 | if (cflag & CRTSCTS) { |
93 | self->flags |= ASYNC_CTS_FLOW; | 94 | self->port.flags |= ASYNC_CTS_FLOW; |
94 | self->settings.flow_control |= IRCOMM_RTS_CTS_IN; | 95 | self->settings.flow_control |= IRCOMM_RTS_CTS_IN; |
95 | /* This got me. Bummer. Jean II */ | 96 | /* This got me. Bummer. Jean II */ |
96 | if (self->service_type == IRCOMM_3_WIRE_RAW) | 97 | if (self->service_type == IRCOMM_3_WIRE_RAW) |
97 | IRDA_WARNING("%s(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n", __func__); | 98 | IRDA_WARNING("%s(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n", __func__); |
98 | } else { | 99 | } else { |
99 | self->flags &= ~ASYNC_CTS_FLOW; | 100 | self->port.flags &= ~ASYNC_CTS_FLOW; |
100 | self->settings.flow_control &= ~IRCOMM_RTS_CTS_IN; | 101 | self->settings.flow_control &= ~IRCOMM_RTS_CTS_IN; |
101 | } | 102 | } |
102 | if (cflag & CLOCAL) | 103 | if (cflag & CLOCAL) |
103 | self->flags &= ~ASYNC_CHECK_CD; | 104 | self->port.flags &= ~ASYNC_CHECK_CD; |
104 | else | 105 | else |
105 | self->flags |= ASYNC_CHECK_CD; | 106 | self->port.flags |= ASYNC_CHECK_CD; |
106 | #if 0 | 107 | #if 0 |
107 | /* | 108 | /* |
108 | * Set up parity check flag | 109 | * Set up parity check flag |
@@ -148,18 +149,18 @@ void ircomm_tty_set_termios(struct tty_struct *tty, | |||
148 | struct ktermios *old_termios) | 149 | struct ktermios *old_termios) |
149 | { | 150 | { |
150 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; | 151 | struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; |
151 | unsigned int cflag = tty->termios->c_cflag; | 152 | unsigned int cflag = tty->termios.c_cflag; |
152 | 153 | ||
153 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 154 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
154 | 155 | ||
155 | if ((cflag == old_termios->c_cflag) && | 156 | if ((cflag == old_termios->c_cflag) && |
156 | (RELEVANT_IFLAG(tty->termios->c_iflag) == | 157 | (RELEVANT_IFLAG(tty->termios.c_iflag) == |
157 | RELEVANT_IFLAG(old_termios->c_iflag))) | 158 | RELEVANT_IFLAG(old_termios->c_iflag))) |
158 | { | 159 | { |
159 | return; | 160 | return; |
160 | } | 161 | } |
161 | 162 | ||
162 | ircomm_tty_change_speed(self); | 163 | ircomm_tty_change_speed(self, tty); |
163 | 164 | ||
164 | /* Handle transition to B0 status */ | 165 | /* Handle transition to B0 status */ |
165 | if ((old_termios->c_cflag & CBAUD) && | 166 | if ((old_termios->c_cflag & CBAUD) && |
@@ -172,7 +173,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty, | |||
172 | if (!(old_termios->c_cflag & CBAUD) && | 173 | if (!(old_termios->c_cflag & CBAUD) && |
173 | (cflag & CBAUD)) { | 174 | (cflag & CBAUD)) { |
174 | self->settings.dte |= IRCOMM_DTR; | 175 | self->settings.dte |= IRCOMM_DTR; |
175 | if (!(tty->termios->c_cflag & CRTSCTS) || | 176 | if (!(tty->termios.c_cflag & CRTSCTS) || |
176 | !test_bit(TTY_THROTTLED, &tty->flags)) { | 177 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
177 | self->settings.dte |= IRCOMM_RTS; | 178 | self->settings.dte |= IRCOMM_RTS; |
178 | } | 179 | } |
@@ -181,7 +182,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty, | |||
181 | 182 | ||
182 | /* Handle turning off CRTSCTS */ | 183 | /* Handle turning off CRTSCTS */ |
183 | if ((old_termios->c_cflag & CRTSCTS) && | 184 | if ((old_termios->c_cflag & CRTSCTS) && |
184 | !(tty->termios->c_cflag & CRTSCTS)) | 185 | !(tty->termios.c_cflag & CRTSCTS)) |
185 | { | 186 | { |
186 | tty->hw_stopped = 0; | 187 | tty->hw_stopped = 0; |
187 | ircomm_tty_start(tty); | 188 | ircomm_tty_start(tty); |
@@ -270,10 +271,10 @@ static int ircomm_tty_get_serial_info(struct ircomm_tty_cb *self, | |||
270 | 271 | ||
271 | memset(&info, 0, sizeof(info)); | 272 | memset(&info, 0, sizeof(info)); |
272 | info.line = self->line; | 273 | info.line = self->line; |
273 | info.flags = self->flags; | 274 | info.flags = self->port.flags; |
274 | info.baud_base = self->settings.data_rate; | 275 | info.baud_base = self->settings.data_rate; |
275 | info.close_delay = self->close_delay; | 276 | info.close_delay = self->port.close_delay; |
276 | info.closing_wait = self->closing_wait; | 277 | info.closing_wait = self->port.closing_wait; |
277 | 278 | ||
278 | /* For compatibility */ | 279 | /* For compatibility */ |
279 | info.type = PORT_16550A; | 280 | info.type = PORT_16550A; |