You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'tty-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial driver updates from Greg KH: "Here's the big tty/serial driver update for 3.19-rc1. There are a number of TTY core changes/fixes in here from Peter Hurley that have all been teted in linux-next for a long time now. There are also the normal serial driver updates as well, full details in the changelog below" * tag 'tty-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (219 commits) serial: pxa: hold port.lock when reporting modem line changes tty-hvsi_lib: Deletion of an unnecessary check before the function call "tty_kref_put" tty: Deletion of unnecessary checks before two function calls n_tty: Fix read_buf race condition, increment read_head after pushing data serial: of-serial: add PM suspend/resume support Revert "serial: of-serial: add PM suspend/resume support" Revert "serial: of-serial: fix up PM ops on no_console_suspend and port type" serial: 8250: don't attempt a trylock if in sysrq serial: core: Add big-endian iotype serial: samsung: use port->fifosize instead of hardcoded values serial: samsung: prefer to use fifosize from driver data serial: samsung: fix style problems serial: samsung: wait for transfer completion before clock disable serial: icom: fix error return code serial: tegra: clean up tty-flag assignments serial: Fix io address assign flow with Fintek PCI-to-UART Product serial: mxs-auart: fix tx_empty against shift register serial: mxs-auart: fix gpio change detection on interrupt serial: mxs-auart: Fix mxs_auart_set_ldisc() serial: 8250_dw: Use 64-bit access for OCTEON. ...
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
* BCM63xx UART
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: "brcm,bcm6345-uart"
|
||||
|
||||
- reg: The base address of the UART register bank.
|
||||
|
||||
- interrupts: A single interrupt specifier.
|
||||
|
||||
- clocks: Clock driving the hardware; used to figure out the baud rate
|
||||
divisor.
|
||||
|
||||
Example:
|
||||
|
||||
uart0: serial@14e00520 {
|
||||
compatible = "brcm,bcm6345-uart";
|
||||
reg = <0x14e00520 0x18>;
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <2>;
|
||||
clocks = <&periph_clk>;
|
||||
};
|
||||
|
||||
clocks {
|
||||
periph_clk: periph_clk@0 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <54000000>;
|
||||
};
|
||||
};
|
||||
@@ -11,8 +11,13 @@ Required properties:
|
||||
- dma-names: "rx" for RX channel, "tx" for TX channel.
|
||||
|
||||
Optional properties:
|
||||
- fsl,uart-has-rtscts : Indicate the UART has RTS and CTS lines,
|
||||
- fsl,uart-has-rtscts : Indicate the UART has RTS and CTS lines
|
||||
for hardware flow control,
|
||||
it also means you enable the DMA support for this UART.
|
||||
- {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD
|
||||
line respectively. It will use specified PIO instead of the peripheral
|
||||
function pin for the USART feature.
|
||||
If unsure, don't specify this property.
|
||||
|
||||
Example:
|
||||
auart0: serial@8006a000 {
|
||||
@@ -21,6 +26,9 @@ auart0: serial@8006a000 {
|
||||
interrupts = <112>;
|
||||
dmas = <&dma_apbx 8>, <&dma_apbx 9>;
|
||||
dma-names = "rx", "tx";
|
||||
cts-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
|
||||
dsr-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
|
||||
dcd-gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
Note: Each auart port should have an alias correctly numbered in "aliases"
|
||||
|
||||
@@ -10,6 +10,7 @@ Required properties:
|
||||
- "ns16850"
|
||||
- "nvidia,tegra20-uart"
|
||||
- "nxp,lpc3220-uart"
|
||||
- "ralink,rt2880-uart"
|
||||
- "ibm,qpace-nwp-serial"
|
||||
- "altr,16550-FIFO32"
|
||||
- "altr,16550-FIFO64"
|
||||
|
||||
@@ -6,23 +6,35 @@ Required properties:
|
||||
- interrupts: exactly one interrupt specifier
|
||||
|
||||
Optional properties:
|
||||
- pinctrl: When present, must have one state named "default",
|
||||
- pinctrl:
|
||||
When present, must have one state named "default",
|
||||
and may contain a second name named "sleep". The former
|
||||
state sets up pins for ordinary operation whereas
|
||||
the latter state will put the associated pins to sleep
|
||||
when the UART is unused
|
||||
- clocks: When present, the first clock listed must correspond to
|
||||
- clocks:
|
||||
When present, the first clock listed must correspond to
|
||||
the clock named UARTCLK on the IP block, i.e. the clock
|
||||
to the external serial line, whereas the second clock
|
||||
must correspond to the PCLK clocking the internal logic
|
||||
of the block. Just listing one clock (the first one) is
|
||||
deprecated.
|
||||
- clocks-names: When present, the first clock listed must be named
|
||||
- clocks-names:
|
||||
When present, the first clock listed must be named
|
||||
"uartclk" and the second clock listed must be named
|
||||
"apb_pclk"
|
||||
- dmas: When present, may have one or two dma channels.
|
||||
- dmas:
|
||||
When present, may have one or two dma channels.
|
||||
The first one must be named "rx", the second one
|
||||
must be named "tx".
|
||||
- auto-poll:
|
||||
Enables polling when using RX DMA.
|
||||
- poll-rate-ms:
|
||||
Rate at which poll occurs when auto-poll is set,
|
||||
default 100ms.
|
||||
- poll-timeout-ms:
|
||||
Poll timeout when auto-poll is set, default
|
||||
3000ms.
|
||||
|
||||
See also bindings/arm/primecell.txt
|
||||
|
||||
|
||||
@@ -27,27 +27,52 @@ Optional properties:
|
||||
- dmas: Should contain dma specifiers for transmit and receive channels
|
||||
- dma-names: Should contain "tx" for transmit and "rx" for receive channels
|
||||
|
||||
Note: Aliases may be defined to ensure the correct ordering of the UARTs.
|
||||
The alias serialN will result in the UART being assigned port N. If any
|
||||
serialN alias exists, then an alias must exist for each enabled UART. The
|
||||
serialN aliases should be in a .dts file instead of in a .dtsi file.
|
||||
|
||||
Examples:
|
||||
|
||||
A uartdm v1.4 device with dma capabilities.
|
||||
- A uartdm v1.4 device with dma capabilities.
|
||||
|
||||
serial@f991e000 {
|
||||
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
reg = <0xf991e000 0x1000>;
|
||||
interrupts = <0 108 0x0>;
|
||||
clocks = <&blsp1_uart2_apps_cxc>, <&blsp1_ahb_cxc>;
|
||||
clock-names = "core", "iface";
|
||||
dmas = <&dma0 0>, <&dma0 1>;
|
||||
dma-names = "tx", "rx";
|
||||
};
|
||||
serial@f991e000 {
|
||||
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
reg = <0xf991e000 0x1000>;
|
||||
interrupts = <0 108 0x0>;
|
||||
clocks = <&blsp1_uart2_apps_cxc>, <&blsp1_ahb_cxc>;
|
||||
clock-names = "core", "iface";
|
||||
dmas = <&dma0 0>, <&dma0 1>;
|
||||
dma-names = "tx", "rx";
|
||||
};
|
||||
|
||||
A uartdm v1.3 device without dma capabilities and part of a GSBI complex.
|
||||
- A uartdm v1.3 device without dma capabilities and part of a GSBI complex.
|
||||
|
||||
serial@19c40000 {
|
||||
compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm";
|
||||
reg = <0x19c40000 0x1000>,
|
||||
<0x19c00000 0x1000>;
|
||||
interrupts = <0 195 0x0>;
|
||||
clocks = <&gsbi5_uart_cxc>, <&gsbi5_ahb_cxc>;
|
||||
clock-names = "core", "iface";
|
||||
};
|
||||
serial@19c40000 {
|
||||
compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm";
|
||||
reg = <0x19c40000 0x1000>,
|
||||
<0x19c00000 0x1000>;
|
||||
interrupts = <0 195 0x0>;
|
||||
clocks = <&gsbi5_uart_cxc>, <&gsbi5_ahb_cxc>;
|
||||
clock-names = "core", "iface";
|
||||
};
|
||||
|
||||
- serialN alias.
|
||||
|
||||
aliases {
|
||||
serial0 = &uarta;
|
||||
serial1 = &uartc;
|
||||
serial2 = &uartb;
|
||||
};
|
||||
|
||||
uarta: serial@12490000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
uartb: serial@16340000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
uartc: serial@1a240000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
@@ -4,8 +4,7 @@ Required properties:
|
||||
|
||||
- compatible: Must contain one of the following:
|
||||
|
||||
- "renesas,scifa-sh73a0" for SH73A0 (SH-Mobile AG5) SCIFA compatible UART.
|
||||
- "renesas,scifb-sh73a0" for SH73A0 (SH-Mobile AG5) SCIFB compatible UART.
|
||||
- "renesas,scif-r7s72100" for R7S72100 (RZ/A1H) SCIF compatible UART.
|
||||
- "renesas,scifa-r8a73a4" for R8A73A4 (R-Mobile APE6) SCIFA compatible UART.
|
||||
- "renesas,scifb-r8a73a4" for R8A73A4 (R-Mobile APE6) SCIFB compatible UART.
|
||||
- "renesas,scifa-r8a7740" for R8A7740 (R-Mobile A1) SCIFA compatible UART.
|
||||
@@ -20,6 +19,12 @@ Required properties:
|
||||
- "renesas,scifa-r8a7791" for R8A7791 (R-Car M2) SCIFA compatible UART.
|
||||
- "renesas,scifb-r8a7791" for R8A7791 (R-Car M2) SCIFB compatible UART.
|
||||
- "renesas,hscif-r8a7791" for R8A7791 (R-Car M2) HSCIF compatible UART.
|
||||
- "renesas,scif-r8a7794" for R8A7794 (R-Car E2) SCIF compatible UART.
|
||||
- "renesas,scifa-r8a7794" for R8A7794 (R-Car E2) SCIFA compatible UART.
|
||||
- "renesas,scifb-r8a7794" for R8A7794 (R-Car E2) SCIFB compatible UART.
|
||||
- "renesas,hscif-r8a7794" for R8A7794 (R-Car E2) HSCIF compatible UART.
|
||||
- "renesas,scifa-sh73a0" for SH73A0 (SH-Mobile AG5) SCIFA compatible UART.
|
||||
- "renesas,scifb-sh73a0" for SH73A0 (SH-Mobile AG5) SCIFB compatible UART.
|
||||
- "renesas,scif" for generic SCIF compatible UART.
|
||||
- "renesas,scifa" for generic SCIFA compatible UART.
|
||||
- "renesas,scifb" for generic SCIFB compatible UART.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
* CSR SiRFprimaII/atlasVI Universal Synchronous Asynchronous Receiver/Transmitter *
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "sirf,prima2-uart" or "sirf, prima2-usp-uart"
|
||||
- compatible : Should be "sirf,prima2-uart", "sirf, prima2-usp-uart",
|
||||
"sirf,marco-uart" or "sirf,marco-bt-uart" which means
|
||||
uart located in BT module and used for BT.
|
||||
- reg : Offset and length of the register set for the device
|
||||
- interrupts : Should contain uart interrupt
|
||||
- fifosize : Should define hardware rx/tx fifo size
|
||||
@@ -31,3 +33,15 @@ usp@b0090000 {
|
||||
rts-gpios = <&gpio 15 0>;
|
||||
cts-gpios = <&gpio 46 0>;
|
||||
};
|
||||
|
||||
for uart use in BT module,
|
||||
uart6: uart@11000000 {
|
||||
cell-index = <6>;
|
||||
compatible = "sirf,marco-bt-uart", "sirf,marco-uart";
|
||||
reg = <0x11000000 0x1000>;
|
||||
interrupts = <0 100 0>;
|
||||
clocks = <&clks 138>, <&clks 140>, <&clks 141>;
|
||||
clock-names = "uart", "general", "noc";
|
||||
fifosize = <128>;
|
||||
status = "disabled";
|
||||
}
|
||||
|
||||
@@ -59,7 +59,9 @@ The core driver uses the info->tmpbuf_sem lock to prevent multi-threaded
|
||||
access to the info->tmpbuf bouncebuffer used for port writes.
|
||||
|
||||
The port_sem semaphore is used to protect against ports being added/
|
||||
removed or reconfigured at inappropriate times.
|
||||
removed or reconfigured at inappropriate times. Since v2.6.27, this
|
||||
semaphore has been the 'mutex' member of the tty_port struct, and
|
||||
commonly referred to as the port mutex (or port->mutex).
|
||||
|
||||
|
||||
uart_ops
|
||||
@@ -248,7 +250,7 @@ hardware.
|
||||
Other flags may be used (eg, xon/xoff characters) if your
|
||||
hardware supports hardware "soft" flow control.
|
||||
|
||||
Locking: none.
|
||||
Locking: caller holds port->mutex
|
||||
Interrupts: caller dependent.
|
||||
This call must not sleep
|
||||
|
||||
|
||||
@@ -8026,6 +8026,12 @@ S: Maintained
|
||||
F: Documentation/serial/rocket.txt
|
||||
F: drivers/tty/rocket*
|
||||
|
||||
ROCKETPORT EXPRESS/INFINITY DRIVER
|
||||
M: Kevin Cernekee <cernekee@gmail.com>
|
||||
L: linux-serial@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: drivers/tty/serial/rp2.*
|
||||
|
||||
ROSE NETWORK LAYER
|
||||
M: Ralf Baechle <ralf@linux-mips.org>
|
||||
L: linux-hams@vger.kernel.org
|
||||
|
||||
@@ -9,8 +9,11 @@
|
||||
#ifndef __BFIN_ASM_SERIAL_H__
|
||||
#define __BFIN_ASM_SERIAL_H__
|
||||
|
||||
#include <linux/circ_buf.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <mach/anomaly.h>
|
||||
#include <mach/bfin_serial.h>
|
||||
|
||||
@@ -25,10 +28,6 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
struct circ_buf;
|
||||
struct timer_list;
|
||||
struct work_struct;
|
||||
|
||||
struct bfin_serial_port {
|
||||
struct uart_port port;
|
||||
unsigned int old_status;
|
||||
|
||||
@@ -632,6 +632,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
|
||||
int fd = winch->fd;
|
||||
int err;
|
||||
char c;
|
||||
struct pid *pgrp;
|
||||
|
||||
if (fd != -1) {
|
||||
err = generic_read(fd, &c, NULL);
|
||||
@@ -657,7 +658,10 @@ static irqreturn_t winch_interrupt(int irq, void *data)
|
||||
if (line != NULL) {
|
||||
chan_window_size(line, &tty->winsize.ws_row,
|
||||
&tty->winsize.ws_col);
|
||||
kill_pgrp(tty->pgrp, SIGWINCH, 1);
|
||||
pgrp = tty_get_pgrp(tty);
|
||||
if (pgrp)
|
||||
kill_pgrp(pgrp, SIGWINCH, 1);
|
||||
put_pid(pgrp);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ enum parport_pc_pci_cards {
|
||||
timedia_9079c,
|
||||
wch_ch353_1s1p,
|
||||
wch_ch353_2s1p,
|
||||
wch_ch382_2s1p,
|
||||
sunix_2s1p,
|
||||
};
|
||||
|
||||
@@ -151,6 +152,7 @@ static struct parport_pc_pci cards[] = {
|
||||
/* timedia_9079c */ { 1, { { 2, 3 }, } },
|
||||
/* wch_ch353_1s1p*/ { 1, { { 1, -1}, } },
|
||||
/* wch_ch353_2s1p*/ { 1, { { 2, -1}, } },
|
||||
/* wch_ch382_2s1p*/ { 1, { { 2, -1}, } },
|
||||
/* sunix_2s1p */ { 1, { { 3, -1 }, } },
|
||||
};
|
||||
|
||||
@@ -257,6 +259,7 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
|
||||
/* WCH CARDS */
|
||||
{ 0x4348, 0x5053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, wch_ch353_1s1p},
|
||||
{ 0x4348, 0x7053, 0x4348, 0x3253, 0, 0, wch_ch353_2s1p},
|
||||
{ 0x1c00, 0x3250, 0x1c00, 0x3250, 0, 0, wch_ch382_2s1p},
|
||||
|
||||
/*
|
||||
* More SUNIX variations. At least one of these has part number
|
||||
@@ -494,6 +497,13 @@ static struct pciserial_board pci_parport_serial_boards[] = {
|
||||
.base_baud = 115200,
|
||||
.uart_offset = 8,
|
||||
},
|
||||
[wch_ch382_2s1p] = {
|
||||
.flags = FL_BASE0,
|
||||
.num_ports = 2,
|
||||
.base_baud = 115200,
|
||||
.uart_offset = 8,
|
||||
.first_offset = 0xC0,
|
||||
},
|
||||
[sunix_2s1p] = {
|
||||
.flags = FL_BASE0|FL_BASE_BARS,
|
||||
.num_ports = 2,
|
||||
|
||||
@@ -309,8 +309,8 @@ static int __init ehv_bc_console_init(void)
|
||||
* handle for udbg.
|
||||
*/
|
||||
if (stdout_bc != CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE)
|
||||
pr_warning("ehv-bc: udbg handle %u is not the stdout handle\n",
|
||||
CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE);
|
||||
pr_warn("ehv-bc: udbg handle %u is not the stdout handle\n",
|
||||
CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE);
|
||||
#endif
|
||||
|
||||
/* add_preferred_console() must be called before register_console(),
|
||||
|
||||
@@ -155,9 +155,9 @@ static struct tty_driver *goldfish_tty_console_device(struct console *c,
|
||||
|
||||
static int goldfish_tty_console_setup(struct console *co, char *options)
|
||||
{
|
||||
if ((unsigned)co->index > goldfish_tty_line_count)
|
||||
if ((unsigned)co->index >= goldfish_tty_line_count)
|
||||
return -ENODEV;
|
||||
if (goldfish_ttys[co->index].base == 0)
|
||||
if (!goldfish_ttys[co->index].base)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
@@ -317,7 +317,7 @@ static int goldfish_tty_remove(struct platform_device *pdev)
|
||||
unregister_console(&qtty->console);
|
||||
tty_unregister_device(goldfish_tty_driver, pdev->id);
|
||||
iounmap(qtty->base);
|
||||
qtty->base = 0;
|
||||
qtty->base = NULL;
|
||||
free_irq(qtty->irq, pdev);
|
||||
goldfish_tty_current_line_count--;
|
||||
if (goldfish_tty_current_line_count == 0)
|
||||
|
||||
@@ -1575,7 +1575,7 @@ static int __init hvcs_module_init(void)
|
||||
*/
|
||||
rc = driver_create_file(&(hvcs_vio_driver.driver), &driver_attr_rescan);
|
||||
if (rc)
|
||||
pr_warning(KERN_ERR "HVCS: Failed to create rescan file (err %d)\n", rc);
|
||||
pr_warning("HVCS: Failed to create rescan file (err %d)\n", rc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -405,8 +405,7 @@ void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp)
|
||||
hvsi_send_close(pv);
|
||||
}
|
||||
|
||||
if (pv->tty)
|
||||
tty_kref_put(pv->tty);
|
||||
tty_kref_put(pv->tty);
|
||||
pv->tty = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -378,9 +378,9 @@ static void swap_packet_bitfield_to_le(unsigned char *data)
|
||||
/*
|
||||
* transform bits from aa.bbb.ccc to ccc.bbb.aa
|
||||
*/
|
||||
ret |= tmp & 0xc0 >> 6;
|
||||
ret |= tmp & 0x38 >> 1;
|
||||
ret |= tmp & 0x07 << 5;
|
||||
ret |= (tmp & 0xc0) >> 6;
|
||||
ret |= (tmp & 0x38) >> 1;
|
||||
ret |= (tmp & 0x07) << 5;
|
||||
*data = ret & 0xff;
|
||||
#endif
|
||||
}
|
||||
@@ -393,9 +393,9 @@ static void swap_packet_bitfield_from_le(unsigned char *data)
|
||||
/*
|
||||
* transform bits from ccc.bbb.aa to aa.bbb.ccc
|
||||
*/
|
||||
ret |= tmp & 0xe0 >> 5;
|
||||
ret |= tmp & 0x1c << 1;
|
||||
ret |= tmp & 0x03 << 6;
|
||||
ret |= (tmp & 0xe0) >> 5;
|
||||
ret |= (tmp & 0x1c) << 1;
|
||||
ret |= (tmp & 0x03) << 6;
|
||||
*data = ret & 0xff;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -249,7 +249,7 @@ static int lock_card(struct isi_board *card)
|
||||
spin_unlock_irqrestore(&card->card_lock, card->flags);
|
||||
msleep(10);
|
||||
}
|
||||
pr_warning("Failed to lock Card (0x%lx)\n", card->base);
|
||||
pr_warn("Failed to lock Card (0x%lx)\n", card->base);
|
||||
|
||||
return 0; /* Failed to acquire the card! */
|
||||
}
|
||||
@@ -378,13 +378,13 @@ static inline int __isicom_paranoia_check(struct isi_port const *port,
|
||||
char *name, const char *routine)
|
||||
{
|
||||
if (!port) {
|
||||
pr_warning("Warning: bad isicom magic for dev %s in %s.\n",
|
||||
name, routine);
|
||||
pr_warn("Warning: bad isicom magic for dev %s in %s\n",
|
||||
name, routine);
|
||||
return 1;
|
||||
}
|
||||
if (port->magic != ISICOM_MAGIC) {
|
||||
pr_warning("Warning: NULL isicom port for dev %s in %s.\n",
|
||||
name, routine);
|
||||
pr_warn("Warning: NULL isicom port for dev %s in %s\n",
|
||||
name, routine);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -546,8 +546,8 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
|
||||
byte_count = header & 0xff;
|
||||
|
||||
if (channel + 1 > card->port_count) {
|
||||
pr_warning("%s(0x%lx): %d(channel) > port_count.\n",
|
||||
__func__, base, channel+1);
|
||||
pr_warn("%s(0x%lx): %d(channel) > port_count\n",
|
||||
__func__, base, channel + 1);
|
||||
outw(0x0000, base+0x04); /* enable interrupts */
|
||||
spin_unlock(&card->card_lock);
|
||||
return IRQ_HANDLED;
|
||||
|
||||
+38
-45
@@ -321,7 +321,8 @@ static void n_tty_check_unthrottle(struct tty_struct *tty)
|
||||
|
||||
static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
|
||||
{
|
||||
*read_buf_addr(ldata, ldata->read_head++) = c;
|
||||
*read_buf_addr(ldata, ldata->read_head) = c;
|
||||
ldata->read_head++;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -351,13 +352,13 @@ static void n_tty_packet_mode_flush(struct tty_struct *tty)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
if (tty->link->packet) {
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
tty->ctrl_status |= TIOCPKT_FLUSHREAD;
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
if (waitqueue_active(&tty->link->read_wait))
|
||||
wake_up_interruptible(&tty->link->read_wait);
|
||||
}
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2128,7 +2129,6 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
|
||||
int minimum, time;
|
||||
ssize_t retval = 0;
|
||||
long timeout;
|
||||
unsigned long flags;
|
||||
int packet;
|
||||
|
||||
c = job_control(tty, file);
|
||||
@@ -2174,10 +2174,10 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
|
||||
unsigned char cs;
|
||||
if (b != buf)
|
||||
break;
|
||||
spin_lock_irqsave(&tty->link->ctrl_lock, flags);
|
||||
spin_lock_irq(&tty->link->ctrl_lock);
|
||||
cs = tty->link->ctrl_status;
|
||||
tty->link->ctrl_status = 0;
|
||||
spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
|
||||
spin_unlock_irq(&tty->link->ctrl_lock);
|
||||
if (tty_put_user(tty, cs, b++)) {
|
||||
retval = -EFAULT;
|
||||
b--;
|
||||
@@ -2193,45 +2193,29 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
|
||||
|
||||
if (!input_available_p(tty, 0)) {
|
||||
if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
|
||||
up_read(&tty->termios_rwsem);
|
||||
tty_flush_to_ldisc(tty);
|
||||
down_read(&tty->termios_rwsem);
|
||||
if (!input_available_p(tty, 0)) {
|
||||
retval = -EIO;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (tty_hung_up_p(file))
|
||||
break;
|
||||
if (!timeout)
|
||||
break;
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
n_tty_set_room(tty);
|
||||
up_read(&tty->termios_rwsem);
|
||||
|
||||
timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,
|
||||
timeout);
|
||||
|
||||
down_read(&tty->termios_rwsem);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Deal with packet mode. */
|
||||
if (packet && b == buf) {
|
||||
if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
|
||||
retval = -EFAULT;
|
||||
b--;
|
||||
retval = -EIO;
|
||||
break;
|
||||
}
|
||||
nr--;
|
||||
if (tty_hung_up_p(file))
|
||||
break;
|
||||
if (!timeout)
|
||||
break;
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
n_tty_set_room(tty);
|
||||
up_read(&tty->termios_rwsem);
|
||||
|
||||
timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,
|
||||
timeout);
|
||||
|
||||
down_read(&tty->termios_rwsem);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ldata->icanon && !L_EXTPROC(tty)) {
|
||||
@@ -2243,8 +2227,17 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
|
||||
break;
|
||||
} else {
|
||||
int uncopied;
|
||||
/* The copy function takes the read lock and handles
|
||||
locking internally for this case */
|
||||
|
||||
/* Deal with packet mode. */
|
||||
if (packet && b == buf) {
|
||||
if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
|
||||
retval = -EFAULT;
|
||||
b--;
|
||||
break;
|
||||
}
|
||||
nr--;
|
||||
}
|
||||
|
||||
uncopied = copy_from_read_buf(tty, &b, &nr);
|
||||
uncopied += copy_from_read_buf(tty, &b, &nr);
|
||||
if (uncopied) {
|
||||
|
||||
+52
-35
@@ -47,10 +47,13 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
|
||||
set_bit(TTY_IO_ERROR, &tty->flags);
|
||||
wake_up_interruptible(&tty->read_wait);
|
||||
wake_up_interruptible(&tty->write_wait);
|
||||
spin_lock_irq(&tty->ctrl_lock);
|
||||
tty->packet = 0;
|
||||
spin_unlock_irq(&tty->ctrl_lock);
|
||||
/* Review - krefs on tty_link ?? */
|
||||
if (!tty->link)
|
||||
return;
|
||||
tty_flush_to_ldisc(tty->link);
|
||||
set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
||||
wake_up_interruptible(&tty->link->read_wait);
|
||||
wake_up_interruptible(&tty->link->write_wait);
|
||||
@@ -64,9 +67,7 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
|
||||
mutex_unlock(&devpts_mutex);
|
||||
}
|
||||
#endif
|
||||
tty_unlock(tty);
|
||||
tty_vhangup(tty->link);
|
||||
tty_lock(tty);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,21 +179,21 @@ static int pty_get_lock(struct tty_struct *tty, int __user *arg)
|
||||
/* Set the packet mode on a pty */
|
||||
static int pty_set_pktmode(struct tty_struct *tty, int __user *arg)
|
||||
{
|
||||
unsigned long flags;
|
||||
int pktmode;
|
||||
|
||||
if (get_user(pktmode, arg))
|
||||
return -EFAULT;
|
||||
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
spin_lock_irq(&tty->ctrl_lock);
|
||||
if (pktmode) {
|
||||
if (!tty->packet) {
|
||||
tty->packet = 1;
|
||||
tty->link->ctrl_status = 0;
|
||||
smp_mb();
|
||||
tty->packet = 1;
|
||||
}
|
||||
} else
|
||||
tty->packet = 0;
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
spin_unlock_irq(&tty->ctrl_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -207,15 +208,12 @@ static int pty_get_pktmode(struct tty_struct *tty, int __user *arg)
|
||||
/* Send a signal to the slave */
|
||||
static int pty_signal(struct tty_struct *tty, int sig)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct pid *pgrp;
|
||||
|
||||
if (tty->link) {
|
||||
spin_lock_irqsave(&tty->link->ctrl_lock, flags);
|
||||
pgrp = get_pid(tty->link->pgrp);
|
||||
spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
|
||||
|
||||
kill_pgrp(pgrp, sig, 1);
|
||||
pgrp = tty_get_pgrp(tty->link);
|
||||
if (pgrp)
|
||||
kill_pgrp(pgrp, sig, 1);
|
||||
put_pid(pgrp);
|
||||
}
|
||||
return 0;
|
||||
@@ -224,16 +222,15 @@ static int pty_signal(struct tty_struct *tty, int sig)
|
||||
static void pty_flush_buffer(struct tty_struct *tty)
|
||||
{
|
||||
struct tty_struct *to = tty->link;
|
||||
unsigned long flags;
|
||||
|
||||
if (!to)
|
||||
return;
|
||||
/* tty_buffer_flush(to); FIXME */
|
||||
if (to->packet) {
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
spin_lock_irq(&tty->ctrl_lock);
|
||||
tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
|
||||
wake_up_interruptible(&to->read_wait);
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
spin_unlock_irq(&tty->ctrl_lock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,6 +259,32 @@ out:
|
||||
static void pty_set_termios(struct tty_struct *tty,
|
||||
struct ktermios *old_termios)
|
||||
{
|
||||
/* See if packet mode change of state. */
|
||||
if (tty->link && tty->link->packet) {
|
||||
int extproc = (old_termios->c_lflag & EXTPROC) |
|
||||
(tty->termios.c_lflag & EXTPROC);
|
||||
int old_flow = ((old_termios->c_iflag & IXON) &&
|
||||
(old_termios->c_cc[VSTOP] == '\023') &&
|
||||
(old_termios->c_cc[VSTART] == '\021'));
|
||||
int new_flow = (I_IXON(tty) &&
|
||||
STOP_CHAR(tty) == '\023' &&
|
||||
START_CHAR(tty) == '\021');
|
||||
if ((old_flow != new_flow) || extproc) {
|
||||
spin_lock_irq(&tty->ctrl_lock);
|
||||
if (old_flow != new_flow) {
|
||||
tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
|
||||
if (new_flow)
|
||||
tty->ctrl_status |= TIOCPKT_DOSTOP;
|
||||
else
|
||||
tty->ctrl_status |= TIOCPKT_NOSTOP;
|
||||
}
|
||||
if (extproc)
|
||||
tty->ctrl_status |= TIOCPKT_IOCTL;
|
||||
spin_unlock_irq(&tty->ctrl_lock);
|
||||
wake_up_interruptible(&tty->link->read_wait);
|
||||
}
|
||||
}
|
||||
|
||||
tty->termios.c_cflag &= ~(CSIZE | PARENB);
|
||||
tty->termios.c_cflag |= (CS8 | CREAD);
|
||||
}
|
||||
@@ -278,7 +301,6 @@ static void pty_set_termios(struct tty_struct *tty,
|
||||
static int pty_resize(struct tty_struct *tty, struct winsize *ws)
|
||||
{
|
||||
struct pid *pgrp, *rpgrp;
|
||||
unsigned long flags;
|
||||
struct tty_struct *pty = tty->link;
|
||||
|
||||
/* For a PTY we need to lock the tty side */
|
||||
@@ -286,17 +308,9 @@ static int pty_resize(struct tty_struct *tty, struct winsize *ws)
|
||||
if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
|
||||
goto done;
|
||||
|
||||
/* Get the PID values and reference them so we can
|
||||
avoid holding the tty ctrl lock while sending signals.
|
||||
We need to lock these individually however. */
|
||||
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
pgrp = get_pid(tty->pgrp);
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
|
||||
spin_lock_irqsave(&pty->ctrl_lock, flags);
|
||||
rpgrp = get_pid(pty->pgrp);
|
||||
spin_unlock_irqrestore(&pty->ctrl_lock, flags);
|
||||
/* Signal the foreground process group of both ptys */
|
||||
pgrp = tty_get_pgrp(tty);
|
||||
rpgrp = tty_get_pgrp(pty);
|
||||
|
||||
if (pgrp)
|
||||
kill_pgrp(pgrp, SIGWINCH, 1);
|
||||
@@ -327,26 +341,26 @@ static void pty_start(struct tty_struct *tty)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
if (tty->link && tty->link->packet) {
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
tty->ctrl_status &= ~TIOCPKT_STOP;
|
||||
tty->ctrl_status |= TIOCPKT_START;
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
|
||||
}
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
}
|
||||
|
||||
static void pty_stop(struct tty_struct *tty)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
if (tty->link && tty->link->packet) {
|
||||
spin_lock_irqsave(&tty->ctrl_lock, flags);
|
||||
tty->ctrl_status &= ~TIOCPKT_START;
|
||||
tty->ctrl_status |= TIOCPKT_STOP;
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
|
||||
}
|
||||
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -368,6 +382,10 @@ static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
|
||||
int idx = tty->index;
|
||||
int retval = -ENOMEM;
|
||||
|
||||
/* Opening the slave first has always returned -EIO */
|
||||
if (driver->subtype != PTY_TYPE_MASTER)
|
||||
return -EIO;
|
||||
|
||||
ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
|
||||
ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
|
||||
if (!ports[0] || !ports[1])
|
||||
@@ -380,6 +398,8 @@ static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
|
||||
if (!o_tty)
|
||||
goto err_put_module;
|
||||
|
||||
tty_set_lock_subclass(o_tty);
|
||||
|
||||
if (legacy) {
|
||||
/* We always use new tty termios data so we can do this
|
||||
the easy way .. */
|
||||
@@ -404,8 +424,6 @@ static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
|
||||
* Everything allocated ... set up the o_tty structure.
|
||||
*/
|
||||
tty_driver_kref_get(driver->other);
|
||||
if (driver->subtype == PTY_TYPE_MASTER)
|
||||
o_tty->count++;
|
||||
/* Establish the links in both directions */
|
||||
tty->link = o_tty;
|
||||
o_tty->link = tty;
|
||||
@@ -417,6 +435,7 @@ static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
|
||||
|
||||
tty_driver_kref_get(driver);
|
||||
tty->count++;
|
||||
o_tty->count++;
|
||||
return 0;
|
||||
err_free_termios:
|
||||
if (legacy)
|
||||
@@ -489,7 +508,6 @@ static const struct tty_operations master_pty_ops_bsd = {
|
||||
.flush_buffer = pty_flush_buffer,
|
||||
.chars_in_buffer = pty_chars_in_buffer,
|
||||
.unthrottle = pty_unthrottle,
|
||||
.set_termios = pty_set_termios,
|
||||
.ioctl = pty_bsd_ioctl,
|
||||
.cleanup = pty_cleanup,
|
||||
.resize = pty_resize,
|
||||
@@ -666,7 +684,6 @@ static const struct tty_operations ptm_unix98_ops = {
|
||||
.flush_buffer = pty_flush_buffer,
|
||||
.chars_in_buffer = pty_chars_in_buffer,
|
||||
.unthrottle = pty_unthrottle,
|
||||
.set_termios = pty_set_termios,
|
||||
.ioctl = pty_unix98_ioctl,
|
||||
.resize = pty_resize,
|
||||
.shutdown = pty_unix98_shutdown,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user