From 6576006c3ef50daa454fba4039b940e60e34dc87 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 7 Jul 2014 13:58:21 -0700 Subject: [PATCH] 3.14-stable patches added patches: brcmfmac-fix-brcmf_chip_ai_coredisable-not-applying-reset.patch clk-qcom-fix-clk_rcg2_is_enabled-check.patch clk-qcom-fix-mmcc-8974-s-pll-configurations.patch netfilter-nf_nat-fix-oops-on-netns-removal.patch serial-fix-ignbrk-handling.patch tty-correct-inpck-handling.patch --- ...ip_ai_coredisable-not-applying-reset.patch | 61 +++ ...k-qcom-fix-clk_rcg2_is_enabled-check.patch | 32 ++ ...m-fix-mmcc-8974-s-pll-configurations.patch | 83 +++ ...ter-nf_nat-fix-oops-on-netns-removal.patch | 96 ++++ queue-3.14/serial-fix-ignbrk-handling.patch | 515 ++++++++++++++++++ queue-3.14/series | 6 + queue-3.14/tty-correct-inpck-handling.patch | 63 +++ 7 files changed, 856 insertions(+) create mode 100644 queue-3.14/brcmfmac-fix-brcmf_chip_ai_coredisable-not-applying-reset.patch create mode 100644 queue-3.14/clk-qcom-fix-clk_rcg2_is_enabled-check.patch create mode 100644 queue-3.14/clk-qcom-fix-mmcc-8974-s-pll-configurations.patch create mode 100644 queue-3.14/netfilter-nf_nat-fix-oops-on-netns-removal.patch create mode 100644 queue-3.14/serial-fix-ignbrk-handling.patch create mode 100644 queue-3.14/tty-correct-inpck-handling.patch diff --git a/queue-3.14/brcmfmac-fix-brcmf_chip_ai_coredisable-not-applying-reset.patch b/queue-3.14/brcmfmac-fix-brcmf_chip_ai_coredisable-not-applying-reset.patch new file mode 100644 index 00000000000..95f087f1a5b --- /dev/null +++ b/queue-3.14/brcmfmac-fix-brcmf_chip_ai_coredisable-not-applying-reset.patch @@ -0,0 +1,61 @@ +From ffa216bb5eecfce0f01b0b2a95d5c320dde90005 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 23 Apr 2014 12:20:55 +0200 +Subject: brcmfmac: Fix brcmf_chip_ai_coredisable not applying reset + bits to BCMA_IOCTL + +From: Hans de Goede + +commit ffa216bb5eecfce0f01b0b2a95d5c320dde90005 upstream. + +brcmfmac has been broken on my cubietruck with a BCM43362: + +brcmfmac: brcmf_chip_recognition: found AXI chip: BCM43362, rev=1 +brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: + Apr 22 2013 14:50:00 version 5.90.195.89.6 FWID 01-b30a427d + +since commit 53036261033: "brcmfmac: update core reset and disable routines". + +The problem is that since this commit brcmf_chip_ai_resetcore no longer sets +BCMA_IOCTL itself before bringing the core out of reset, instead relying on +brcmf_chip_ai_coredisable to do so. But brcmf_chip_ai_coredisable is a nop +of the chip is already in reset. This patch modifies brcmf_chip_ai_coredisable +to always set BCMA_IOCTL even if the core is already in reset. + +This fixes brcmfmac hanging in firmware loading on my board. + +Cc: stable@vger.kernel.org # v3.14 +Signed-off-by: Hans de Goede +Acked-by: Arend van Spriel +Signed-off-by: John W. Linville +[arend@broadcom.com: rebase patch on linux-3.14.y branch] +Signed-off-by: Arend van Spriel +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c ++++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c +@@ -300,10 +300,10 @@ brcmf_sdio_ai_coredisable(struct brcmf_s + + wrapbase = ci->c_inf[idx].wrapbase; + +- /* if core is already in reset, just return */ ++ /* if core is already in reset, skip reset */ + regdata = brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_RESET_CTL, NULL); + if ((regdata & BCMA_RESET_CTL_RESET) != 0) +- return; ++ goto post_reset_config; + + /* configure reset */ + brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_IOCTL, pre_resetbits | +@@ -319,6 +319,7 @@ brcmf_sdio_ai_coredisable(struct brcmf_s + SPINWAIT(brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_RESET_CTL, NULL) != + BCMA_RESET_CTL_RESET, 300); + ++post_reset_config: + /* post reset configure */ + brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_IOCTL, pre_resetbits | + BCMA_IOCTL_FGC | BCMA_IOCTL_CLK, NULL); diff --git a/queue-3.14/clk-qcom-fix-clk_rcg2_is_enabled-check.patch b/queue-3.14/clk-qcom-fix-clk_rcg2_is_enabled-check.patch new file mode 100644 index 00000000000..a9dca4309b0 --- /dev/null +++ b/queue-3.14/clk-qcom-fix-clk_rcg2_is_enabled-check.patch @@ -0,0 +1,32 @@ +From aa014149ba002155a084ec1e9328e95b70167cbb Mon Sep 17 00:00:00 2001 +From: Stephen Boyd +Date: Fri, 16 May 2014 16:07:08 -0700 +Subject: clk: qcom: Fix clk_rcg2_is_enabled() check + +From: Stephen Boyd + +commit aa014149ba002155a084ec1e9328e95b70167cbb upstream. + +If the bit is set the clock is off so we should be checking for +a clear bit, not a set bit. Invert the logic. + +Fixes: bcd61c0f535a (clk: qcom: Add support for root clock generators (RCGs)) +Signed-off-by: Stephen Boyd +Signed-off-by: Mike Turquette +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/qcom/clk-rcg2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/clk/qcom/clk-rcg2.c ++++ b/drivers/clk/qcom/clk-rcg2.c +@@ -55,7 +55,7 @@ static int clk_rcg2_is_enabled(struct cl + if (ret) + return ret; + +- return (cmd & CMD_ROOT_OFF) != 0; ++ return (cmd & CMD_ROOT_OFF) == 0; + } + + static u8 clk_rcg2_get_parent(struct clk_hw *hw) diff --git a/queue-3.14/clk-qcom-fix-mmcc-8974-s-pll-configurations.patch b/queue-3.14/clk-qcom-fix-mmcc-8974-s-pll-configurations.patch new file mode 100644 index 00000000000..618a4e53db9 --- /dev/null +++ b/queue-3.14/clk-qcom-fix-mmcc-8974-s-pll-configurations.patch @@ -0,0 +1,83 @@ +From 437ae6a1b8f2eedebfbf0f6572e19ca5c58a3f71 Mon Sep 17 00:00:00 2001 +From: Stephen Boyd +Date: Fri, 16 May 2014 16:07:09 -0700 +Subject: clk: qcom: Fix mmcc-8974's PLL configurations + +From: Stephen Boyd + +commit 437ae6a1b8f2eedebfbf0f6572e19ca5c58a3f71 upstream. + +We forgot to add the status bit for the PLLs and we were using +the wrong register and masks for configuration, leading to +unexpected PLL configurations. Fix this. + +Fixes: d8b212014e69 (clk: qcom: Add support for MSM8974's multimedia clock controller (MMCC)) +Signed-off-by: Stephen Boyd +Signed-off-by: Mike Turquette +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/qcom/mmcc-msm8974.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +--- a/drivers/clk/qcom/mmcc-msm8974.c ++++ b/drivers/clk/qcom/mmcc-msm8974.c +@@ -169,6 +169,7 @@ static struct clk_pll mmpll0 = { + .config_reg = 0x0014, + .mode_reg = 0x0000, + .status_reg = 0x001c, ++ .status_bit = 17, + .clkr.hw.init = &(struct clk_init_data){ + .name = "mmpll0", + .parent_names = (const char *[]){ "xo" }, +@@ -192,9 +193,10 @@ static struct clk_pll mmpll1 = { + .l_reg = 0x0044, + .m_reg = 0x0048, + .n_reg = 0x004c, +- .config_reg = 0x0054, ++ .config_reg = 0x0050, + .mode_reg = 0x0040, + .status_reg = 0x005c, ++ .status_bit = 17, + .clkr.hw.init = &(struct clk_init_data){ + .name = "mmpll1", + .parent_names = (const char *[]){ "xo" }, +@@ -218,7 +220,7 @@ static struct clk_pll mmpll2 = { + .l_reg = 0x4104, + .m_reg = 0x4108, + .n_reg = 0x410c, +- .config_reg = 0x4114, ++ .config_reg = 0x4110, + .mode_reg = 0x4100, + .status_reg = 0x411c, + .clkr.hw.init = &(struct clk_init_data){ +@@ -233,9 +235,10 @@ static struct clk_pll mmpll3 = { + .l_reg = 0x0084, + .m_reg = 0x0088, + .n_reg = 0x008c, +- .config_reg = 0x0094, ++ .config_reg = 0x0090, + .mode_reg = 0x0080, + .status_reg = 0x009c, ++ .status_bit = 17, + .clkr.hw.init = &(struct clk_init_data){ + .name = "mmpll3", + .parent_names = (const char *[]){ "xo" }, +@@ -2318,7 +2321,7 @@ static const struct pll_config mmpll1_co + .vco_val = 0x0, + .vco_mask = 0x3 << 20, + .pre_div_val = 0x0, +- .pre_div_mask = 0x3 << 12, ++ .pre_div_mask = 0x7 << 12, + .post_div_val = 0x0, + .post_div_mask = 0x3 << 8, + .mn_ena_mask = BIT(24), +@@ -2332,7 +2335,7 @@ static struct pll_config mmpll3_config = + .vco_val = 0x0, + .vco_mask = 0x3 << 20, + .pre_div_val = 0x0, +- .pre_div_mask = 0x3 << 12, ++ .pre_div_mask = 0x7 << 12, + .post_div_val = 0x0, + .post_div_mask = 0x3 << 8, + .mn_ena_mask = BIT(24), diff --git a/queue-3.14/netfilter-nf_nat-fix-oops-on-netns-removal.patch b/queue-3.14/netfilter-nf_nat-fix-oops-on-netns-removal.patch new file mode 100644 index 00000000000..93a1ec8a03b --- /dev/null +++ b/queue-3.14/netfilter-nf_nat-fix-oops-on-netns-removal.patch @@ -0,0 +1,96 @@ +From 945b2b2d259d1a4364a2799e80e8ff32f8c6ee6f Mon Sep 17 00:00:00 2001 +From: Florian Westphal +Date: Sat, 7 Jun 2014 21:17:04 +0200 +Subject: netfilter: nf_nat: fix oops on netns removal + +From: Florian Westphal + +commit 945b2b2d259d1a4364a2799e80e8ff32f8c6ee6f upstream. + +Quoting Samu Kallio: + + Basically what's happening is, during netns cleanup, + nf_nat_net_exit gets called before ipv4_net_exit. As I understand + it, nf_nat_net_exit is supposed to kill any conntrack entries which + have NAT context (through nf_ct_iterate_cleanup), but for some + reason this doesn't happen (perhaps something else is still holding + refs to those entries?). + + When ipv4_net_exit is called, conntrack entries (including those + with NAT context) are cleaned up, but the + nat_bysource hashtable is long gone - freed in nf_nat_net_exit. The + bug happens when attempting to free a conntrack entry whose NAT hash + 'prev' field points to a slot in the freed hash table (head for that + bin). + +We ignore conntracks with null nat bindings. But this is wrong, +as these are in bysource hash table as well. + +Restore nat-cleaning for the netns-is-being-removed case. + +bug: +https://bugzilla.kernel.org/show_bug.cgi?id=65191 + +Fixes: c2d421e1718 ('netfilter: nf_nat: fix race when unloading protocol modules') +Reported-by: Samu Kallio +Debugged-by: Samu Kallio +Signed-off-by: Florian Westphal +Tested-by: Samu Kallio +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Greg Kroah-Hartman + +--- + net/netfilter/nf_nat_core.c | 35 ++++++++++++++++++++++++++++++++++- + 1 file changed, 34 insertions(+), 1 deletion(-) + +--- a/net/netfilter/nf_nat_core.c ++++ b/net/netfilter/nf_nat_core.c +@@ -517,6 +517,39 @@ static int nf_nat_proto_remove(struct nf + return i->status & IPS_NAT_MASK ? 1 : 0; + } + ++static int nf_nat_proto_clean(struct nf_conn *ct, void *data) ++{ ++ struct nf_conn_nat *nat = nfct_nat(ct); ++ ++ if (nf_nat_proto_remove(ct, data)) ++ return 1; ++ ++ if (!nat || !nat->ct) ++ return 0; ++ ++ /* This netns is being destroyed, and conntrack has nat null binding. ++ * Remove it from bysource hash, as the table will be freed soon. ++ * ++ * Else, when the conntrack is destoyed, nf_nat_cleanup_conntrack() ++ * will delete entry from already-freed table. ++ */ ++ if (!del_timer(&ct->timeout)) ++ return 1; ++ ++ spin_lock_bh(&nf_nat_lock); ++ hlist_del_rcu(&nat->bysource); ++ ct->status &= ~IPS_NAT_DONE_MASK; ++ nat->ct = NULL; ++ spin_unlock_bh(&nf_nat_lock); ++ ++ add_timer(&ct->timeout); ++ ++ /* don't delete conntrack. Although that would make things a lot ++ * simpler, we'd end up flushing all conntracks on nat rmmod. ++ */ ++ return 0; ++} ++ + static void nf_nat_l4proto_clean(u8 l3proto, u8 l4proto) + { + struct nf_nat_proto_clean clean = { +@@ -787,7 +820,7 @@ static void __net_exit nf_nat_net_exit(s + { + struct nf_nat_proto_clean clean = {}; + +- nf_ct_iterate_cleanup(net, &nf_nat_proto_remove, &clean, 0, 0); ++ nf_ct_iterate_cleanup(net, nf_nat_proto_clean, &clean, 0, 0); + synchronize_rcu(); + nf_ct_free_hashtable(net->ct.nat_bysource, net->ct.nat_htable_size); + } diff --git a/queue-3.14/serial-fix-ignbrk-handling.patch b/queue-3.14/serial-fix-ignbrk-handling.patch new file mode 100644 index 00000000000..0c6de0bd2a3 --- /dev/null +++ b/queue-3.14/serial-fix-ignbrk-handling.patch @@ -0,0 +1,515 @@ +From ef8b9ddcb45fa3b1e11acd72be2398001e807d14 Mon Sep 17 00:00:00 2001 +From: Peter Hurley +Date: Mon, 16 Jun 2014 08:10:41 -0400 +Subject: serial: Fix IGNBRK handling + +From: Peter Hurley + +commit ef8b9ddcb45fa3b1e11acd72be2398001e807d14 upstream. + +If IGNBRK is set without either BRKINT or PARMRK set, some uart +drivers send a 0x00 byte for BREAK without the TTYBREAK flag to the +line discipline, when it should send either nothing or the TTYBREAK flag +set. This happens because the read_status_mask masks out the BI +condition, which uart_insert_char() then interprets as a normal 0x00 byte. + +SUS v3 is clear regarding the meaning of IGNBRK; Section 11.2.2, General +Terminal Interface - Input Modes, states: + "If IGNBRK is set, a break condition detected on input shall be ignored; + that is, not put on the input queue and therefore not read by any + process." + +Fix read_status_mask to include the BI bit if IGNBRK is set; the +lsr status retains the BI bit if a BREAK is recv'd, which is +subsequently ignored in uart_insert_char() when masked with the +ignore_status_mask. + +Affected drivers: +8250 - all +serial_txx9 +mfd +amba-pl010 +amba-pl011 +atmel_serial +bfin_uart +dz +ip22zilog +max310x +mxs-auart +netx-serial +pnx8xxx_uart +pxa +sb1250-duart +sccnxp +serial_ks8695 +sirfsoc_uart +st-asc +vr41xx_siu +zs +sunzilog +fsl_lpuart +sunsab +ucc_uart +bcm63xx_uart +sunsu +efm32-uart +pmac_zilog +mpsc +msm_serial +m32r_sio + +Unaffected drivers: +omap-serial +rp2 +sa1100 +imx +icom + +Annotated for fixes: +altera_uart +mcf + +Drivers without break detection: +21285 +xilinx-uartps +altera_jtaguart +apbuart +arc-uart +clps711x +max3100 +uartlite +msm_serial_hs +nwpserial +lantiq +vt8500_serial + +Unknown: +samsung +mpc52xx_uart +bfin_sport_uart +cpm_uart/core + +Fixes: Bugzilla #71651, '8250_core.c incorrectly handles IGNBRK flag' +Reported-by: Ivan +Signed-off-by: Peter Hurley +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/tty/serial/8250/8250_core.c | 2 +- + drivers/tty/serial/altera_uart.c | 6 ++++++ + drivers/tty/serial/amba-pl010.c | 2 +- + drivers/tty/serial/amba-pl011.c | 2 +- + drivers/tty/serial/atmel_serial.c | 2 +- + drivers/tty/serial/bcm63xx_uart.c | 2 +- + drivers/tty/serial/bfin_uart.c | 2 +- + drivers/tty/serial/dz.c | 2 +- + drivers/tty/serial/efm32-uart.c | 2 +- + drivers/tty/serial/fsl_lpuart.c | 2 +- + drivers/tty/serial/ip22zilog.c | 2 +- + drivers/tty/serial/m32r_sio.c | 2 +- + drivers/tty/serial/max310x.c | 2 +- + drivers/tty/serial/mcf.c | 6 ++++++ + drivers/tty/serial/mfd.c | 2 +- + drivers/tty/serial/mpsc.c | 2 +- + drivers/tty/serial/msm_serial.c | 2 +- + drivers/tty/serial/mxs-auart.c | 2 +- + drivers/tty/serial/netx-serial.c | 2 +- + drivers/tty/serial/pmac_zilog.c | 2 +- + drivers/tty/serial/pnx8xxx_uart.c | 2 +- + drivers/tty/serial/pxa.c | 2 +- + drivers/tty/serial/sb1250-duart.c | 2 +- + drivers/tty/serial/sccnxp.c | 2 +- + drivers/tty/serial/serial_ks8695.c | 2 +- + drivers/tty/serial/serial_txx9.c | 2 +- + drivers/tty/serial/sirfsoc_uart.c | 2 +- + drivers/tty/serial/st-asc.c | 2 +- + drivers/tty/serial/sunsab.c | 2 +- + drivers/tty/serial/sunsu.c | 2 +- + drivers/tty/serial/sunzilog.c | 2 +- + drivers/tty/serial/ucc_uart.c | 2 +- + drivers/tty/serial/vr41xx_siu.c | 2 +- + drivers/tty/serial/zs.c | 2 +- + 34 files changed, 44 insertions(+), 32 deletions(-) + +--- a/drivers/tty/serial/8250/8250_core.c ++++ b/drivers/tty/serial/8250/8250_core.c +@@ -2356,7 +2356,7 @@ serial8250_do_set_termios(struct uart_po + port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; + if (termios->c_iflag & INPCK) + port->read_status_mask |= UART_LSR_FE | UART_LSR_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= UART_LSR_BI; + + /* +--- a/drivers/tty/serial/altera_uart.c ++++ b/drivers/tty/serial/altera_uart.c +@@ -185,6 +185,12 @@ static void altera_uart_set_termios(stru + uart_update_timeout(port, termios->c_cflag, baud); + altera_uart_writel(port, baudclk, ALTERA_UART_DIVISOR_REG); + spin_unlock_irqrestore(&port->lock, flags); ++ ++ /* ++ * FIXME: port->read_status_mask and port->ignore_status_mask ++ * need to be initialized based on termios settings for ++ * INPCK, IGNBRK, IGNPAR, PARMRK, BRKINT ++ */ + } + + static void altera_uart_rx_chars(struct altera_uart *pp) +--- a/drivers/tty/serial/amba-pl010.c ++++ b/drivers/tty/serial/amba-pl010.c +@@ -420,7 +420,7 @@ pl010_set_termios(struct uart_port *port + uap->port.read_status_mask = UART01x_RSR_OE; + if (termios->c_iflag & INPCK) + uap->port.read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + uap->port.read_status_mask |= UART01x_RSR_BE; + + /* +--- a/drivers/tty/serial/amba-pl011.c ++++ b/drivers/tty/serial/amba-pl011.c +@@ -1744,7 +1744,7 @@ pl011_set_termios(struct uart_port *port + port->read_status_mask = UART011_DR_OE | 255; + if (termios->c_iflag & INPCK) + port->read_status_mask |= UART011_DR_FE | UART011_DR_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= UART011_DR_BE; + + /* +--- a/drivers/tty/serial/atmel_serial.c ++++ b/drivers/tty/serial/atmel_serial.c +@@ -1811,7 +1811,7 @@ static void atmel_set_termios(struct uar + port->read_status_mask = ATMEL_US_OVRE; + if (termios->c_iflag & INPCK) + port->read_status_mask |= (ATMEL_US_FRAME | ATMEL_US_PARE); +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= ATMEL_US_RXBRK; + + if (atmel_use_pdc_rx(port)) +--- a/drivers/tty/serial/bcm63xx_uart.c ++++ b/drivers/tty/serial/bcm63xx_uart.c +@@ -565,7 +565,7 @@ static void bcm_uart_set_termios(struct + port->read_status_mask |= UART_FIFO_FRAMEERR_MASK; + port->read_status_mask |= UART_FIFO_PARERR_MASK; + } +- if (new->c_iflag & (BRKINT)) ++ if (new->c_iflag & (IGNBRK | BRKINT)) + port->read_status_mask |= UART_FIFO_BRKDET_MASK; + + port->ignore_status_mask = 0; +--- a/drivers/tty/serial/bfin_uart.c ++++ b/drivers/tty/serial/bfin_uart.c +@@ -833,7 +833,7 @@ bfin_serial_set_termios(struct uart_port + port->read_status_mask = OE; + if (termios->c_iflag & INPCK) + port->read_status_mask |= (FE | PE); +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= BI; + + /* +--- a/drivers/tty/serial/dz.c ++++ b/drivers/tty/serial/dz.c +@@ -625,7 +625,7 @@ static void dz_set_termios(struct uart_p + dport->port.read_status_mask = DZ_OERR; + if (termios->c_iflag & INPCK) + dport->port.read_status_mask |= DZ_FERR | DZ_PERR; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + dport->port.read_status_mask |= DZ_BREAK; + + /* characters to ignore */ +--- a/drivers/tty/serial/efm32-uart.c ++++ b/drivers/tty/serial/efm32-uart.c +@@ -407,7 +407,7 @@ static void efm32_uart_set_termios(struc + if (new->c_iflag & INPCK) + port->read_status_mask |= + UARTn_RXDATAX_FERR | UARTn_RXDATAX_PERR; +- if (new->c_iflag & (BRKINT | PARMRK)) ++ if (new->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= SW_UARTn_RXDATAX_BERR; + + port->ignore_status_mask = 0; +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -496,7 +496,7 @@ lpuart_set_termios(struct uart_port *por + sport->port.read_status_mask = 0; + if (termios->c_iflag & INPCK) + sport->port.read_status_mask |= (UARTSR1_FE | UARTSR1_PE); +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + sport->port.read_status_mask |= UARTSR1_FE; + + /* characters to ignore */ +--- a/drivers/tty/serial/ip22zilog.c ++++ b/drivers/tty/serial/ip22zilog.c +@@ -850,7 +850,7 @@ ip22zilog_convert_to_zs(struct uart_ip22 + up->port.read_status_mask = Rx_OVR; + if (iflag & INPCK) + up->port.read_status_mask |= CRC_ERR | PAR_ERR; +- if (iflag & (BRKINT | PARMRK)) ++ if (iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= BRK_ABRT; + + up->port.ignore_status_mask = 0; +--- a/drivers/tty/serial/m32r_sio.c ++++ b/drivers/tty/serial/m32r_sio.c +@@ -737,7 +737,7 @@ static void m32r_sio_set_termios(struct + up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; + if (termios->c_iflag & INPCK) + up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= UART_LSR_BI; + + /* +--- a/drivers/tty/serial/max310x.c ++++ b/drivers/tty/serial/max310x.c +@@ -842,7 +842,7 @@ static void max310x_set_termios(struct u + if (termios->c_iflag & INPCK) + port->read_status_mask |= MAX310X_LSR_RXPAR_BIT | + MAX310X_LSR_FRERR_BIT; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= MAX310X_LSR_RXBRK_BIT; + + /* Set status ignore mask */ +--- a/drivers/tty/serial/mcf.c ++++ b/drivers/tty/serial/mcf.c +@@ -248,6 +248,12 @@ static void mcf_set_termios(struct uart_ + mr1 |= MCFUART_MR1_PARITYNONE; + } + ++ /* ++ * FIXME: port->read_status_mask and port->ignore_status_mask ++ * need to be initialized based on termios settings for ++ * INPCK, IGNBRK, IGNPAR, PARMRK, BRKINT ++ */ ++ + if (termios->c_cflag & CSTOPB) + mr2 |= MCFUART_MR2_STOP2; + else +--- a/drivers/tty/serial/mfd.c ++++ b/drivers/tty/serial/mfd.c +@@ -977,7 +977,7 @@ serial_hsu_set_termios(struct uart_port + up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; + if (termios->c_iflag & INPCK) + up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= UART_LSR_BI; + + /* Characters to ignore */ +--- a/drivers/tty/serial/mpsc.c ++++ b/drivers/tty/serial/mpsc.c +@@ -1458,7 +1458,7 @@ static void mpsc_set_termios(struct uart + pi->port.read_status_mask |= SDMA_DESC_CMDSTAT_PE + | SDMA_DESC_CMDSTAT_FR; + +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + pi->port.read_status_mask |= SDMA_DESC_CMDSTAT_BR; + + /* Characters/events to ignore */ +--- a/drivers/tty/serial/msm_serial.c ++++ b/drivers/tty/serial/msm_serial.c +@@ -570,7 +570,7 @@ static void msm_set_termios(struct uart_ + port->read_status_mask = 0; + if (termios->c_iflag & INPCK) + port->read_status_mask |= UART_SR_PAR_FRAME_ERR; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= UART_SR_RX_BREAK; + + uart_update_timeout(port, termios->c_cflag, baud); +--- a/drivers/tty/serial/mxs-auart.c ++++ b/drivers/tty/serial/mxs-auart.c +@@ -604,7 +604,7 @@ static void mxs_auart_settermios(struct + + if (termios->c_iflag & INPCK) + u->read_status_mask |= AUART_STAT_PERR; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + u->read_status_mask |= AUART_STAT_BERR; + + /* +--- a/drivers/tty/serial/netx-serial.c ++++ b/drivers/tty/serial/netx-serial.c +@@ -419,7 +419,7 @@ netx_set_termios(struct uart_port *port, + } + + port->read_status_mask = 0; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= SR_BE; + if (termios->c_iflag & INPCK) + port->read_status_mask |= SR_PE | SR_FE; +--- a/drivers/tty/serial/pmac_zilog.c ++++ b/drivers/tty/serial/pmac_zilog.c +@@ -1092,7 +1092,7 @@ static void pmz_convert_to_zs(struct uar + uap->port.read_status_mask = Rx_OVR; + if (iflag & INPCK) + uap->port.read_status_mask |= CRC_ERR | PAR_ERR; +- if (iflag & (BRKINT | PARMRK)) ++ if (iflag & (IGNBRK | BRKINT | PARMRK)) + uap->port.read_status_mask |= BRK_ABRT; + + uap->port.ignore_status_mask = 0; +--- a/drivers/tty/serial/pnx8xxx_uart.c ++++ b/drivers/tty/serial/pnx8xxx_uart.c +@@ -477,7 +477,7 @@ pnx8xxx_set_termios(struct uart_port *po + sport->port.read_status_mask |= + FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE) | + FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR); +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + sport->port.read_status_mask |= + ISTAT_TO_SM(PNX8XXX_UART_INT_BREAK); + +--- a/drivers/tty/serial/pxa.c ++++ b/drivers/tty/serial/pxa.c +@@ -492,7 +492,7 @@ serial_pxa_set_termios(struct uart_port + up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; + if (termios->c_iflag & INPCK) + up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= UART_LSR_BI; + + /* +--- a/drivers/tty/serial/sb1250-duart.c ++++ b/drivers/tty/serial/sb1250-duart.c +@@ -596,7 +596,7 @@ static void sbd_set_termios(struct uart_ + if (termios->c_iflag & INPCK) + uport->read_status_mask |= M_DUART_FRM_ERR | + M_DUART_PARITY_ERR; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + uport->read_status_mask |= M_DUART_RCVD_BRK; + + uport->ignore_status_mask = 0; +--- a/drivers/tty/serial/sccnxp.c ++++ b/drivers/tty/serial/sccnxp.c +@@ -667,7 +667,7 @@ static void sccnxp_set_termios(struct ua + port->read_status_mask = SR_OVR; + if (termios->c_iflag & INPCK) + port->read_status_mask |= SR_PE | SR_FE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= SR_BRK; + + /* Set status ignore mask */ +--- a/drivers/tty/serial/serial_ks8695.c ++++ b/drivers/tty/serial/serial_ks8695.c +@@ -437,7 +437,7 @@ static void ks8695uart_set_termios(struc + port->read_status_mask = URLS_URROE; + if (termios->c_iflag & INPCK) + port->read_status_mask |= (URLS_URFE | URLS_URPE); +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= URLS_URBI; + + /* +--- a/drivers/tty/serial/serial_txx9.c ++++ b/drivers/tty/serial/serial_txx9.c +@@ -702,7 +702,7 @@ serial_txx9_set_termios(struct uart_port + TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS; + if (termios->c_iflag & INPCK) + up->port.read_status_mask |= TXX9_SIDISR_UFER | TXX9_SIDISR_UPER; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= TXX9_SIDISR_UBRK; + + /* +--- a/drivers/tty/serial/sirfsoc_uart.c ++++ b/drivers/tty/serial/sirfsoc_uart.c +@@ -908,7 +908,7 @@ static void sirfsoc_uart_set_termios(str + if (termios->c_iflag & INPCK) + port->read_status_mask |= uint_en->sirfsoc_frm_err_en; + } +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= uint_en->sirfsoc_rxd_brk_en; + if (sirfport->uart_reg->uart_type == SIRF_REAL_UART) { + if (termios->c_iflag & IGNPAR) +--- a/drivers/tty/serial/st-asc.c ++++ b/drivers/tty/serial/st-asc.c +@@ -547,7 +547,7 @@ static void asc_set_termios(struct uart_ + ascport->port.read_status_mask = ASC_RXBUF_DUMMY_OE; + if (termios->c_iflag & INPCK) + ascport->port.read_status_mask |= ASC_RXBUF_FE | ASC_RXBUF_PE; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + ascport->port.read_status_mask |= ASC_RXBUF_DUMMY_BE; + + /* +--- a/drivers/tty/serial/sunsab.c ++++ b/drivers/tty/serial/sunsab.c +@@ -719,7 +719,7 @@ static void sunsab_convert_to_sab(struct + if (iflag & INPCK) + up->port.read_status_mask |= (SAB82532_ISR0_PERR | + SAB82532_ISR0_FERR); +- if (iflag & (BRKINT | PARMRK)) ++ if (iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= (SAB82532_ISR1_BRK << 8); + + /* +--- a/drivers/tty/serial/sunsu.c ++++ b/drivers/tty/serial/sunsu.c +@@ -834,7 +834,7 @@ sunsu_change_speed(struct uart_port *por + up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; + if (iflag & INPCK) + up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; +- if (iflag & (BRKINT | PARMRK)) ++ if (iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= UART_LSR_BI; + + /* +--- a/drivers/tty/serial/sunzilog.c ++++ b/drivers/tty/serial/sunzilog.c +@@ -915,7 +915,7 @@ sunzilog_convert_to_zs(struct uart_sunzi + up->port.read_status_mask = Rx_OVR; + if (iflag & INPCK) + up->port.read_status_mask |= CRC_ERR | PAR_ERR; +- if (iflag & (BRKINT | PARMRK)) ++ if (iflag & (IGNBRK | BRKINT | PARMRK)) + up->port.read_status_mask |= BRK_ABRT; + + up->port.ignore_status_mask = 0; +--- a/drivers/tty/serial/ucc_uart.c ++++ b/drivers/tty/serial/ucc_uart.c +@@ -936,7 +936,7 @@ static void qe_uart_set_termios(struct u + port->read_status_mask = BD_SC_EMPTY | BD_SC_OV; + if (termios->c_iflag & INPCK) + port->read_status_mask |= BD_SC_FR | BD_SC_PR; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= BD_SC_BR; + + /* +--- a/drivers/tty/serial/vr41xx_siu.c ++++ b/drivers/tty/serial/vr41xx_siu.c +@@ -559,7 +559,7 @@ static void siu_set_termios(struct uart_ + port->read_status_mask = UART_LSR_THRE | UART_LSR_OE | UART_LSR_DR; + if (c_iflag & INPCK) + port->read_status_mask |= UART_LSR_FE | UART_LSR_PE; +- if (c_iflag & (BRKINT | PARMRK)) ++ if (c_iflag & (IGNBRK | BRKINT | PARMRK)) + port->read_status_mask |= UART_LSR_BI; + + port->ignore_status_mask = 0; +--- a/drivers/tty/serial/zs.c ++++ b/drivers/tty/serial/zs.c +@@ -923,7 +923,7 @@ static void zs_set_termios(struct uart_p + uport->read_status_mask = Rx_OVR; + if (termios->c_iflag & INPCK) + uport->read_status_mask |= FRM_ERR | PAR_ERR; +- if (termios->c_iflag & (BRKINT | PARMRK)) ++ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) + uport->read_status_mask |= Rx_BRK; + + uport->ignore_status_mask = 0; diff --git a/queue-3.14/series b/queue-3.14/series index cd8c70ffa1b..f1dfd4e691c 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -79,3 +79,9 @@ irqchip-spear_shirq-fix-interrupt-offset.patch mm-page_alloc-fix-cma-area-initialisation-when-pageblock-max_order.patch proc-stat-convert-to-single_open_size.patch mlx4_core-fix-incorrect-flags1-bitmap-test-in-mlx4_query_func_cap.patch +clk-qcom-fix-clk_rcg2_is_enabled-check.patch +clk-qcom-fix-mmcc-8974-s-pll-configurations.patch +serial-fix-ignbrk-handling.patch +tty-correct-inpck-handling.patch +netfilter-nf_nat-fix-oops-on-netns-removal.patch +brcmfmac-fix-brcmf_chip_ai_coredisable-not-applying-reset.patch diff --git a/queue-3.14/tty-correct-inpck-handling.patch b/queue-3.14/tty-correct-inpck-handling.patch new file mode 100644 index 00000000000..ad6da0b0fa5 --- /dev/null +++ b/queue-3.14/tty-correct-inpck-handling.patch @@ -0,0 +1,63 @@ +From 66528f90669691c85c73bea4f0c9f4a5857c4cab Mon Sep 17 00:00:00 2001 +From: Peter Hurley +Date: Mon, 16 Jun 2014 08:10:42 -0400 +Subject: tty: Correct INPCK handling + +From: Peter Hurley + +commit 66528f90669691c85c73bea4f0c9f4a5857c4cab upstream. + +If INPCK is not set, input parity detection should be disabled. This means +parity errors should not be received from the tty driver, and the data +received should be treated normally. + +SUS v3, 11.2.2, General Terminal Interface - Input Modes, states: + "If INPCK is set, input parity checking shall be enabled. If INPCK is + not set, input parity checking shall be disabled, allowing output parity + generation without input parity errors. Note that whether input parity + checking is enabled or disabled is independent of whether parity detection + is enabled or disabled (see Control Modes). If parity detection is enabled + but input parity checking is disabled, the hardware to which the terminal + is connected shall recognize the parity bit, but the terminal special file + shall not check whether or not this bit is correctly set." + +Ignore parity errors reported by the tty driver when INPCK is not set, and +handle the received data normally. + +Fixes: Bugzilla #71681, 'Improvement of n_tty_receive_parity_error from n_tty.c' +Reported-by: Ivan +Signed-off-by: Peter Hurley +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/tty/n_tty.c | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +--- a/drivers/tty/n_tty.c ++++ b/drivers/tty/n_tty.c +@@ -1214,15 +1214,16 @@ static void n_tty_receive_parity_error(s + { + struct n_tty_data *ldata = tty->disc_data; + +- if (I_IGNPAR(tty)) +- return; +- if (I_PARMRK(tty)) { +- put_tty_queue('\377', ldata); +- put_tty_queue('\0', ldata); +- put_tty_queue(c, ldata); +- } else if (I_INPCK(tty)) +- put_tty_queue('\0', ldata); +- else ++ if (I_INPCK(tty)) { ++ if (I_IGNPAR(tty)) ++ return; ++ if (I_PARMRK(tty)) { ++ put_tty_queue('\377', ldata); ++ put_tty_queue('\0', ldata); ++ put_tty_queue(c, ldata); ++ } else ++ put_tty_queue('\0', ldata); ++ } else + put_tty_queue(c, ldata); + if (waitqueue_active(&tty->read_wait)) + wake_up_interruptible(&tty->read_wait); -- 2.47.3